我有Path
,当用户点击某个细分时,我必须将其拆分为两个细分。
我有点用户点击但我找不到获取包含该点的LineSegment
的方法。
我不必找到Path
元素...但是创建了LineSegment
点击路径的PathGeometry
段的{{1}}。
我该怎么办?
答案 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)'公式应用于它并删除答案的标志 - 产生最小结果的线段是最靠近点击点的那个。
如果您的路径中有很多段,这可能需要很长时间才能执行,因此可能需要进行一些优化 - 但正如他们所说,这是一个全新的故事。