0

我有一个Path,当用户单击一个段时,我必须将其分成两个段。

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

我不必找到Path元素...但是创建所单击路径LineSegment的 Segment 集合的。PathGeometry

我能怎么做?

4

4 回答 4

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;
    }

我从互联网上的各种样本中破解了这个,我的数学并不惊人。它可能不是最好的代码 - 如果不是,请提出改进​​建议。

于 2010-08-26T11:38:49.917 回答
0

扩展萨满和卢卡斯所说的 - 你真正想做的是找到最接近点击点的线段(因为不能期望用户准确地点击在线)

为此,遍历每个线段并对其应用 `(y1 - y2) * x + (x2 - x1) * y + (x1*y2 - x2*y1)' 公式并删除符号答案 - 产生最小结果的线段是最接近点击点的线段。

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

于 2010-08-26T11:31:28.700 回答
0

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

等式: 0 = Ax + By + C 或简单地说 y = ax + b

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

于 2010-08-26T11:18:11.557 回答
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,等等。

于 2010-08-26T11:19:22.880 回答