language agnostic - from - Encontrar puntos en una línea con una distancia dada
distance from point to line problems (4)
Llamemos al punto que está tratando de encontrar P, con coordenadas px, py, y sus coordenadas del punto de inicio A, ax y ay. La pendiente m es solo la relación del cambio en Y sobre el cambio en X, por lo que si su punto P es la distancia s desde A, entonces sus coordenadas son px = ax + s, y py = ay + m * s. Ahora usando Pythagoras, la distancia d de A a P será d = sqrt (s * s + (m * s) * (m * s)). Para hacer que P sea una unidad D específica lejos de A, encuentre s como D = D / sqrt (1 + m * m).
Tengo una pregunta, conozco una línea, solo conozco su pendiente (m) y un punto A (x, y) ¿Cómo puedo calcular los puntos (en realidad dos de ellos) en esta línea con una distancia (d) desde el punto? UNA ??? Estoy pidiendo esto para encontrar la intensidad de los píxeles en una línea que pasa a través de A (x, y) con una distancia. La distancia en este caso será el número de píxeles.
Pensé que esta era una solución asombrosa y fácil de entender:
http://www.physicsforums.com/showpost.php?s=f04d131386fbd83b7b5df27f8da84fa1&p=2822353&postcount=4
Yo sugeriría convertir la línea a un formato paramétrico en lugar de punto-pendiente. Es decir, una función paramétrica para la línea devuelve puntos a lo largo de esa línea para el valor de algún parámetro t. Puede representar la línea como un punto de referencia y un vector que representa la dirección de la línea que pasa por ese punto. De esa manera, simplemente viajas d unidades hacia adelante y hacia atrás desde el punto A para obtener tus otros puntos.
Como su línea tiene una pendiente m, su vector de dirección es <1, m>. Ya que mueve m píxeles en y por cada 1 píxel en x. Desea normalizar que el vector de dirección sea una unidad de longitud para que se divida por la magnitud del vector.
magnitude = (1^2 + m^2)^(1/2) N = <1, m> / magnitude = <1 / magnitude, m / magnitude>
El vector de dirección normalizado es N. Ahora que casi has terminado. Solo necesita escribir la ecuación para su línea en formato parametrizado:
f(t) = A + t*N
Esto usa matemática vectorial . Específicamente, la multiplicación de vectores escalares (de su parámetro t y el vector N) y la suma de vectores (de A yt * N). El resultado de la función f es un punto a lo largo de la línea. Los 2 puntos que estás buscando son f (d) y f (-d). Implemente eso en el idioma de su elección.
La ventaja de usar este método, a diferencia de todas las otras respuestas hasta ahora, es que puede extender este método fácilmente para apoyar una línea con pendiente "infinita". Es decir, una línea vertical como x = 3. Realmente no necesita la pendiente, todo lo que necesita es el vector de dirección normalizado. Para una línea vertical, es <0, 1>. Esta es la razón por la que las operaciones gráficas suelen usar matemática vectorial, porque los cálculos son más directos y menos propensos a las singularidades. Puede parecer un poco complicado al principio, pero una vez que te familiarizas con las operaciones vectoriales, muchas tareas de gráficos de computadora se vuelven mucho más fáciles.
Déjame explicarte la respuesta de una manera sencilla .
Punto de inicio - (x0, y0)
Punto final - (x1, y1)
Necesitamos encontrar un punto (xt, yt)
a una distancia dt desde el punto inicial hasta el punto final.
La distancia entre el punto de inicio y final está dada por d = sqrt((x1 - x0)^2 + (y1 - y0)^2)
Deje la relación de distancias, t = dt / d
Luego el punto (xt, yt) = (((1 - t) * x0 + t * x1), ((1 - t) * y0 + t * y1))
Cuando 0 < t < 1
, el punto está en la línea.
Cuando t < 0
, el punto está fuera de la línea cercana a (x0, y0)
.
Cuando t > 1
, el punto está fuera de la línea cercana a (x1, y1)
.