Об одном подходе к другим подходам Альтернативная реальность, данная в ощущениях

Просмотры

Рубрики

Последние комментарии

Рейтинг блогов

  • Разбиение областей

    Еще одна маленькая поделочка на Java, касающаяся геометрических фигур и областей. Ранее я упоминал про подсчет площади замкнутой области. Сейчас речь пойдет о разбиении несвязной области на подобласти, содержащие один связный сегмент. Когда это может понадобиться? Например, когда одна область Area рассекается другой областью (операциями subtract или intersect), в результате чего образуются 2 независимые фигуры. Встроенными средствами просто так это отследить нельзя, нужно запускать PathIterator, что я и сделал.
    Замечу, что здесь используется метод double area(Area a) из предыдущего листинга, вычисляющий площадь. Зачем это нужно? Чтобы сэкономить малость ресурсов. Например, когда в результате рассечения образуется фигура минимальной площади, зрительно неразличимая, её можно исключить из рассмотрения (в данном примере игнорируются фигуры площадью менее 10 точек).

    Листинг под катом.

     
    	public static Vector<Area> splitShape(Area area) {
    		GeneralPath newshape = null;
    		// Start with an empty shape
    		Vector<Area> ret = new Vector<Area>();
    		boolean updated = false;
    		float[] coords = new float[6];
    		float[] pcoords = new float[2];
    		for (PathIterator i = area.getPathIterator(null); !i.isDone(); i.next()) {
    			int type = i.currentSegment(coords);
    			switch (type) {
    			case PathIterator.SEG_MOVETO:
    				newshape = new GeneralPath();
    				newshape.moveTo(coords[0], coords[1]);
    				break;
    			case PathIterator.SEG_LINETO:
    				newshape.lineTo(coords[0], coords[1]);
    				break;
    			case PathIterator.SEG_QUADTO:
    				newshape.quadTo(coords[0], coords[1], coords[2], coords[3]);
    				break;
    			case PathIterator.SEG_CUBICTO:
    				newshape.curveTo(coords[0], coords[1], coords[2], coords[3],
    						coords[4], coords[5]);
    				break;
    			case PathIterator.SEG_CLOSE:
    				newshape.closePath();
    				Area a = new Area(newshape);
    				double arsq = area(a);
    				if (arsq >= 10.0) {
    					ret.add(a);
    				} else {
    					updated = true;
    				}
     
    				if (ret.size() > 1) {
    					updated = true;
    				}
    				break;
    			}
    			pcoords[0] = coords[0];
    			pcoords[1] = coords[1];
    		}
    	}
     
    Запись создана: Понедельник, 13 октября 2008 в 14:14 и находится в рубриках Полезные вещи.

3 комментария на “Разбиение областей””

  1. Ай-ай-ай, надо что-то делать с форматированием.
    Не силён в Worpress, но ссылка может оказаться полезной:
    http://www.pixelwit.com/blog/2007/04/code-highlighting-and-formatting-in-wordpress/

  2. kewler пишет:

    Я как-то вообще не обратил внимания на листинг ) Надо поправить.
    А там просто угловые скобки для типизации боксов разрушили хтмл.

  3. kewler пишет:

    Спасибо, кстати. Поставил плагин, теперь разноцветно :)

Оставить комментарий