Domanda

Ciao io sto cercando di creare la trasformazione affine che mi permetterà di trasformare un triangolo in un altro. Quello che ho sono le coordinate per i 2 triangoli. Mi potete aiutare?

Dopo la risposta di Adam Rosenfield mi si avvicinò con questo codice nel caso qualcuno si annoia per risolvere l'equazione se stesso:

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);
}
È stato utile?

Soluzione

ho intenzione di assumere si sta parlando qui 2D. Una matrice di trasformazione affine ha 9 valori in esso:

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

Ci sono 3 Ingresso vertici x1, x2, e x3, che una volta trasformato dovrebbe diventare y1, y2, y3. Tuttavia, dal momento che stiamo lavorando in coordinate omogenee, applicando A a x1 non significa necessariamente dare y1 - dà un multiplo di y1. Così, abbiamo anche il moltiplicatori sconosciuta k1, k2, e k3, con le equazioni:

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

Ognuno di questi è un vettore, quindi abbiamo davvero avere 9 equazioni in 12 incognite, per cui la soluzione sta per essere sottovincolata. Se si richiede che a7=0, a8=0, e a9=1, allora la soluzione sarà unico (questa scelta è naturale, in quanto significa che se il punto di ingresso è (x, y, 1), allora il punto di uscita avrà sempre coordinate omogenee 1, così il risultante trasformare è solo un 2x2 trasformare inclusa una traduzione).

Quindi, questo riduce le equazioni per:

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

Quindi, k1 = k2 = k3 = 1. Collegare questi in e la conversione alla matrice rendimenti forma:

| 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 risoluzione di questo sistema 6x6 di equazioni si produce il vostro affine matrice di trasformazione A. Avrà una soluzione unica se e solo se i 3 punti del vostro triangolo sorgente non sono allineati.

Altri suggerimenti

Ehi, ragazzi, senza perdita di generalità, rendere i due triangoli hanno l'origine come un vertice (si può virare il turno affine più tardi), quindi sono definite dai punti di 0, a, b, c, d quindi moltiplicare i punti di x dalla matrice NM

dove

M = inversa ( ab ) <--- questo è matrice 2x2 con i punti un e b come colonne

e

N = ( c d )

Che dovrebbe farlo.

Se ho capito bene, i tuoi triangoli hanno la stessa dimensione e gli angoli, così si dovrebbe essere in grado di trasformata di loro in modo che abbiano (almeno) un punto in comune. Dopo questo, essi dovrebbero differiscono solo in rotazione o potrebbero essere mirroring, così si potrebbe f.e. ottenere gli angoli tra le righe triangolo e provare questi per la rotazione e potrebbe rispecchiare uno dei triangoli se nessuno degli angoli funziona.

EDIT: OK, questo non basta, trasformazioni affini anche possono contenere taglio e ridimensionamento ... Scaling potrebbe essere fatto facilmente, basta dividere la lunghezza delle linee, questo vi darà anche alcune informazioni sulle linee dei triangoli corrispondenti, ma taglio sarà più difficile ...

OTOH, non hai potuto risolvere alcuni sistema di equazioni per questo? Dopo tutto, ci dovrebbe essere una matrice di trasformazione e 3 punti (nuovi e vecchi) ...

Proprio Formule il problema come un insieme di equazioni e poi risolverlo:

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

M è una matrice 3x3 come:

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

E P_i è un [k*x_i, k*y_i, k] tupla (coordinate omogenee) ...

È ora possibile cercare di ampliare le 3 equazioni matriciali mostrati sopra e fare un nuovo sistema, con la m_ij come incognits e risolverlo, ma se non mi manca qualcosa (e forse lo sono), è necessario un punto in più per specificare completamente la trasformazione, o altrimenti dovrete un ulteriore grado di libertà (e, naturalmente, si può risolvere il problema).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top