查找包含Point的LineSegment

时间:2010-08-26 10:47:51

标签: wpf geometry-path

我有Path,当用户点击某个细分时,我必须将其拆分为两个细分。

我有点用户点击但我找不到获取包含该点的LineSegment的方法。

我不必找到Path元素...但是创建了LineSegment点击路径的PathGeometry段的{{1}}。

我该怎么办?

4 个答案:

答案 0 :(得分:2)

我有一些代码可以做到这一点。我的每个点都存储在Points集合中,而不是存储为LineSegments,但我认为它应该适合你。厚度参数是线的粗细。

    public int HitTestSegments(Point point, double thickness)
    {
        for (int i = 0; i < Points.Count; ++i)
        {
            Point p0 = Points[i];
            Point p1 = (i + 1 < Points.Count) ? Points[i + 1] : Points[0];
            Vector v = p1 - p0;
            Vector w = point - p0;
            double c1 = w * v;
            double c2 = v * v;
            double b = c1 / c2;
            Point pb = p0 + b * v;
            double distance = (point - pb).Length;

            if (distance < thickness)
            {
                return i;
            }
        }

        return -1;
    }

我从互联网上的各种样本一起攻击了这个,我的数学并不令人惊讶。它可能不是最好的代码 - 如果没有,请提出改进​​建议。

答案 1 :(得分:0)

但你有Point属性,所以基本上你有一个n + 1点的Collecion。点之间的线是一个简单的线性方程。你必须检查你的鼠标点是否解决了这个等式(通过所有行的集合进行交流)。

等式:0 = Ax + By + C或简称y = ax + b

有很多方法可以获取它的参数。

答案 2 :(得分:0)

从几何学我们知道,(y1 - y2)* x +(x2 - x1)* y +(x1 * y2 - x2 * y1)= 0,其中x1,y1是你的线段的第一点和x2,y2是第二个。这是该行的公式。要确定,如果给定点P(X,Y)属于该线,则必须将其坐标替换为线公式的左侧,右侧的结果应为0或0 + - \ epsilon。

但你没有一条线,你有它的段,所以你必须添加更多的检查,例如,Px不应该小于x1,不能超过x2等。

答案 3 :(得分:0)

扩展Shaman&amp;卢卡斯说过 - 你真正想做的是找到离点击点最近的线段(由于不能指望用户完全点击该线)

要做到这一点,请遍历每个线段并将`(y1 - y2)* x +(x2 - x1)* y +(x1 * y2 - x2 * y1)'公式应用于它并删除答案的标志 - 产生最小结果的线段是最靠近点击点的那个。

如果您的路径中有很多段,这可能需要很长时间才能执行,因此可能需要进行一些优化 - 但正如他们所说,这是一个全新的故事。