Bagaimana cara mengonversi antara dua sistem koordinat 2D yang berbeda?

10

Saya mencoba mengonversi koordinat dari satu sistem koordinat ke yang lain, sehingga saya dapat menggambarnya pada gambar.

Pada dasarnya sistem koordinat tujuan adalah sebagai berikut:

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

(hanya gambar standar yang saya gambar dengan ukuran 1066 x 1600)

Posisi yang saya coba gambar pada gambar sebenarnya memiliki ukuran yang sama persis, tetapi sistem koordinatnya berbeda. Rentang semua koordinat adalah 1066x1600.

Tapi contoh koordinatnya adalah:

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

Kisaran sistem koordinat ini adalah:

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

Saya merasa ini adalah matematika yang SANGAT sederhana, tetapi untuk beberapa alasan saya tidak mengerti.

Bagaimana saya bisa mengubah koordinat yang disediakan ke sistem koordinat pertama?

Geesu
sumber
3
Jika kedua sistem koordinat memiliki vektor basis yang sama, Anda cukup menggunakan faktor penskalaan. Jika mereka tidak memiliki vektor basis yang sama perubahan basis diperlukan.
thalador

Jawaban:

7

Anda dapat menormalkan nilai pertama, ini akan memberi Anda nilai dalam kisaran [0,1]. Anda dapat menganggapnya sebagai persentase X, persentase yang dipetakan nilainya antara nilai minimum dan maksimum. Kemudian Anda dapat menemukan di mana persentase itu berada dalam sistem koordinat tujuan Anda dengan melihat berapa nilai persentase X melalui sistem tujuan. Saya akan menggunakan kode Java sebagai bahasa contoh, saya yakin konsepnya cukup jelas untuk menerjemahkan ke bahasa apa pun.

Jadi normalkan:

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

Dengan menggunakan contoh Anda, Anda akan memasukkan:

xPercent = normalize(x,0,1066);

Kemudian temukan di mana ia berada di sistem tujuan. Dengan sesuatu seperti

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

Atau untuk menggunakan nilai-nilai Anda:

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

Jadi misalnya dengan nilai x 1000 Anda akan memetakannya ke sistem koordinat tujuan Anda 467.29.

Atau , jika sistem koordinat akan selalu sama, Anda dapat melakukan pra-perhitungan rasio di antara mereka.

Begitu:

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

destX = x*xRatio+destMin;
MichaelHouse
sumber
Kenapa Java (C #)? Dia tidak meminta kode Java :)
kravemir
6
Ini untuk memberi contoh. Tidak perlu digunakan apa adanya, dan konsepnya cukup jelas.
MichaelHouse
Tetapi jika saya melakukan ini: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Saya selalu mendapatkan nilai negatif, dan hasilnya sistem koordinat hanya dari 0-1066, haruskah saya mengalihkan semua koordinat?
Geesu
Mengalihkan mereka dan saya masih mendapatkan dump.tanaris4.com/sota.png seperti di pos lain, mungkin saya mengalami masalah lain sama sekali (terkait dengan C # dan menggambar). Terima kasih teman-teman!
Geesu
Mengerti, untuk beberapa alasan saya harus melakukan xPercent = 1.0f - xPercent
Geesu
4

Ini adalah matematika sederhana:

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

src - sumber sistem koordinat

sistem koordinasi hasil - hasil

Edit - penjelasan matematika

( src - src_min ) / ( src_max - src_min )menerjemahkannya ke sistem koordinat mulai dari nol dengan panjang sistem koordinat sumber yang sama (0.0, src_max - src_min ). Kemudian ia mengukur nilai untuk mengoordinasikan sistem (0.0, 1.0).

* ( res_max - res_min ) skala ini bernilai untuk mengoordinasikan sistem mulai dari nol dengan panjangnya sistem koordinasi hasil (0.0, dst_max - dst_min)

+ res_min menerjemahkan nilai untuk menghasilkan sistem koordinat (dst_min, dst_max)

kravemir
sumber
Saya pikir ini juga, tapi itu tidak ditampilkan dengan benar: dump.tanaris4.com/sota.png Koordinat terakhir harus mengenai di mana lingkaran putih di bagian bawah
Geesu
1
Ini sama sekali tidak menjelaskan matematika, mengapa tidak? :)
MichaelHouse
@ Byte56 Bagi saya adalah formula yang cukup untuk memahami sesuatu terutama jika hanya menggunakan operasi aritmatika, tetapi saya telah menambahkan penjelasan untuk orang-orang yang membutuhkannya :)
kravemir
1
@Geesu Kemudian Anda mungkin melakukan sesuatu yang buruk (rendering matriks?).
kravemir
2
Terima kasih telah memperbarui itu. Saya biasanya berpikir lebih baik memberikan jawaban yang mencoba menjelaskan alasannya. Kalau tidak, Anda hanya memberikan jawaban untuk pertanyaan ini, alih-alih bagaimana menyelesaikan pertanyaan ini dan masalah serupa. Itu adalah "memberi manusia ikan, mengajar manusia untuk ikan" jenis hal.
MichaelHouse
3

Persamaan dasar untuk tranformasi koordinat 2D (dalam aljabar, tanpa rotasi) adalah:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

diberikan dua poin di TargetCoordinate (T1, T2) yang sesuai dengan dua poin di SourceCoordinate (S1, S2), TranslateFactordan ScalingFactordiberikan dengan menyelesaikan:

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

yang hasilnya:

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

Dalam kasus Anda, untuk koordinat x

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

Dan dengan demikian,

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

yoordinasikan ikuti prosedur yang sama

tkokasih
sumber
S1 dan S2 tidak dapat memiliki koordinat x / y yang sama yang mengarah ke pembagian dengan nol.
zwcloud
0

Membuat beberapa asumsi:

  • Anda (pada akhirnya) tertarik pada implementasi matriks, untuk kenyamanan dan kekuatan; dan
  • Anda terbiasa dengan koordinat yang homogen.

Lalu pertanyaannya bermigrasi ke: Apa matriks transformasi homogen untuk perubahan basis saya?

Untuk menjawab ini, kita perlu jawaban atas tiga pertanyaan tambahan anak pertama:

  1. Ke mana asal saya pindah?
  2. Apa yang terjadi pada sumbu X saya? Biarkan (M11, M12) menjadi koordinat titik
  3. Apa yang terjadi pada sumbu Y saya?

Tetapkan jawaban untuk tiga pertanyaan ini sebagai berikut:

  1. (M31, M32) adalah koordinat asal baru di bawah sistem koordinat asli.
  2. (M11, M12) adalah koordinat unit x-vektor baru dalam sistem koordinat asli.
  3. (M21, M22) adalah koordinat unit y-vektor baru dalam sistem koordinat asli.

Maka matriks transformasi homogen adalah:

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

Konvensi saya di sini adalah bahwa poin diwakili oleh vektor baris, yang merupakan konvensi grafik komputer biasa; ahli matematika dan fisikawan sering menggunakan oppsoite.

Pieter Geerkens
sumber
Sistem koordinat dapat digambarkan dengan matriks seperti itu: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Diberikan matriks sistem koordinat A dan matriks sistem koordinat B, P * A * Inverse (B), di mana P adalah representasi titik sebagai koordinat dalam A, menghasilkan representasi titik sebagai koordinat dalam B.
Jim Balter