-
Разбиение областей
Еще одна маленькая поделочка на 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 комментария на “Разбиение областей””
-
Ай-ай-ай, надо что-то делать с форматированием.
Не силён в Worpress, но ссылка может оказаться полезной:
-
Я как-то вообще не обратил внимания на листинг ) Надо поправить.
А там просто угловые скобки для типизации боксов разрушили хтмл. -
Спасибо, кстати. Поставил плагин, теперь разноцветно



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