2009-08-09 21 views
18

Tengo una pregunta Conozco una línea Sé su pendiente (m) y un punto en ella 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 A? Estoy pidiendo esto para encontrar intensidad de píxeles en una línea que pasa por A (x, y) con una distancia. La distancia en este caso será el número de píxeles.Encontrar puntos en una línea con una distancia dada

Respuesta

15

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 punto de referencia y un vector que representa la dirección de la línea que atraviesa ese punto. De esa forma, solo debes mover 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>. Dado que mueve m píxeles en y por cada 1 píxel en x. Desea normalizar ese vector de dirección para que sea la longitud de la unidad, por lo que se divide 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 ha terminado. Sólo tiene que escribir la ecuación para la línea en formato parametrizado:

 
    f(t) = A + t*N 

Este utiliza vector math. Específicamente, scalar vector multiplication (de su parámetro ty el vector N) y vector addition (de A y t * N). El resultado de la función f es un punto a lo largo de la línea. Los 2 puntos que está buscando son f (d) y f (-d). Implementa eso en el idioma que elijas.

La ventaja de utilizar este método, a diferencia de todas las otras respuestas hasta ahora, es que puede extender fácilmente este método para admitir 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 cual las operaciones gráficas a menudo usan matemáticas vectoriales 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 acostumbras a las operaciones vectoriales, muchas tareas de gráficos por computadora se vuelven mucho más fáciles.

+0

gracias por la ayuda que funciona – Emre

+0

@ALevy Usted introduce una variable, 'A', pero no veo cómo se define 'A'. Qué es un'? –

+0

@TomAuger Presenté A en el párrafo introductorio de esta respuesta. A es un punto en la línea. No importa en qué punto. Cualquier punto que esté en la línea servirá. –

0

Llamemos al punto que está tratando de encontrar P, con las coordenadas px, py, y las coordenadas A de su punto de inicio ax y ay. La pendiente m es simplemente la relación del cambio en Y sobre el cambio en X, de modo 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 Pitágoras, la distancia d de A a P será d = sqrt (s * s + (m * s) * (m * s)). Para hacer que P sea unidades D específicas alejadas de A, encuentre s como s = D/sqrt (1 + m * m).

2

Let me explain the answer in a simple way.

punto de inicio - (x0, y0)

Punto final - (x1, y1)

tenemos que encontrar un punto en una (xt, yt) dt distancia desde el punto de partida hacia el punto final.

Point on a line at a distance

La distancia entre el punto inicial y final viene dado por d = sqrt((x1 - x0)^2 + (y1 - y0)^2)

Deje que la relación de las distancias, t = dt/d

Entonces 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 cerca de (x0, y0).

Cuando t > 1, el punto está fuera de la línea cerca de (x1, y1).

Cuestiones relacionadas