Java: использование отрезков для определения двухмерной фигуры и исключения пробелов - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над концепцией кода (Java), в которой пользователь нажимает на точки, чтобы указать точки на схеме простой 2-мерной структуры.

Мой план состоял в том, чтобы составить форму из нескольких отрезков. Затем мне нужно будет рассчитать расстояние (перекрытие / векторную величину) между этой обрисованной в общих чертах «формой» (набор отрезков линий) и другим одиночным отрезком линии (то есть лучом), например, см. Изображение ниже. Я подумал, что мог бы интенсивно использовать пересечение отрезков * и написал Java код:

    /// calculate intersection of line segments
    double p0X = 1; // line segment 1
    double p0Y = 1;
    double p1X = 3;
    double p1Y = 2;

    double p2X = 1; // line segment 2
    double p2Y = 4;
    double p3X = 2;
    double p3Y = -1;

    double s1X = p1X - p0X;
    double s1Y = p1Y - p0Y;
    double s2X = p3X - p2X;
    double s2Y = p3Y - p2Y;

    double s0 = (-s1Y*(p0X-p2X)+s1X*(p0Y-p2Y)) / (-s2X*s1Y+s1X*s2Y);
    double t0 = (s2X*(p0Y-p2Y)+s1Y*(p0X-p2X)) / (-s2X*s1Y+s1X*s2Y);

    if ((s0 >= 0) && (s0<= 1) && (t0 >= 0) && (t0 <= 1))
        {   
            double xI = p0X + (t0 * s1X);
            double yI = p0Y + (t0 * s1Y);
            System.out.println("The line segments intersect at " + xI + ", " + yI);
        }
    else
        {
            System.out.println("The line segments don't intersect");
        }

Моя проблема:

  1. Что делать с отчетливым конечные точки, чтобы не было промежутков между отрезками на контуре фигуры? (Из-за несовершенного размещения точек пользователем)

  2. Как определить, что сегменты линий алгоритма принадлежат одной и той же форме.

Для 1, Я думал, что смогу использовать порог, чтобы, если два отрезка линии имели одну конечную точку в пределах пикселей X друг от друга, то они «привязывались» к одной и той же конечной точке (например, либо к среднему значению обеих конечных точек, либо к использованию значений конечной точки один из двух отрезков). Например, см. Черную фигуру на изображении ниже.

Для 2 я подумал, что мог бы затем «пометить», используя целое число для каждого отрезка, принадлежащего одной и той же «фигуре» (совокупности отрезков).

Есть ли лучшее решение для каждой из этих проблем?

* Примечание: мне все еще нужно обработать / перехватить все условия в моем коде, например, если линейные сегменты параллельны, если линейные сегменты пересекаются в ( a) конечная точка отрезка линии et c.

enter image description here

Ссылки:

1 https://en.wikipedia.org/wiki/Intersection_ (Euclidean_geometry) # Two_line_segments

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...