2011-09-19 14 views
13

Lo ideal es proporcionar una secuencia de puntos y dibujar una línea en ángulo recto en cada punto (comenzando en el segundo punto).Dados 2 puntos, ¿cómo dibujo una línea en ángulo recto con respecto a la línea formada por los dos puntos?

La dirección de cada línea se alternaría, por lo que si dibujara una curva de 6 puntos, se dibujaría una línea de una lenth dada para cada punto comenzando con el segundo punto, es decir, 5 líneas adicionales en lados alternos de la curva, un poco como una oruga con patas alternas.

(Entiendo que las líneas no estarán completamente en ángulo recto con respecto a la curva sino en ángulo recto con la línea formada por dos puntos cualesquiera en la curva).

+0

con que biblioteca dibujará? – Bas

+0

Estoy trabajando en Silverlight y utilizando el InkPresenter, así que es solo un caso de función de puntos, creo. – descf

+0

http://stackoverflow.com/q/1243614/183120 tiene una solución similar a la de Andreas (http://stackoverflow.com/a/7470098/183120) – legends2k

Respuesta

30

Es una pregunta de vector mathematics. Puede calcular el vector de dirección entre dos puntos A y B restando B de A. En 2D y solo en 2D, el vector en ángulo recto con este vector puede obtenerse invirtiendo los componentes xey y tomando un componente negativo. Si niegas el nuevo componente x darás un giro a la izquierda negando y harás un giro a la derecha. A continuación, puede reducir el vector de dirección al tamaño de la unidad (= de longitud 1) dividiendo cada componente por la longitud del vector (sqrt (x x + y y)). Finalmente, puede estirar el vector unitario de nuevo según la longitud deseada y tener uno del tamaño que desee. Si agrega este vector a A o B, obtendrá un punto al que desea dibujar su línea.

Aquí hay un poco de ayuda de matemáticas:

Estos son los puntos A y B expresaron como vector.

El vector de dirección se calcula mediante una simple resta.

El vector normal se da por voltear el vector de dirección, es decir para revertir los componentes y hacer que un componente negativo. nl = normal, volteado hacia la izquierda, nr = normal, volteado hacia la derecha

el vector unitario del vector normal se da dividiendo cada componente por la longitud del vector.

calcula la longitud de un vector

Si desea dibujar una línea de B a la izquierda (viniendo de A) se calcula el punto P trazar la línea a lo

Así que desea alternar esa vez que dibuja hacia la izquierda y una vez hacia la derecha al iterar sobre los puntos.

Si tiene puntos fuera de su lienzo, entonces su longitud es probablemente demasiado grande. Por supuesto, puede calcular el punto en el que el vector a P cruzaría el límite calculando el punto de intersección del vector BP y el borde.

+1

No puedo pasar la primera oración. Si restar B de A I probablemente terminará con un punto fuera del lienzo. – descf

+0

He editado mi respuesta, espero que sea más comprensible. De todos modos, el cálculo no se detiene después de la primera oración, debe leer toda la respuesta. Como dije, reduces el tamaño del vector a la distancia de la unidad y lo escalas de nuevo según tu longitud deseada. Si eso se encuentra más allá del lienzo, su longitud es demasiado grande o su lienzo demasiado pequeño. – Andreas

+0

Me he impresionado bastante al ser capaz de seguir las matemáticas, excepto por la línea que comienza rno = – descf

Cuestiones relacionadas