Tengo una flecha dibujada entre dos objetos en un formulario de Win..NET Determinación del mouse está en línea dibujado entre dos puntos arbitrarios
¿Cuál sería la forma más sencilla de determinar que mi mouse se encuentra actualmente sobre esta línea o cerca de ella?
He considerado probar si el punto del ratón se cruza con un cuadrado definido y extrapolado por los dos puntos, sin embargo, esto solo sería factible si los dos puntos tienen valores x o y muy similares.
Estoy pensando, también, que este problema probablemente esté más en el dominio del álgebra lineal que en la trigonometría simple, y si bien recuerdo los aspectos más simples de las matrices, este problema escapa a mi conocimiento del álgebra lineal.
Por otro lado, si una biblioteca .NET puede hacer frente a la función, incluso mejor.
EDIT Gracias por las respuestas, hubo algunos muy buenos que merecen ser etiquetados como respondidos.
Elegí la respuesta de Coincoin como aceptada, ya que me gusta que podría aplicarse a cualquier forma dibujada, sin embargo terminé implementando la ecuación de Tim Robinson, ya que parecía mucho más eficiente con una ecuación simple en lugar de nuevas rutas de gráficos y bolígrafos, como en mi caso, necesito hacerlo en MooMove para relaciones 1-n diferentes (obviamente, habría almacenamiento en caché y optimizaciones, pero el punto aún persiste)
El problema principal con la ecuación era que parecía tratar la línea es infinita, así que agregué una prueba de límites también.
El código (corte inicial, probablemente Neaten un poco), para los interesados, está por debajo
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)
);
}
y _bounds se define como:
_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));
que necesito, también, tener en cuenta el umbral cuando lo haga el div por 0 caso especial de verificación Comprobar – johnc