Tôi có một mũi tên được vẽ giữa hai đối tượng trên một Winform..NET Xác định chuột là trên đường vẽ giữa hai điểm tùy ý
Cách đơn giản nhất để xác định rằng con chuột của tôi hiện đang di chuột qua hoặc gần, dòng này.
Tôi đã xem xét kiểm tra xem điểm chuột có cắt một hình vuông được xác định và ngoại suy bởi hai điểm hay không, tuy nhiên điều này chỉ khả thi nếu hai điểm có giá trị x hoặc y rất giống nhau. Tôi nghĩ, vấn đề này có lẽ là nhiều hơn trong các đại số tuyến tính chứ không phải là lượng giác đơn giản, và trong khi tôi nhớ các khía cạnh đơn giản hơn của ma trận, vấn đề này vượt quá kiến thức về đại số tuyến tính của tôi.
Mặt khác, nếu thư viện .NET có thể đối phó với hàm, thậm chí tốt hơn.
CHỈNH SỬA Cảm ơn câu trả lời, có một số rất tốt, tất cả đều xứng đáng được gắn thẻ là đã trả lời.
Tôi đã chọn câu trả lời của Coincoin khi được chấp nhận, vì tôi thích nó có thể được áp dụng cho bất kỳ hình dạng nào, tuy nhiên đã kết thúc việc thực hiện phương trình của Tim Robinson, vì nó xuất hiện hiệu quả hơn nhiều với một phương trình đơn giản hơn là tạo mới đường dẫn đồ họa và bút, như trong trường hợp của tôi tôi cần phải làm điều đó trênMouseMove cho 1-n mối quan hệ khác nhau (rõ ràng sẽ có một số bộ nhớ đệm và tối ưu hóa, nhưng điểm vẫn còn)
Vấn đề chính với phương trình là nó xuất hiện để điều trị các dòng như vô hạn, vì vậy tôi đã thêm một thử nghiệm giới hạn là tốt.
Mã (cắt ban đầu, tôi sẽ có lẽ neaten nó một chút), cho những người quan tâm, dưới
if (Math.Sqrt(Math.Pow(_end.X - _start.X, 2) +
Math.Pow(_end.Y - _start.Y, 2)) == 0)
{
_isHovering =
new RectangleF(e.X, e.Y, 1, 1).IntersectsWith(_bounds);
}
else
{
float threshold = 10.0f;
float distance = (float)Math.Abs(
(((_end.X - _start.X) * (_start.Y - e.Y)) -
((_start.X - e.X) * (_end.Y - _start.Y)))/
Math.Sqrt(Math.Pow(_end.X - _start.X, 2) +
Math.Pow(_end.Y - _start.Y, 2)));
_isHovering = (
distance <= threshold &&
new RectangleF(e.X, e.Y, 1, 1).IntersectsWith(_bounds)
);
}
và _bounds được định nghĩa là:
_bounds = new Rectangle(
Math.Min(_start.X, _end.X),
Math.Min(_start.Y, _end.Y),
Math.Abs(_start.X - _end.X), Math.Abs(_start.Y - _end.Y));
tôi cần, cũng có thể, để đưa vào tài khoản ngưỡng khi tôi làm div bởi 0 đặc biệt trường hợp kiểm tra – johnc