Ho una freccia disegnata tra due oggetti su un Winform..NET Il mouse di accertamento è in linea tracciato tra due punti arbitrari
Quale sarebbe il modo più semplice per determinare che il mio mouse stia attualmente sorvolando o vicino a questa linea.
Ho considerato di verificare se il punto del mouse interseca un quadrato definito ed estrapolato dai due punti, tuttavia ciò sarebbe possibile solo se i due punti avessero valori x o y molto simili.
Sto pensando, inoltre, che questo problema sia probabilmente più nei regni dell'algebra lineare piuttosto che nella semplice trigonometria, e mentre ricordo gli aspetti più semplici delle matrici, questo problema va oltre la mia conoscenza dell'algebra lineare.
D'altra parte, se una libreria .NET può far fronte alla funzione, ancora meglio.
EDIT Grazie per le risposte, ci sono stati alcuni molto buoni tutti meritevoli di essere contrassegnati come risposta.
Ho scelto la risposta di Coincoin come accettata, poiché mi piace che possa essere applicata a qualsiasi forma disegnata, tuttavia ha finito per implementare l'equazione di Tim Robinson, poiché sembrava molto più efficiente con una semplice equazione piuttosto che la creazione di nuovi percorsi grafici e penne, come nel mio caso ho bisogno di farlo su MouseMove per 1-n diverse relazioni (ovviamente ci sarebbe un po 'di cache e ottimizzazioni, ma il punto rimane ancora)
Il problema principale con l'equazione era che sembrava trattare la linea è infinita, quindi ho aggiunto anche un test sui limiti.
Il codice (taglio iniziale, io probabilmente Neaten un po '), per chi fosse interessato, è al di sotto
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)
);
}
e _bounds è definito come:
_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));
ho bisogno, anche, di prendere in considerazione la soglia quando faccio il div da 0 caso speciale di controllo – johnc