2009-05-21 4 views

cevap

8

almak için trigonometrik fonksiyonlar (arctan) kullanmaktır Kolay: Sadece m11 öğesinin acos'unu alın.

Dönüştürme bir çeviri içeriyorsa hala çalışır, ancak kesme veya ölçekleme içeriyorsa şansınız kalmaz. Matrisin bir kesme, ölçek ve döndürme matrisine ayrılmasıyla bunlar yeniden oluşturulabilir, ancak elde ettiğiniz sonuçlar büyük olasılıkla aradığınız şey değildir.

+0

+1. Çeviri dışı bölümün SVD ayrışması da akla gelir (dönme bileşimi, x-y eksenleri boyunca anizotropik ölçekleme ve döndürme). –

8

en basit genel yolu (0,0) dönüşümü ve (1,0), sonra SADECE öyle bir rotasyon içeren dönüşümü olduğunu, açı varsayarsak

+0

Bunu yapmanın doğru yolu budur. Teknik doğruluk için teşekkürler – sharvey

4

Dönüştürme Matrisi, 3d grafikler için kullanılan bir uygulamadır. Noktaların/nesnelerin 3d konumsal/dönme yönelimlerini hızlandırmak için matematiği basitleştirir. Ardışık çeviriler/rotasyonlar/ölçekler biriktirme biçimi nedeniyle Dönüşümden yönelimi çıkarmak gerçekten çok zordur.

İşte bir öneri. (1,0,0) gibi basit bir yöne işaret eden bir vektör çekin ve daha sonra Transform'i ona uygulayın. Elde edilen vektörünüz size böyle bir şey verecek şekilde tercüme edilecek ve döndürülecektir: (27.8, 19.2, 77.4). Gibi bir şey elde etmek için (26.1, 19.4, 50.8) Dönüştürme (0,0,0) 'e uygulayın. Bu iki noktayı, başlangıç ​​noktalarını (1.0,0) bilmeye dayalı olarak uygulanan rotasyonları hesaplamak için kullanabilirsiniz.

Bu yardımcı olur mu?

+1

QTransform 3x3 matrislerini kullanarak 2B dönüşümleri gerçekleştirir. 4x4 matrislerle 3D dönüşümleri çok benzer, ancak 2D kasadaki matematik biraz daha basit. Söyleniyor ki, Nils dışındaki herkes [[1,1,0], [0,1,0], [0,0,1]] gibi kesme dönüşümlerini unutmuş gibi görünüyor, bu durumda sadece iki noktayı zorlamayacak. Yeterince açıklayıcı bir sonuç döndür. – ephemient

2

Genel olarak ters bir trig işlevine gereksiniminiz vardır, ancak çeyreğim belirsizliklerine dikkat etmeniz gerekir ve bu, atan2'yi (bazen arctan2) kullanmanız gereken şeydir. Yani ya bir birim vektörü [0, 1] 'i [x, y]' ye çevirin ve sonra da atan2 (y, x) 'i kullanın ya da matris sadece bir rotasyon uyguluyorsa, atan2'yi (m12, m11) kullanabilirsiniz. (Bunlar, atan2 kullanmamaları dışında Javier ve Nils cevaplarına benzerler.)

1

Sadece setRotate ile QGraphicsItem kullanıyordum ve bir döndürme grubu işlevselliği ekleyene kadar herhangi bir sorun yaşamadım. Sorun, destroyItemGroup çağrıldığında, rotasyonu, döndürme olarak değil, öğelere dönüştürme olarak uygular. Bu yüzden bu QTransform nesnesinden dönüşü kurtarmam gerekiyordu.

My düzeltme (tom10 cevabı kredisi) itemChange yöntemine aşağıdaki satırları eklemek oldu:

QVariant MyGraphicItem::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    if(change == ItemTransformChange) 
    { 
     auto transform = value.value<QTransform>(); 
     setRotation(rotation() + qRadiansToDegrees(qAtan2(transform.m12(), transform.m11()))); 
     return QVariant(); 
    } 
    ... 
} 

PS .: işe yaramadı acos ve M11() ile diğer çözüm. Tom10 tarafından açıklandığı gibi belirli değerler için çöker.

İlgili konular