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