Я работаю над концепцией кода (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, Я думал, что смогу использовать порог, чтобы, если два отрезка линии имели одну конечную точку в пределах пикселей X друг от друга, то они «привязывались» к одной и той же конечной точке (например, либо к среднему значению обеих конечных точек, либо к использованию значений конечной точки один из двух отрезков). Например, см. Черную фигуру на изображении ниже.
Для 2 я подумал, что мог бы затем «пометить», используя целое число для каждого отрезка, принадлежащего одной и той же «фигуре» (совокупности отрезков).
Есть ли лучшее решение для каждой из этих проблем?
* Примечание: мне все еще нужно обработать / перехватить все условия в моем коде, например, если линейные сегменты параллельны, если линейные сегменты пересекаются в ( a) конечная точка отрезка линии et c.
Ссылки:
1 https://en.wikipedia.org/wiki/Intersection_ (Euclidean_geometry) # Two_line_segments