Search code examples
wpfgeometry-path

Find LineSegment that contains a Point


I have a Path and when user click on a segment I have to split it into two segments.

I have the point where user click but I can't find a method to get the LineSegment that contains that point.

I don't have to find the Path element... but the LineSegment of a collection of Segment that create the PathGeometry of the Path clicked.

How can i do?


Solution

  • I have some code that does this. Each of my points are stored in a Points collection rather than being stored as LineSegments, but it should work for you I think. The thickness parameter is the thickness of the line.

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

    I hacked this together from various samples on the internet, and my maths isn't amazing. It may not be the best code - if not, please suggest improvements.