我正在研究一个代码概念(Java),其中用户将单击点以指示简单二维结构轮廓上的点。
我的计划是组成多个线段的形状。然后我需要计算这个轮廓的“形状”(线段的集合)和另一个单线段(即一条射线)之间的距离(重叠/矢量幅度),例如见下图。我以为我可以大量使用线段交点*并编写了以下 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 形状)线段端点处相交等。
参考:
1 https://en.wikipedia.org/wiki/Intersection_(Euclidean_geometry)#Two_line_segments