Pregunta

Hola estoy tratando de crear la transformación afín que me permitirá transformar un triángulo en otro. Lo que tengo son las coordenadas de los 2 triángulos. ¿Me pueden ayudar?

Tras la respuesta de Adam Rosenfield me encontré con este código en caso de que alguien se aburre de resolver la ecuación de sí mismo:

public static AffineTransform createTransform(ThreePointSystem source,
            ThreePointSystem dest) {        
    double x11 = source.point1.getX();
    double x12 = source.point1.getY();
    double x21 = source.point2.getX();
    double x22 = source.point2.getY();
    double x31 = source.point3.getX();
    double x32 = source.point3.getY();
    double y11 = dest.point1.getX();
    double y12 = dest.point1.getY();
    double y21 = dest.point2.getX();
    double y22 = dest.point2.getY();
    double y31 = dest.point3.getX();
    double y32 = dest.point3.getY();

    double a1 = ((y11-y21)*(x12-x32)-(y11-y31)*(x12-x22))/
                ((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
    double a2 = ((y11-y21)*(x11-x31)-(y11-y31)*(x11-x21))/
                ((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
    double a3 = y11-a1*x11-a2*x12;
    double a4 = ((y12-y22)*(x12-x32)-(y12-y32)*(x12-x22))/
                ((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
    double a5 = ((y12-y22)*(x11-x31)-(y12-y32)*(x11-x21))/
                ((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
    double a6 = y12-a4*x11-a5*x12;
    return new AffineTransform(a1, a4, a2, a5, a3, a6);
}
¿Fue útil?

Solución

Voy a suponer que estamos hablando aquí 2D. Una matriz de transformación afín tiene 9 valores en ella:

    | a1 a2 a3 |
A = | a4 a5 a6 |
    | a7 a8 a9 |

Hay 3 de entrada vértices x1, x2, y x3, que cuando se transformó debe convertirse y1, y2, y3. Sin embargo, ya estamos trabajando en coordenadas homogéneas, aplicando A a x1 no necesariamente da y1 - le da un múltiplo de y1. Por lo tanto, también tenemos los multiplicadores k1 desconocida, k2 y k3, con las ecuaciones:

A*x1 = k1*y1
A*x2 = k2*y2
A*x3 = k3*y3

Cada uno de ellos es un vector, por lo que realmente tiene 9 ecuaciones con 12 incógnitas, por lo que la solución va a ser underconstrained. Si es necesario que a7=0, a8=0 y a9=1, entonces la solución será único (esta elección es natural, ya que significa que si el punto de entrada es (x, y, 1), entonces el punto de salida será siempre tienen coordenadas homogéneas 1, por lo que el resultado es transformar sólo un 2x2 transformar además de una traducción).

Por lo tanto, esto reduce las ecuaciones a:

a1*x11 + a2*x12 + a3 = k1*y11
a4*x11 + a5*x12 + a6 = k1*y12
                   1 = k1
a1*x21 + a2*x22 + a3 = k2*y21
a4*x21 + a5*x22 + a6 = k2*y22
                   1 = k2
a1*x31 + a2*x32 + a3 = k3*y31
a4*x31 + a5*x32 + a6 = k3*y32
                   1 = k3

Así, k1 = k2 = k3 = 1. El tapar estos en y la conversión a la matriz rendimientos de formulario:

| x11 x12   1   0   0   0 |   | a1 |   | y11 |
| x21 x22   1   0   0   0 |   | a2 |   | y21 |
| x31 x32   1   0   0   0 | * | a3 | = | y31 |
|   0   0   0 x11 x12   1 |   | a4 |   | y12 |
|   0   0   0 x21 x22   1 |   | a5 |   | y22 |
|   0   0   0 x31 x32   1 |   | a6 |   | y32 |

La solución de este sistema de ecuaciones 6x6 que produce su afín matriz de transformación A. Se tendrá una solución única si y sólo si los 3 puntos de su triángulo de origen no están alineados.

Otros consejos

Hola, chicos, sin pérdida de generalidad, que los dos triángulos tienen el origen como un vértice (se puede virar en el turno de tarde afín), por lo que están definidos por los puntos 0, a, b, c, d luego multiplicar sus puntos x por la matriz NM

donde

M = inversa ( ab ) <--- esto es matriz 2x2 con los puntos a y b como sus columnas

y

N = ( c d )

Eso debería hacerlo.

Si lo entiendo correctamente, sus triángulos tienen el mismo tamaño y ángulos, por lo que debe ser capaz de transformar de ellos para que tengan (por lo menos) un punto en común. Después de esto, sólo deberían diferir en rotación o puede ser duplicado, por lo que podrían F. E. obtener los ángulos entre las líneas del triángulo y tratar estos para la rotación y podría reflejar uno de los triángulos si ninguno de los ángulos funciona.

EDIT: OK, eso no es suficiente, transformaciones afines también pueden contener cizalla y la escala ... La ampliación se podría hacer fácilmente, simplemente dividir la longitud de las líneas, esto también le dará alguna información acerca de las líneas de los triángulos correspondientes, pero de corte será más difícil ...

otoh, no pudiste resolver algunos sistema de ecuaciones para esto? Después de todo, debe haber una matriz de transformación y 3 puntos (nuevos y viejos) ...

Sólo Formule el problema como un conjunto de ecuaciones y luego resolverlo:

P1 * M = P1'
P2 * M = P2'
P3 * M = P3'

M es una matriz 3x3 como:

[m00, m01, m02;
 m10, m11, m12;
 0  ,   0,   1]

Y P_i es un [k*x_i, k*y_i, k] tupla (coordenadas homogéneas) ...

Ahora puede tratar de ampliar las 3 ecuaciones matriciales se muestran arriba y hacer un nuevo sistema, con la m_ij como incognits y resolverlo, pero si no me falta algo (y tal vez yo soy), necesita un punto más para especificar completamente la transformación, o de lo contrario tendrá un grado extra de libertad (y por supuesto se puede arreglar).

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