2013-02-28 6 views

risposta

44

translate (tx, ty) può essere scritta come la matrice:

1 0 tx 
0 1 ty 
0 0 1 

Scale (sx, sy) può essere scritta come la matrice:

sx 0 0 
0 sy 0 
0 0 1 

Ruota (un) può essere scritto come una matrice:

cos(a) -sin(a) 0 
sin(a) cos(a) 0 
0  0  1 

Ruota (a, cx, c y) è la combinazione di una traduzione da (-cx, cy), una rotazione di un gradi e una traduzione ritorna (cx, cy), che assicura:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy 
0  0  1 

Se solo moltiplicare questo con la definizione matrice che si ottiene:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx + tx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy + ty 
0  0  1 

che corrisponde al SVG matrice di trasformazione:

(cos(a), sin(a), -sin(a), cos(a), -cx × cos(a) + cy × sin(a) + cx + tx, -cx × sin(a) - cy × cos(a) + cy + ty).

Nel tuo caso: matrix(0.866, -0.5 0.5 0.866 8.84 58.35).

Se si include la scala (sx, sy) trasformare, la matrice è:

(sx × cos(a), sy × sin(a), -sx × sin(a), sy × cos(a), (-cx × cos(a) + cy × sin(a) + cx) × sx + tx, (-cx × sin(a) - cy × cos(a) + cy) × sy + ty)

Si noti che questo presuppone che si sta facendo le trasformazioni nell'ordine in cui li ha scritti.

+0

è possibile elaborare a, cx, cy, tx e ty? così posso provarlo. –

+0

Nel tuo esempio a = -30 (gradi), cx = 10, cy = 25, tx = 20, ty = 50 (sx = 1, sy = 1).In generale la rotazione viene data come ruotata (a, cx, cy) e la traduzione come translate (tx, ty). –

+0

Scusa ma nel 'Ruota (a, cx, cy)' cosa rappresenta il punto in '-cx.cos (a)'? Provenendo da uno sfondo JavaScript, non capisco cosa significhi applicare cos/sin a un oggetto direttamente, senza Math.cos(). –

7

Prima ottenere l'elemento g utilizzando document.getElementById se ha un attributo id o un altro metodo appropriato, quindi chiama consolidate ad es.

var g = document.getElementById("<whatever the id is>"); 
g.transform.baseVal.consolidate(); 
+1

Sto cercando di raggiungere questo obiettivo con l'obiettivo C/iOS. c'è qualche metodo generale per ottenere la matrice? –

+0

Sebbene la risposta di Peters spieghi la teoria e come si calcoli manualmente la matrice, penso che la risposta di Roberts dovrebbe essere accettata. el.transform.baseVal.consolidate() è ciò che dovresti usare. Non è necessario reinventare la ruota. – Manfred

+0

@Manfred l'OP non poteva usarlo come spiegato nel suo commento alla mia risposta, quindi perché mai avrebbe accettato? –