calcular el punto en la línea que está más cerca de ese punto .
Suponiendo que el segmento de línea es a y b, y el punto es p.
float vAPx = p.x - a.x;
float vAPy = p.y - a.y;
float vABx = b.x - a.x;
float vABy = b.y - a.y;
float sqDistanceAB = a.distanceSq(b);
float ABAPproduct = vABx*vAPx + vABy*vAPy;
float amount = ABAPproduct/sqDistanceAB;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;
que le da 'cantidad', lo lejos a través del segmento de línea que está entre A y B (debidamente delimitada).
float nx = (amount * (b.x - a.x)) + a.x;
float ny = (amount * (b.y - a.y)) + a.y;
Gives you point (nx, ny).
if (p.distance(nx,ny) > threshold) reject;
Esto funcionará adecuadamente más allá del final del segmento de línea, ya que mantiene 'cantidad' entre 0 y 1.
Si no desea que un segmento de línea acotada librarse de los límites por cantidad. El resto del código seguirá funcionando, calculando las posiciones más allá y antes de A y más allá de B.
Hubo otra pregunta que afirmaba que esta pregunta era un duplicado pero, está pidiendo algo diferente, por lo tanto, mi solución resuelve la posición del punto y luego resuelve la distancia euclidiana (que en realidad resuelve ambas preguntas).
a.distanceSq (b) también se puede hacer como vABx vABx + vABy vABy, ya que ya lo hemos hecho.
Nota: Si se trata de segmentos de línea (es decir, líneas infinitamente largas), esto podría arrojar resultados erróneos: el punto podría estar lejos de los puntos finales del segmento y, sin embargo, tener una distancia normal pequeña ... – MartinStettner
También tenga en cuenta que si va a dar la vuelta y comparar d a D, será más eficiente comparar | (x2 - x1) x (x1 - x0) |^2 a D^2 | x2 - x1 |^2, guardando dos raíces cuadradas y una división a costa de una multiplicación . – Dave
Gracias Sr. Alan ¡Pero el enlace no funciona !. Probé la ecuación que pones antes, pero esto me da la distancia entre el nuevo punto y el primer punto de la línea, no la línea del agujero. Perdóneme por mi mal idioma. Sincerly, Wahid –