İki farklı 2B koordinat sistemi arasında nasıl geçiş yapabilirim?


10

Bir koordinat sisteminden diğerine bir koordinat dönüştürmeye çalışıyorum, böylece bir görüntüye çizebilirim.

Temel olarak hedef koordinat sistemi aşağıdaki gibidir:

X range: 0 to 1066
Y range: 0 to 1600

(1066 x 1600 boyutunda çizdiğim standart bir resim)

Resme çizmeye çalıştığım konum aslında aynı boyuta sahip, ancak koordinat sistemi farklı. Tüm koordinatların aralığı 1066x1600'dür.

Ancak bir koordinat örneği şöyle olur:

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

Bu koordinat sisteminin aralığı:

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

Bu ÇOK basit bir matematik gibi hissediyorum, ama nedense onu elde edemiyorum.

Sağlanan koordinatları ilk koordinat sistemine nasıl dönüştürebilirim?


3
İki koordinat sistemi aynı temel vektörlere sahipse, sadece bir ölçeklendirme faktörü kullanabilirsiniz. Aynı temel vektörlere sahip değillerse, bir temel değişiklik gereklidir.
thalador

Yanıtlar:


7

İlk değeri normalleştirebilirsiniz, bu size [0,1] aralığında bir değer verecektir. Bunu X yüzdesi olarak, değerin minimum ve maksimum değerler arasında eşlendiği yüzde olarak düşünebilirsiniz. Ardından, hedef sistemde hangi değerin X yüzdesi olduğunu görerek bu yüzdenin hedef koordinat sisteminize nerede ait olduğunu bulabilirsiniz. Örnek bir dil olarak Java kodunu kullanacağım, eminim kavramlar herhangi bir dile tercüme edilecek kadar açıktır.

Yani normalleştirin:

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

Örneğinizi kullanarak şunları girersiniz:

xPercent = normalize(x,0,1066);

Ardından hedef sistemde nerede kaldığını bulun. Gibi bir şeyle

destX = xPercent*(Math.abs(max-min)) + min;

Veya değerlerinizi kullanmak için:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

Örneğin, x değeri 1000 olduğunda, bunu hedef koordinat sisteminizle eşlersiniz 467.29.

Alternatif olarak , koordinat sistemleri her zaman aynı olacaksa, aralarındaki oranı önceden hesaplayabilirsiniz.

Yani:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;

Neden Java (C #)? Java kodu sormadı :)
kravemir

6
Bir örnek vermek gerekirse. Olduğu gibi kullanılmasına gerek yoktur ve konsept yeterince açıktır.
MichaelHouse

Ama bunu yaparsam: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Her zaman negatif bir değer alırım ve sonuç koordinat sistemi sadece 0-1066 arasındadır, tüm koordinatları değiştirmeli miyim?
Geesu

Onları değiştirdim ve hala başka bir yazıdaki gibi dump.tanaris4.com/sota.png alıyorum , belki de tamamen başka bir sorun yaşıyorum (C # ve çizim ile ilgili). Teşekkürler beyler!
Geesu

Anladım, bazı nedenlerden dolayı xPercent = 1.0f - xPercent
Geesu

4

Basit matematik:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src - kaynak koordinat sistemi

sonuç - sonuç koordinasyon sistemi

Düzenle - matematik açıklaması

( src - src_min ) / ( src_max - src_min )Kaynak koordinat sisteminin eşit uzunlukta sıfırdan başlayarak koordinat sistemine çevirir (0.0, src_max - src_min ). Daha sonra sistemi koordine etmek için değeri ölçeklendirir (0.0, 1.0).

* ( res_max - res_min ) bu, sonuç koordinasyon sisteminin uzunluğu ile sıfırdan başlayarak koordinat sistemine değeri ölçeklendirir (0.0, dst_max - dst_min)

+ res_min değeri sonuç koordinat sistemine çevirir (dst_min, dst_max)


Bunu da düşündüm, ancak düzgün bir şekilde görüntülenmiyor: dump.tanaris4.com/sota.png Son koordinat, beyaz dairenin en altta olduğu yere
çarpmalıdır

1
Bu onlara hiç matematik açıklamıyor, neden olmasın? :)
MichaelHouse

@ Byte56 Benim için özellikle sadece aritmetik işlemleri kullanıyorsa, bir şeyi anlamak için yeterli formüldür, ancak buna ihtiyaç duyan insanlar için bir açıklama ekledim :)
kravemir

1
@Geesu O zaman muhtemelen başka kötü bir şey yapıyorsunuz (matris oluşturma?).
kravemir

2
Bunu güncellediğiniz için teşekkürler. Genellikle nedenini açıklamaya çalışan bir cevap vermek daha iyidir. Aksi takdirde, bu sorunun nasıl çözüleceğini ve benzer sorunların yerine sadece bu sorunun cevabını veriyorsunuz . Bu "bir adama bir balık verin, bir adama balık tutmayı öğretin" türü bir şey.
MichaelHouse

3

2D koordinat dönüşümü için temel denklem (cebirde, rotasyon olmadan):

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

TargetCoordinate'de (T1, T2) SourceCoordinate'de (S1, S2) iki noktaya karşılık gelen TranslateFactorve ScalingFactorçözülerek verilen iki nokta verilir:

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

sonuç:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

Sizin durumunuzda, x koordinatı için

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

Ve böylece,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

y koordinatı aynı prosedürü izleyin


S1 ve S2 aynı x / y koordinatına sahip olamaz ve bu da sıfıra bölünmeye yol açar.
zwcloud

0

Birkaç varsayımda bulunmak:

  • Kolaylık ve güç için (nihayetinde) bir matris impementasyonu ile ilgileniyorsunuz; ve
  • Homojen koordinatları biliyorsunuz.

Sonra soru şuraya taşınır: Temel değişikliğim için homojen dönüşüm matrisi nedir?

Bunu cevaplamak için önce üç yan soruya cevap vermeliyiz:

  1. Kökenim nereye taşındı?
  2. X eksenime ne oldu? (M11, M12) noktanın koordinatları olsun
  3. Y eksenime ne oldu?

Bu soruların cevaplarını aşağıdaki gibi tanımlayın:

  1. (M31, M32) orijinal koordinat sistemi altındaki yeni orijin koordinatlarıdır.
  2. (M11, M12) orijinal koordinat sistemindeki yeni x-vektör biriminin koordinatlarıdır.
  3. (M21, M22) orijinal koordinat sistemindeki yeni birim y-vektörünün koordinatlarıdır.

Sonra homojen dönüşüm matrisi:

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

Buradaki konvansiyonum, noktaların normal bilgisayar grafik kuralı olan satır vektörleri ile temsil edildiği; matematikçiler ve fizikçiler genellikle karşıtları kullanırlar.


Bir koordinat sistemi böyle bir matrisle tanımlanabilir: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = orijin.X, M32 = orijin.Y. Bir koordinat sistemi matrisi A ve bir koordinat sistemi matrisi B verildiğinde, P * A * Ters (B), burada P bir noktanın A'daki koordinatlar olarak temsilidir, noktanın B'deki koordinatlar olarak temsilini verir.
Jim Balter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.