0

我正在研究一个代码概念(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. 如何处理不同的端点,以便形状轮廓上的线段之间没有间隙?(由于用户放点不完善)

  2. 如何告诉算法线段属于同一形状。

对于 1,我认为我可以使用一个阈值,这样如果两条线段的一个端点在彼此的 X 像素内,那么它们会“捕捉”到同一个端点(例如,两个端点的平均值或使用端点两条线段之一的点值)。例如,请参见下图中的黑色形状。

对于 2,我认为我可以使用整数“标记”每个属于相同“形状”(线段集合)的线段。

对于这些问题有没有更好的解决方案?

*注意:我仍然需要处理/捕获代码中的所有条件,例如线段是否平行,线段是否在(a 形状)线段端点处相交等。

在此处输入图像描述

参考:

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

4

0 回答 0