Browse Source

Check transform invert and bounds test for LineNode hitTest

pull/6747/head
GMIKE 4 years ago
parent
commit
0a0bba8de4
  1. 18
      src/Avalonia.Visuals/Rendering/SceneGraph/LineNode.cs

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

@ -83,6 +83,20 @@ namespace Avalonia.Rendering.SceneGraph
public override bool HitTest(Point p)
{
if (!Transform.HasInverse)
return false;
p *= Transform.Invert();
var halfThickness = Pen.Thickness / 2;
var minX = Math.Min(P1.X, P2.X) - halfThickness;
var maxX = Math.Max(P1.X, P2.X) + halfThickness;
var minY = Math.Min(P1.Y, P2.Y) - halfThickness;
var maxY = Math.Max(P1.Y, P2.Y) + halfThickness;
if (p.X < minX || p.X > maxX || p.Y < minY || p.Y > maxY)
return false;
var a = P1;
var b = P2;
@ -100,7 +114,7 @@ namespace Avalonia.Rendering.SceneGraph
var dot2 = Vector.Dot(a - b, bp);
if (dot2 < 0)
return bp.Length <= Pen.Thickness / 2;
return bp.Length <= halfThickness;
var bXaX = b.X - a.X;
var bYaY = b.Y - a.Y;
@ -108,7 +122,7 @@ namespace Avalonia.Rendering.SceneGraph
var distance = (bXaX * (p.Y - a.Y) - bYaY * (p.X - a.X)) /
(Math.Sqrt(bXaX * bXaX + bYaY * bYaY));
return Math.Abs(distance) <= Pen.Thickness / 2;
return Math.Abs(distance) <= halfThickness;
}
}
}

Loading…
Cancel
Save