ฉันจะแปลงระหว่างระบบพิกัด 2D ที่แตกต่างกันสองระบบได้อย่างไร


10

ฉันพยายามแปลงพิกัดจากระบบพิกัดหนึ่งเป็นอีกระบบหนึ่งเพื่อให้ฉันสามารถวาดลงบนภาพได้

โดยทั่วไประบบพิกัดปลายทางจะเป็นดังนี้:

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

(แค่ภาพมาตรฐานที่ฉันวาดลงไปด้วยขนาด 1066 x 1600)

ตำแหน่งที่ฉันพยายามวาดลงบนภาพมีขนาดเท่ากัน แต่ระบบพิกัดแตกต่างกัน การขยายพิกัดทั้งหมดคือ 1066x1600

แต่ตัวอย่างพิกัดจะเป็น:

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

ช่วงของระบบพิกัดนี้คือ:

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

ฉันรู้สึกว่านี่เป็นคณิตศาสตร์ที่ง่ายมาก แต่ด้วยเหตุผลบางอย่างฉันไม่ได้รับ

ฉันจะแปลงพิกัดที่ให้ไว้ในระบบพิกัดแรกได้อย่างไร


3
หากระบบพิกัดทั้งสองมีเวกเตอร์ฐานเดียวกันคุณสามารถใช้ตัวคูณสเกลได้ หากพวกเขาไม่มีเวกเตอร์ฐานเดียวกันจำเป็นต้องทำการเปลี่ยนแปลงฐาน
thalador

คำตอบ:


7

คุณสามารถทำให้ค่าแรกเป็นปกติซึ่งจะทำให้คุณมีค่าในช่วง [0,1] คุณสามารถคิดได้ว่าเป็นค่าร้อยละ X เปอร์เซ็นต์ที่ค่าจะจับคู่กับค่าระหว่างค่าต่ำสุดและค่าสูงสุด จากนั้นคุณสามารถค้นหาได้ว่าเปอร์เซ็นต์นั้นอยู่ในระบบพิกัดปลายทางของคุณโดยดูว่าค่าใดที่เป็นเปอร์เซ็นต์ X ผ่านระบบปลายทาง ฉันจะใช้รหัส Java เป็นภาษาตัวอย่างฉันแน่ใจว่าแนวคิดนั้นชัดเจนเพียงพอที่จะแปลเป็นภาษาใด ๆ

ดังนั้นทำให้ปกติ:

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

ใช้ตัวอย่างที่คุณป้อน:

xPercent = normalize(x,0,1066);

จากนั้นหาที่วางในระบบปลายทาง ด้วยสิ่งที่ชอบ

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

หรือเพื่อใช้ค่าของคุณ:

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

ดังนั้นสำหรับตัวอย่างที่มีค่า x 1000 467.29คุณต้องการแผนที่ที่ปลายทางของคุณระบบพิกัด

อีกทางหนึ่งหากระบบพิกัดจะเหมือนเดิมเสมอคุณสามารถคำนวณอัตราส่วนล่วงหน้าได้

ดังนั้น:

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

destX = x*xRatio+destMin;

ทำไมต้อง Java (C #) เขาไม่ได้ถามหารหัส Java :)
kravemir

6
มันเป็นตัวอย่าง ไม่จำเป็นต้องใช้ตามที่เป็นอยู่และแนวคิดมีความชัดเจนเพียงพอ
MichaelHouse

แต่ถ้าฉันทำสิ่งนี้: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; ฉันได้รับค่าลบเสมอและระบบพิกัดผลลัพธ์นั้นมีค่าตั้งแต่ 0-1066 ฉันควรสลับค่าพิกัดทั้งหมดหรือไม่
Geesu

สลับพวกเขาไปรอบ ๆ และฉันยังคงได้รับdump.tanaris4.com/sota.pngเหมือนในโพสต์อื่นบางทีฉันอาจมีปัญหาอื่นทั้งหมด (เกี่ยวข้องกับ C # และรูปวาด) ขอบคุณเพื่อน!
Geesu

เข้าใจแล้วด้วยเหตุผลบางอย่างฉันต้องทำ xPercent = 1.0f - xPercent
Geesu

4

มันเป็นคณิตศาสตร์ง่ายๆ

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

src - ระบบพิกัดที่มา

res - ระบบประสานงานผลลัพธ์

แก้ไข - คำอธิบายของคณิตศาสตร์

( src - src_min ) / ( src_max - src_min )(0.0, src_max - src_min )แปลในการประสานงานระบบเริ่มต้นที่ศูนย์ที่มีความยาวเท่ากันของแหล่งที่มาของระบบพิกัด (0.0, 1.0)จากนั้นก็จะชั่งมูลค่าให้กับระบบพิกัด

* ( res_max - res_min ) เครื่องชั่งนี้จะมีค่าสำหรับการประสานงานระบบเริ่มต้นที่ศูนย์พร้อมความยาวของระบบการประสานงานผลลัพธ์ (0.0, dst_max - dst_min)

+ res_min แปลค่าเป็นระบบพิกัดผลลัพธ์ (dst_min, dst_max)


ฉันคิดว่านี่เช่นกัน แต่มันไม่แสดงผลอย่างถูกต้อง: dump.tanaris4.com/sota.png พิกัดสุดท้ายควรกดจุดที่วงกลมสีขาวอยู่ด้านล่าง
Geesu

1
นี่ไม่ได้อธิบายคณิตศาสตร์เลยทำไมล่ะ? :)
MichaelHouse

@ Byte56 สำหรับผมก็พอจะเข้าใจสูตรบางสิ่งบางอย่างโดยเฉพาะอย่างยิ่งถ้าจะใช้ดำเนินการทางคณิตศาสตร์เท่านั้น แต่ผมได้เพิ่มคำอธิบายสำหรับคนที่จะต้องการมัน :)
kravemir

1
@Geesu แล้วคุณอาจทำสิ่งที่ไม่ดีอย่างอื่นอีก (การแสดงเมทริกซ์?)
kravemir

2
ขอบคุณที่อัพเดท โดยทั่วไปฉันคิดว่าเป็นการดีกว่าที่จะให้คำตอบที่พยายามอธิบายสาเหตุ มิฉะนั้นคุณเพียงแค่ให้คำตอบสำหรับคำถามนี้แทนที่จะแก้ปัญหานี้และปัญหาที่คล้ายกัน มันเป็นสิ่งที่ "ให้ปลาคนสอนคนให้ปลา" สิ่งประเภท
MichaelHouse

3

สมการพื้นฐานสำหรับการเปลี่ยนพิกัด 2D (ในพีชคณิตโดยไม่มีการหมุน) คือ:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

รับสองคะแนนใน TargetCoordinate (T1, T2) ที่สอดคล้องกับสองคะแนนใน SourceCoordinate (S1, S2) TranslateFactorและScalingFactorมอบให้โดยการแก้ปัญหา:

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

ซึ่งผลลัพธ์:

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

ในกรณีของคุณสำหรับพิกัด x

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

และดังนั้น

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

พิกัด y ทำตามขั้นตอนเดียวกัน


S1 และ S2 ไม่สามารถมีพิกัด x / y ที่เหมือนกันซึ่งนำไปสู่การหารด้วยศูนย์
zwcloud

0

ทำให้สมมติฐานสองสาม:

  • คุณมีความสนใจในการใช้เมทริกซ์เพื่อความสะดวกและอำนาจ และ
  • คุณคุ้นเคยกับพิกัดที่เป็นเนื้อเดียวกัน

จากนั้นคำถามก็ย้ายไปที่: เมทริกซ์การเปลี่ยนแปลงแบบ Homgeneous สำหรับการเปลี่ยนแปลงพื้นฐานของฉันคืออะไร

เพื่อตอบคำถามนี้เราต้องการคำตอบสำหรับคำถามย่อยสามข้อก่อน:

  1. ต้นกำเนิดของฉันย้ายไปอยู่ที่ไหน
  2. เกิดอะไรขึ้นกับแกน X ของฉัน ให้ (M11, M12) เป็นพิกัดของจุด
  3. เกิดอะไรขึ้นกับแกน Y ของฉัน

กำหนดคำตอบสำหรับคำถามเหล่านี้เป็นดังนี้:

  1. (M31, M32) เป็นพิกัดของต้นกำเนิดใหม่ภายใต้ระบบพิกัดดั้งเดิม
  2. (M11, M12) เป็นพิกัดของหน่วย x-vector ใหม่ในระบบพิกัดดั้งเดิม
  3. (M21, M22) เป็นพิกัดของหน่วย y-vector ใหม่ในระบบพิกัดดั้งเดิม

จากนั้นเมทริกซ์การเปลี่ยนแปลงแบบเอกพันธ์คือ:

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

การประชุมของฉันที่นี่คือจุดที่แสดงโดยเวกเตอร์แถวซึ่งเป็นแบบแผนคอมพิวเตอร์กราฟิกปกติ นักคณิตศาสตร์และนักฟิสิกส์มักใช้สิ่งที่ตรงกันข้าม


ระบบพิกัดสามารถอธิบายได้ด้วยเมทริกซ์เช่น: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = แหล่งกำเนิด X, M32 = แหล่งกำเนิด Y รับเมทริกซ์ระบบพิกัด A และเมทริกซ์ระบบพิกัด B, P * A * Inverse (B) โดยที่ P คือการแทนค่าของจุดเป็นพิกัดใน A ให้ผลการแทนค่าของจุดเป็นพิกัดใน B.
Jim Balter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.