Dibujo de una flecha en un escenario 2D

Necesitaría obtener una fórmula para dibujar una flecha en un escenario en 2 dimensiones, donde el punto de referencia base (0,0) se encuentra en la esquina superior izquierda del mismo. Mis conocimientos de matemáticas o geometría avanzadas no son muy alegres, por lo que necesitaría que alguien me echara una mano.

El objetivo sería proporcionar los datos...

AX -> Coordenada X del punto A
AY -> Coordenada Y del punto A
BX -> Coordenada X del punto B
BY -> Coordenada Y del punto B
G -> Grosor de la linea (en puntos)
PA -> Ancho del triángulo (en puntos)
PL -> Largo del triángulo (en puntos)

... Y mediante una formula obtener...

A1X -> Coordenada X del punto A1
A1Y -> Coordenada Y del punto A1
A2X -> Coordenada X del punto A2
A2Y -> Coordenada Y del punto A2
B10X -> Coordenada X del punto B10
B10Y -> Coordenada Y del punto B10
B11X -> Coordenada X del punto B11
B11Y -> Coordenada Y del punto B11
B20X -> Coordenada X del punto B20
B20Y -> Coordenada Y del punto B20
B21X -> Coordenada X del punto B21
B21Y -> Coordenada Y del punto B21

1 Respuesta

Respuesta
1

·

Si vas a dar las coordenadas referidas a la esquina superior izquierda con sentido positivo yendo hacia la derecha y hacia abajo no sería necesario que dieses las coordenadas de A o el grosor G, ambas van ligadas y si das las dos lo único que puede suceder es que no sean acordes entre sí

Si tenemos G las coordenadas de A deben ser

$$\begin{align}&\left(\frac{G \sqrt 2}{4}, \frac{G \sqrt 2}{4}  \right)\approx(0.35355339G, 0.35355339G)\end{align}$$

Mientras que si das las coordenadas de A deberán ser iguales

AX=AY

y el valor de G será

$$\begin{align}&G=2 \sqrt 2·AX\end{align}$$

Luego para que no haya problemas yo elegiría cual de los dos datos se da.  A no ser que el ángulo de la flecha pueda ser distinto de 45º, en cuyo caso ya pasa a ser un problema mucho más complicado.

El objetivo es que un programa de distribución gratuita dibuje la flecha, siendo el usuario el que especifique los puntos A y B utilizando el ratón (estos 2 puntos podrían estar en cualquier lugar del escenario, con lo que la flecha podría estar orientada hacia cualquier lugar). El usuario también indicaría (en numero de puntos) el grosor G, la longitud de PA y longitud de PL a través de una entrada de datos de un cuadro de edición. Los ángulos siempre serían de 45º. La distancia de A hasta A1 y A2 siempre seria la mitad de G. Espero haberme explicado mejor esta vez.

Gracias.

Salu2. 

Perdon, quería decir que los ángulos situados en B11 y B21 siempre serian rectos (90º)... Los ángulos situados en B, B10 y B20 podrían variar dependiendo de la longitud de PA y PL... aunque no necesito conocerlos para dibujar la flecha, tan solo necesito conocer los puntos desde donde trazar las líneas.

Salu2.

Espero sepas algo de vectores en el plano euclídeo porque cualquier otra forma de resolverlo va a ser muy liosa. Y sabrás que los vectores se escriben como coordenadas

u=(ux, uy)

lo mismo que los puntos

A=(Ax, Ay)

y que se suman componente a componente

A+u = (Ax+ux, Ay+uy)

u+v = (ux+vx, uy+vy)

Y que hay otra operación que es multiplicar por un escalar

ku = (k·ux, k·uy)

Entonces los datos que nos dan son:

$$\begin{align}&A=(A_x, A_y)\\&B=(B_x,B_y)\\&G\\&\text{y para ponerlos con una sola letra usaré}\\&b=PA  \quad \text{(b viene de base del triángulo)}\\&h=PL  \quad \text{(h viene de altura del triángulo)}\\&\\&\text{El vector que va de A a B es}\\&\\&\vec{V_{AB}}=(B_x-A_x,\;B_y-A_y)\\&\\&\text{Y el vector unitario en esa dirección es}\\&\\&\vec u=\left(\frac{B_x-A_x}{\sqrt{(B_x-A_x)^2+(B_y-A_y)^2}},\; \frac{B_y-A_y}{\sqrt{(B_x-A_x)^2+(B_y-A_y)^2}} \right)\\&\\&\text{y el perpendicular tiene intercambiadas las componentes}\\&\text{y una de ellas con el signo opuesto}\\&\\&\vec v=(u_y, -u_x)\\&\\&\text{Con todo esto los puntos serán}\\&\\&A_1= A+\frac G2\vec v\\&\\&A_2=A-\frac G2\vec v\\&\\&B_{11}=B-h\,\vec u+\frac G2\vec v\\&\\&B_{21}=B-h\,\vec u-\frac G2\vec v\\&\\&B_{10}=B-h\,\vec u+\frac b2\vec v\\&\\&B_{20}=B-h\,\vec u+\frac b2\vec v\\&\\&\end{align}$$

Recuerda que son todo operaciones vectoriales cada una se hará para la componente x y la componente y.

·

Espero que con esto puedas hacerlo ya que es la mejor forma y si la entiendes podrás aplicarla a otras situaciones fácilmente. Si no lo entiendes podríamos hacer las cuentas con un ejemplo concreto. Y si ya está bien, no olvides puntuar.

Perdón en el B20 se me olvidó cambiar el signo, le di al copiar y pegar y no lo mdifiqué

$$\begin{align}&B_{20}=B-h\,\vec u-\frac b2\vec v\end{align}$$

Mis conocimientos sobre el tema son bastante pobres. Deja que haga pruebas sobre los datos que me has dado antes de cerrar la pregunta.

Gracias por tu tiempo.

Salu2.

Bueno, me esta siendo complicado trasladar las formular a un lenguaje de programación. ¿Seria demasiado pedir ver un ejemplo práctico, con los siguientes valores?:
A=(100,150)
B=(300,350)
G=20
b=50
h=60

Gracias.
Salu2.

Calculamos el vector AB

VAB = B-A = (300, 350) - (100, 150) = (300-100, 350-150) = (200, 200)

Lo he hecho de modo que sirva aunque no forme 45º la recta AB y quedaría más claro si fueran componentes distintas

Calculamos el que había llamado u

$$\begin{align}&\vec u=\left(\frac{200}{\sqrt{200^2+200^2}}, \frac{200}{\sqrt{200^2+200^2}} \right)=\\&\\&(0.70710678, \; 0.70710678)\\&\\&\text{calculamos v, recuerda que las componentes}\\&\text{se intercambian aunque aquí no se notará}\\&\\&\vec v =(0.70710678, \; -0.70710678)\\&\\&A_1=A+\frac G2\vec v=\\&\\&(100,\;150)+\frac{20}{2}(0.70710678, \; -0.70710678)=\\&\\&(100,\;150)+(7.0710678, \; -7.0710678)=\\&\\&(100+7.0710678,\;150-7.0710678) =\\&\\&(107.0710678,\;142.9289322)\\&\\&\\&A_2=A-\frac G2\vec v=\\&(100,\;150)-\frac{20}{2}(0.70710678, \; -0.70710678)=\\&\\&=...=(92.9289322, \;157.070710678)\\&\\&\\&B_{11}=B-h\vec u+\frac G2 \vec v\\&\\&\text {calculamos primero } B-h\vec u\\&\text{ya que se usará en 4 sitios}\\&\\&B-h\vec u=(300,\;350)-60(0.70710678, \; 0.70710678)=\\&\\&(300, \;350)-(42.4264068,\;42.4264068)=\\&\\&(257.5735932,\;307.5735932)\\&\\&\text{Ahora se le suma y resta }\frac G2\vec v\\&\text{que ya se have habia calculado antes}\\&\\&B_{11}=(257.5735932,\;307.5735932)+(7.0710678, \; -7.0710678)=\\&\\&(264.644661,\;300.5025254)\\&\\&B_{21}=(257.5735932,\;307.5735932)-(7.0710678, \; -7.0710678)=\\&\\&(250.5025254,\;314.644661)\\&\\&Para\;B_{10}\; y\; B_{20}\text{ calculamos }\frac b2\vec v\\&\\&\frac b2 \vec v=\frac{50}{2}(0.70710678, \; -0.70710678)=\\&\\&(17.67776695,-17.67776695)\\&\\&\text{y lo sumamos y restamos a }B-h\vec u\\&\\&A_{10}=(257.5735932,\;307.5735932)+(17.67776695,-17.67776695)=\\&\\&(275.2513602,\;289.8958263)\\&\\&A_{10}=(257.5735932,\;307.5735932)-(17.67776695,-17.67776695)=\\&\\&(239.8958263,\;325.2513602)\\&\\&\end{align}$$

Y así sería más o menos.  Los pasos y las variables intermedias dependen de como lo quieras programar.

Perfecto... Con el ejemplo si he podido transformar las formulas a operaciones simples para poder trasladarlas al lenguaje de programación. Aquí está el resultado del proyecto de prueba que he creado:

¡¡Muchísimas gracias!!, una ayuda excelente.

Salu2.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas