Browse Source

LineNode hit test

pull/6746/head
GMIKE 5 years ago
parent
commit
fd34b52bba
  1. 31
      src/Avalonia.Visuals/Rendering/SceneGraph/LineNode.cs

31
src/Avalonia.Visuals/Rendering/SceneGraph/LineNode.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Avalonia.Media;
using Avalonia.Media.Immutable;
using Avalonia.Platform;
@ -82,8 +83,32 @@ namespace Avalonia.Rendering.SceneGraph
public override bool HitTest(Point p)
{
// TODO: Implement line hit testing.
return false;
var a = P1;
var b = P2;
//If dot1 or dot2 is negative, then the angle between the perpendicular and the segment is obtuse.
//The distance from a point to a straight line is defined as the
//length of the vector formed by the point and the closest point of the segment
Vector ap = p - a;
var dot1 = Vector.Dot(b - a, ap);
if (dot1 < 0)
return ap.Length <= Pen.Thickness/2;
Vector bp = p - b;
var dot2 = Vector.Dot(a - b, bp);
if(dot2 < 0)
return bp.Length <= Pen.Thickness/2;
var bXaX = b.X - a.X;
var bYaY = b.Y - a.Y;
var distance = (bXaX * (p.Y - a.Y) - bYaY * (p.X - a.X)) /
(Math.Sqrt(Math.Pow(bXaX, 2) + Math.Pow(bYaY, 2)));
return Math.Abs(distance) <= Pen.Thickness/2;
}
}
}

Loading…
Cancel
Save