Pregunta

Estoy tratando de hacer un triángulo (triángulo isósceles) para moverme por la pantalla y al mismo tiempo girarlo ligeramente cuando un usuario presiona una tecla direccional (como derecha o izquierda).

Me gustaría que la nariz (punto superior) del triángulo guíe el triángulo en todo momento. (Como ese viejo juego de asteroides).

Mi problema es con las matemáticas detrás de esto. En cada intervalo de tiempo X, quiero que el triángulo se mueva en & Quot; alguna dirección & Quot ;, necesito ayuda para encontrar esta dirección (incrementos / decrementos x e y).

Puedo encontrar el punto central (Centroide) del triángulo, y tengo la mayoría de los puntos x an y superiores, así que tengo un vector de línea con el que trabajar, pero no una pista sobre " cómo < !> quot; para trabajar con él.

Creo que tiene algo que ver con los viejos métodos de Sin y Cos y la cantidad (ángulo) de rotación del triángulo, pero estoy un poco oxidado en esas cosas.

Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución

El arcotangente (tangente inversa) de vy / vx, donde vx y vy son los componentes de su vector (centroide - > tip), le da el ángulo que enfrenta el vector.

El arcotangente clásico te da un ángulo normalizado a -90 & # 176; < r < +90 & # 176; grados, sin embargo, por lo que debe sumar o restar 90 grados del resultado dependiendo del signo del resultado y el signo de vx.

Afortunadamente, su biblioteca estándar debería tener una función atan2 () que tome vx y vy por separado como parámetros, y le devuelva un ángulo entre 0 & # 176; y 360 & # 176 ;, o -180 & # 176; y +180 & # 176; grados También tratará el caso especial donde vx = 0, lo que resultaría en una división por cero si no tuviera cuidado.

Consulte http://www.arctangent.net/atan.html o simplemente busque para " arctangent " ;.

Editar: he usado grados en mi publicación para mayor claridad, pero Java y muchos otros idiomas / bibliotecas funcionan en radianes donde 180 & # 176; = & # 960 ;.

También puede agregar vx y vy a los puntos del triángulo para que se mueva en " forward " dirección, pero asegúrese de que el vector esté normalizado (vx & # 178; + vy & # 178; = 1), de lo contrario, la velocidad dependerá del tamaño de su triángulo.

Otros consejos

@Mark:

He intentado escribir un manual sobre vectores, coordenadas, puntos y ángulos en este cuadro de respuesta dos veces, pero cambié de opinión en ambas ocasiones porque tomaría demasiado tiempo y estoy seguro de que hay muchos tutoriales que explican cosas mejor que nunca.

Su centroide y " tip " las coordenadas no son vectores; es decir, no se gana nada al pensar en ellos como vectores.

El vector que desea, vForward = pTip - pCentroid, puede calcularse restando las coordenadas de " tip " esquina desde el punto centroide. El atan2 () de este vector, es decir, atan2 (tipY-centY, tipX-centX), le da el ángulo en que su triángulo es & Quot; frente a & Quot ;.

En cuanto a lo que es relativo, no importa. Su biblioteca probablemente usará la convención de que el eje X creciente (--- & Gt; la dirección derecha / este en presumiblemente todos los gráficos 2D que ha visto) es 0 & # 176; o 0 & # 960 ;. La dirección creciente Y (superior, norte) corresponderá a 90 & # 176; o (1/2) & # 960 ;.

Me parece que necesita almacenar el ángulo de rotación del triángulo y posiblemente su velocidad actual.

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)

¡Tenga en cuenta que el ángulo está en radianes, no en grados!

Radians = Grados * RadiansInACircle / DegreesInACircle

RadiansInACircle = 2 * Pi

DegressInACircle = 360

Para las ubicaciones de los vértices, cada uno se encuentra a una cierta distancia y ángulo desde el centro. Agregue el ángulo de rotación actual antes de hacer este cálculo. Es la misma matemática que para calcular el movimiento.

Aquí hay más:

Los vectores representan desplazamiento. El desplazamiento, la traducción, el movimiento o lo que quieras llamarlo no tiene sentido sin un punto de partida, es por eso que me referí a & Quot; forward & Quot; vector arriba como " desde el centroide, " y es por eso que el " vector centroide, " el vector con las componentes x / y del punto centroide no tiene sentido. Esos componentes le dan el desplazamiento del punto centroide desde el origen. En otras palabras, pOrigin + vCentroid = pCentroid. Si comienza desde el punto 0, luego agrega un vector que representa el desplazamiento del punto centroide, obtendrá el punto centroide.

Tenga en cuenta que:

vector + vector = vector
(la adición de dos desplazamientos le proporciona un tercer desplazamiento diferente)

punto + vector = punto
(mover / desplazar un punto te da otro punto)

punto + punto = ???
(agregar dos puntos no tiene sentido; sin embargo :)

punto - punto = vector
(la diferencia de dos puntos es el desplazamiento entre ellos)

Ahora, estos desplazamientos pueden pensarse (al menos) de dos maneras diferentes. El que ya conoce es el sistema rectangular (x, y), donde los dos componentes de un vector representan el desplazamiento en las direcciones x e y, respectivamente. Sin embargo, también puede usar coordenadas polares , (r, & # 920;). Aquí, & # 920; representa la dirección del desplazamiento (en ángulos relativos a un ángulo cero arbitrario) yr, la distancia.

Tome el vector (1, 1), por ejemplo. Representa un movimiento de una unidad a la derecha y una unidad hacia arriba en el sistema de coordenadas que todos estamos acostumbrados a ver. El equivalente polar de este vector sería (1.414, 45 & # 176;); el mismo movimiento, pero representado como un " desplazamiento de 1.414 unidades en la dirección del ángulo 45 & # 176; (Nuevamente, usando un conveniente sistema de coordenadas polares donde la dirección Este es 0 & # 176; y los ángulos aumentan en sentido antihorario).

La relación entre las coordenadas polares y rectangulares son:

& # 920; = atan2 (y, x)
r = sqrt (x & # 178; + y & # 178;) (¿ahora ve dónde entra el triángulo rectángulo?)

y viceversa,

x = r * cos (& # 920;)
y = r * sin (& # 920;)

Ahora, desde un segmento de línea dibujado desde el centroide de su triángulo hasta el " tip " la esquina representaría la dirección en la que su triángulo está & "; enfrentando, &"; si tuviéramos que obtener un vector paralelo a esa línea (por ejemplo, vForward = pTip - pCentroid ), ese vector & # 920; -coordinado correspondería al ángulo al que se enfrenta su triángulo.

Tome el vector (1, 1) nuevamente. Si esto fuera vForward, entonces eso habría significado que su & Quot; tip & Quot; Las coordenadas X e Y del punto fueron 1 más que las de su centroide. Digamos que el centroide está activado (10, 10). Eso pone & Quot; tip & Quot; esquina en (11, 11). (Recuerde, pTip = pCentroid + vForward agregando & Quot; + pCentroid & Quot; a ambos lados de la ecuación anterior.) Ahora, ¿en qué dirección está mirando este triángulo? 45 & # 176 ;, ¿verdad? ¡Ese es el & # 920; -coordinado de nuestro (1, 1) vector!

mantener el centroide en el origen. use el vector desde el centroide hasta la nariz como el vector de dirección. http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions rotará esto vector. construya los otros dos puntos a partir de este vector. traduce los tres puntos a donde están en la pantalla y dibuja.

double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed

// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);

// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);

Puedo ver que necesito aplicar las fórmulas de rotación 2D comunes a mi triángulo para obtener mi resultado, solo estoy teniendo algunos problemas con las relaciones entre los diferentes componentes aquí.

aib , declaró que:

  

El arcotangente (tangente inversa) de   vy / vx, donde vx y vy son   componentes de su (centroide - > tip)   vector, te da el ángulo del vector   está enfrentando.

¿Es vx y vy las coordenadas x e y del centro o la punta? Creo que me estoy confundiendo en cuanto a la terminología de un & "; Vector &"; aquí. Tenía la impresión de que un Vector era solo un punto en el espacio 2d (en este caso) que representaba la dirección.

Entonces, en este caso, ¿cómo se calcula el vector del centroide - > tip? ¿Es solo el centro?

meyahoocomlorenpechtel declaró:

  

Me parece que necesitas almacenar   el ángulo de rotación del triángulo y   posiblemente es la velocidad actual.

¿Cuál es el ángulo de rotación relativo? ¿El origen del triángulo o la ventana del juego en sí? Además, para rotaciones futuras, ¿es el ángulo el ángulo desde la última rotación o la posición original del triángulo?

¡Gracias a todos por la ayuda hasta ahora, realmente lo aprecio!

querrá que el vértice superior sea el centroide para lograr el efecto deseado.

Primero, comenzaría con el centroide en lugar de calcularlo. Conoces la posición del centroide y el ángulo de rotación del triángulo, usaría esto para calcular las ubicaciones de las vértices. (Pido disculpas de antemano por cualquier error de sintaxis, acabo de comenzar a incursionar en Java).

// punto de partida

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

// detalles del triángulo

int width = 6; //base
int height = 9;

debe ser una matriz de 3 ángulos, pares de distancia.

angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;    
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points

Tenga en cuenta que estoy restando la distancia Y. Te estás tropezando por el hecho de que el espacio de la pantalla está invertido. En nuestra mente, Y aumenta a medida que subes, pero las coordenadas de la pantalla no funcionan de esa manera.

La matemática es mucho más simple si rastrea cosas como posición y ángulo de rotación en lugar de derivar el ángulo de rotación.

Además, en su último código está modificando la ubicación por el ángulo de rotación. El resultado será que su nave gira por el ángulo de rotación en cada ciclo de actualización. ¡Creo que el objetivo es algo así como los asteroides, no un gato persiguiendo su cola!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top