Làm cách nào để chuyển đổi giữa hai hệ tọa độ 2D khác nhau?


10

Tôi đang cố gắng chuyển đổi tọa độ từ hệ tọa độ này sang hệ tọa độ khác, để tôi có thể vẽ nó trên hình ảnh.

Về cơ bản hệ tọa độ đích như sau:

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

(chỉ là một hình ảnh tiêu chuẩn tôi đang vẽ với kích thước 1066 x 1600)

Vị trí tôi đang cố vẽ lên hình ảnh thực sự có cùng kích thước, nhưng hệ tọa độ thì khác. Khoảng tất cả các tọa độ là 1066x1600.

Nhưng một ví dụ phối hợp sẽ là:

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

Phạm vi của hệ tọa độ này là:

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

Tôi cảm thấy như đây là toán học RẤT đơn giản, nhưng vì một số lý do tôi không đạt được nó.

Làm cách nào để chuyển đổi tọa độ được cung cấp thành hệ tọa độ đầu tiên?


3
Nếu hai hệ tọa độ có cùng vectơ cơ sở, bạn chỉ cần sử dụng hệ số tỷ lệ. Nếu chúng không có cùng vectơ cơ sở thì cần phải thay đổi cơ sở .
thalador

Câu trả lời:


7

Bạn có thể bình thường hóa giá trị đầu tiên, điều này sẽ cung cấp cho bạn một giá trị trong phạm vi [0,1]. Bạn có thể nghĩ rằng đó là phần trăm X, tỷ lệ phần trăm giá trị ánh xạ giữa giá trị tối thiểu và tối đa. Sau đó, bạn có thể tìm thấy phần trăm đó thuộc về hệ tọa độ đích của bạn bằng cách xem giá trị nào là phần trăm X thông qua hệ thống đích. Tôi sẽ sử dụng mã Java làm ngôn ngữ mẫu, tôi chắc chắn các khái niệm đủ rõ ràng để dịch sang bất kỳ ngôn ngữ nào.

Vì vậy, bình thường hóa:

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

Sử dụng ví dụ của bạn, bạn nhập:

xPercent = normalize(x,0,1066);

Sau đó tìm nơi nó nằm trong hệ thống đích. Với cái gì đó như

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

Hoặc để sử dụng các giá trị của bạn:

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

Vì vậy, ví dụ với giá trị x là 1000, bạn sẽ ánh xạ tới hệ tọa độ đích của mình 467.29.

Ngoài ra , nếu các hệ tọa độ sẽ luôn giống nhau, bạn có thể tính toán trước tỷ lệ giữa chúng.

Vì thế:

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

destX = x*xRatio+destMin;

Tại sao Java (C #)? Anh ấy đã không yêu cầu mã Java :)
kravemir

6
Đó là một ví dụ. Nó không cần phải được sử dụng như hiện tại, và khái niệm này là đủ rõ ràng.
MichaelHouse

Nhưng nếu tôi làm điều này: DestX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Tôi luôn nhận được giá trị âm và hệ tọa độ kết quả chỉ từ 0-1066, tôi có nên chuyển tất cả các tọa độ xung quanh không?
Geesu

Chuyển đổi chúng xung quanh và tôi vẫn nhận được dump.tanaris4.com/sota.png giống như trong một bài đăng khác, có thể tôi đang gặp vấn đề khác hoàn toàn (liên quan đến C # và bản vẽ). Cảm ơn các bạn!
Geesu

Chấn nó, vì một lý do tôi phải làm xPercent = 1.0f - xPercent
Geesu

4

Đây là một phép toán đơn giản:

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

src - hệ tọa độ nguồn

hệ thống điều phối kết quả

Chỉnh sửa - giải thích toán học

( src - src_min ) / ( src_max - src_min )dịch nó sang hệ tọa độ bắt đầu từ 0 với độ dài bằng nhau của hệ tọa độ nguồn (0.0, src_max - src_min ). Sau đó, nó quy mô giá trị để phối hợp hệ thống (0.0, 1.0).

* ( res_max - res_min ) thang đo này có giá trị để phối hợp hệ thống bắt đầu từ 0 với độ dài của hệ thống phối hợp kết quả (0.0, dst_max - dst_min)

+ res_min chuyển giá trị sang hệ tọa độ kết quả (dst_min, dst_max)


Tôi cũng nghĩ vậy, nhưng nó không hiển thị đúng: dump.tanaris4.com/sota.png Tọa độ cuối cùng sẽ chạm vào nơi vòng tròn trắng ở dưới cùng
Geesu

1
Điều này không giải thích cho họ toán học, tại sao không? :)
MichaelHouse

@ Byte56 Đối với tôi là công thức đủ để hiểu một cái gì đó đặc biệt là nếu nó chỉ sử dụng các phép toán số học, nhưng tôi đã thêm lời giải thích cho những người sẽ cần nó :)
kravemir

1
@Geesu Sau đó, có lẽ bạn đang làm điều gì đó xấu (kết xuất ma trận?).
kravemir

2
Cảm ơn đã cập nhật điều đó. Tôi thường nghĩ rằng tốt hơn là đưa ra một câu trả lời cố gắng giải thích lý do tại sao. Nếu không, bạn chỉ đưa ra câu trả lời cho câu hỏi này, thay vì làm thế nào để giải quyết câu hỏi này các vấn đề tương tự. Đó là kiểu "cho một người một con cá, dạy một người đàn ông câu cá".
MichaelHouse

3

Phương trình cơ bản cho chuyển đổi tọa độ 2D (theo đại số, không liên quan đến phép quay) là:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

đã cho hai điểm trong TargetCoordine (T1, T2) tương ứng với hai điểm trong SourceCoordine (S1, S2) TranslateFactorScalingFactorđược đưa ra bằng cách giải:

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

kết quả nào:

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

Trong trường hợp của bạn, cho tọa độ x

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

Và như vậy,

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

y phối hợp theo cùng một thủ tục


S1 và S2 không thể có cùng tọa độ x / y dẫn đến chia cho 0.
zwcloud

0

Đưa ra một vài giả định:

  • Bạn (cuối cùng) quan tâm đến việc áp đặt ma trận, để thuận tiện và sức mạnh; và
  • Bạn đã quen thuộc với tọa độ đồng nhất.

Sau đó, câu hỏi chuyển sang: Ma trận biến đổi đồng nhất cho sự thay đổi cơ sở của tôi là gì?

Để trả lời điều này, trước tiên chúng ta cần có câu trả lời cho ba câu hỏi phụ:

  1. Nguồn gốc của tôi đã chuyển đến đâu?
  2. Điều gì đã xảy ra với trục X của tôi? Đặt (M11, M12) là tọa độ của điểm
  3. Điều gì đã xảy ra với trục Y của tôi?

Xác định câu trả lời cho những câu hỏi này như sau:

  1. (M31, M32) là tọa độ của điểm gốc mới trong hệ tọa độ gốc.
  2. (M11, M12) là tọa độ của vectơ đơn vị mới trong hệ tọa độ ban đầu.
  3. (M21, M22) là tọa độ của vectơ y đơn vị mới trong hệ tọa độ ban đầu.

Thì ma trận biến đổi đồng nhất là:

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

Quy ước của tôi ở đây là các điểm được biểu thị bằng các vectơ hàng, là quy ước đồ họa máy tính thông thường; các nhà toán học và vật lý thường sử dụng oppsoite.


Một hệ tọa độ có thể được mô tả bằng một ma trận như vậy: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Cho ma trận hệ tọa độ A và ma trận hệ tọa độ B, P * A * Nghịch đảo (B), trong đó P là biểu diễn của một điểm dưới dạng tọa độ trong A, tạo ra biểu diễn của điểm dưới dạng tọa độ trong B.
Jim Balter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.