Добавление точки в полигон

Я создал класс, расширяющий класс awt.Polygon. Я пытаюсь написать метод, который с учетом PathIterator многоугольника и точки, представляющей вершину, добавляет точку в соответствующее место на пути.

Например: многоугольник, точки которого равны (0,0) (0,10) (10,10) (10,0) (квадрат), учитывая, что точка (1,5) составит многоугольник (0,0) (1,5) (0,10) (10,10) (10,0)

заранее спасибо


person Valchris    schedule 04.05.2011    source источник
comment
Как вы определяете подходящее место в пути?   -  person Jeffrey    schedule 04.05.2011


Ответы (2)


Расширяя идею @normalocity, это кажется возможным подходом.

Приложение. Для справки: в этом подходе используются только общедоступные API, но возможны и другие варианты.

Приставка:

MoveTo: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [0.0, 10.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [10.0, 10.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [10.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Close:  [10.0, 0.0, 0.0, 0.0, 0.0, 0.0]

MoveTo: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [1.0, 5.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [0.0, 10.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [10.0, 10.0, 0.0, 0.0, 0.0, 0.0]
LineTo: [10.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Close:  [10.0, 0.0, 0.0, 0.0, 0.0, 0.0]

Код:

import java.awt.Point;
import java.awt.Polygon;
import java.awt.geom.PathIterator;
import java.util.Arrays;

/** @see http://stackoverflow.com/questions/5877646 */
public class MyPoly extends Polygon {

    public static void main(String[] args) {
        final MyPoly square = new MyPoly();
        square.addPoint(0, 0);
        square.addPoint(0, 10);
        square.addPoint(10, 10);
        square.addPoint(10, 0);
        System.out.println(square.toString());
        MyPoly pentagon = square.insert(1, new Point(1, 5));
        System.out.println(pentagon.toString());
    }

    /**
     * Insert a point at the specified index
     *  
     * @param index at which to insert the new point
     * @param point the <code>Point</code> to insert
     * @return a new <code>Polygon</code> with the new <code>Point</code> 
     */
    public MyPoly insert(int index, Point point) {
        MyPoly mp = new MyPoly();
        PathIterator pi = this.getPathIterator(null);
        double[] coords = new double[6];
        int i = 0;
        while (!pi.isDone()) {
            if (i == index) {
                mp.addPoint(point.x, point.y);
            } else {
                if (pi.currentSegment(coords) != PathIterator.SEG_CLOSE) {
                    mp.addPoint((int) coords[0], (int) coords[1]);
                }
                pi.next();
            }
            i++;
        }
        return mp;
    }

    @Override
    public String toString() {
        PathIterator pi = this.getPathIterator(null);
        double[] coords = new double[6];
        StringBuilder sb = new StringBuilder();
        while (!pi.isDone()) {
            int kind = pi.currentSegment(coords);
            switch (kind) {
                case PathIterator.SEG_MOVETO:
                    sb.append("MoveTo: ");
                    break;
                case PathIterator.SEG_LINETO:
                    sb.append("LineTo: ");
                    break;
                case PathIterator.SEG_CLOSE:
                    sb.append("Close:  ");
                    break;
                default:
                    throw new IllegalArgumentException("Bad path segment");
            }
            sb.append(Arrays.toString(coords));
            sb.append("\n");
            pi.next();
        }
        return sb.toString();
    }
}
person trashgod    schedule 04.05.2011
comment
хотя кажется, что это сработает, кажется, что просто вставить точку в два массива очень много работы. Я бы просто взял массив xpoints и ypoints и воссоздал их с добавлением новой точки, используя несколько простых вызовов System.arraycopy. - person MeBigFatGuy; 04.05.2011
comment
@MeBigFatGuy: Звучит как еще один ответ для меня! :-) Если вы продолжите этот путь, мне было бы любопытно, можно ли это сделать без обращения к PathIterator. - person trashgod; 04.05.2011
comment
Это предполагает, что вы знаете, что точка должна быть вставлена ​​в 1. Что, если это неизвестно? он должен изменить ближайшую строку. Пример: пользователь хочет добавить точку над квадратом в середине значения x. (Выглядит как действительно простой дом) - person Valchris; 04.05.2011
comment
index является параметром insert(). - person trashgod; 04.05.2011

Попробуйте использовать метод «addPoint(x, y)», за исключением того, что напишите свою собственную версию (или переопределите ее), чтобы она позволяла указать, где точка вставляется в серию точек (например, первая, вторая, третья и т. д.). .

Итак, напишите класс, который наследуется от java.awt.Polygon public class InsertablePolygon extends java.awt.Polygon, и определите для него метод, например, public void insertPoint(int index, Point additionalPoint).

Внутри метода AdditionalPoint у вас должен быть прямой доступ к массивам int[] xpoints и int[] ypoints, в которых хранится информация. Просто измените эти массивы (или скопируйте их, вставьте свою точку, а затем замените их), и все будет хорошо.

person jefflunt    schedule 04.05.2011
comment
Вот и прошу помощи. Прошло несколько часов, и наше решение содержит серьезные ошибки. - person Valchris; 04.05.2011
comment
Я обновил свой ответ. Также см. комментарий MeBigFatGuy к ответу TrashGod, в котором говорится об операциях копирования массива и т. д. - person jefflunt; 04.05.2011
comment
Я думаю, что это разумный путь, но меня по-прежнему беспокоит необходимость обновления других внутренних состояний, таких как bounds и npoints. Я также не уверен, как учитывать типы сегментов PathIterator, кроме как с помощью общедоступного API. +1, кстати. - person trashgod; 05.05.2011