2009-10-25 46 views
7

Tôi đang phát triển một trò chơi video độc lập và đã hoạt động theo giả định rằng bởi vì phím điều khiển trên bộ điều khiển của tôi có một dải chuyển động tròn, nó trả về các tọa độ "tròn"; có nghĩa là, tọa độ Descartes bị ràng buộc vào một khu vực hình tròn (bán kính 1). Trong thực tế, tọa độ là "hình vuông"; ví dụ: vị trí thumbstick trên cùng bên phải đăng ký dưới dạng x = 1, y = 1. Khi tôi chuyển đổi tọa độ từ Descartes sang cực, độ lớn có thể vượt quá 1 - có tác dụng là người chơi có thể di chuyển nhanh hơn theo đường chéo so với chiều dọc hoặc chiều ngang. Vì vậy, để làm rõ, tôi muốn ghi lại vị trí của một ngón tay cái tương tự về hướng và cường độ, trong đó độ lớn nằm trong khoảng từ 0 đến 1. Phím điều khiển trả về tọa độ trên mặt phẳng vuông, vì vậy chỉ cần chuyển đổi tọa độ từ Descartes đến cực là không đủ. Tôi nghĩ rằng tôi cần phải chuyển đổi tọa độ không gian, nhưng đó là nhấn các giới hạn của bộ não khỉ của tôi.Làm cách nào để chuyển đổi tọa độ trên một hình vuông thành các tọa độ trên một vòng tròn?

+0

Có chiếm diện tích "toàn bộ" hay không nó trả về tọa độ nằm trong thứ gì đó trông giống như một vòng tròn? Ví dụ.đảm bảo rằng bạn có thể (hoặc không thể) lấy độ lớn sqrt. –

+0

(x, y) bạn nhận được gì với thanh thẳng lên? Ngoài ra, là thanh analog của bạn hoặc chuyển mạch? Bạn có thể nhận được các giá trị như (0,5,0,5) không? – Nosredna

+0

Có, tọa độ được phân phối trên một hình vuông, kể cả các góc. – Metaphile

Trả lời

15

Xem Mapping a Square to a Circle. Ngoài ra còn có một hình ảnh đẹp cho việc lập bản đồ. Bạn nhận được:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2) 
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2) 
+0

Dựa trên hình ảnh, tôi nghĩ rằng đây là _exactly_ những gì tôi muốn. Cảm ơn bạn! – Metaphile

0

Chia từng giá trị theo độ lớn để chuẩn hóa tất cả các giá trị thành vectơ đơn vị, ví dụ:

magn = sqrt(x * x + y * y); 
newx = magn > 1.0 ? x/magn : x; 
newy = magn > 1.0 ? y/magn : y; 

Tuy nhiên, điều này có thể có tác dụng cắt độ lớn thay vì bình thường cho các giá trị nội thất .. Đó là, bạn sẽ nhận được cùng một giá trị cho một bộ điều khiển đẩy "đầy đủ" vào phía trên bên trái và bộ điều khiển gần như được đẩy hoàn toàn vào cùng một hướng.

+1

Tôi chắc chắn không muốn cắt độ lớn. Tôi đã có một deadzone. Cả hai cùng nhau sẽ làm giảm đáng kể phạm vi hiệu quả của chuyển động. Tôi nghĩ Eemeli có ý tưởng đúng. – Metaphile

8

Ánh xạ không phải là duy nhất. Có nhiều giải pháp khác cho câu hỏi này.

Ví dụ, lập bản đồ này cũng sẽ làm việc

u = x √ (x² + y² - x²y²)/√ (x² + y²)

v = y √ (x² + y² - x²y²)/√ (x² + y²)

nơi (u, v) là tọa độ đĩa tròn và (x, y) là tọa độ vuông.

Một bức tranh trị giá một nghìn chữ, vì vậy, dưới đây là một số hình ảnh minh họa tính không độc đáo của ánh xạ và nghịch đảo của nó.

circular Brady bunch


squared Boston Celtics

For a C++ implementation lập bản đồ khác này, hãy vào
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
Xem http://squircular.blogspot.com để biết thêm hình ảnh về kết quả lập bản đồ.

Xem thêm "Analytical Methods for Squaring the Disc" cho bài báo thảo luận về các phương trình ánh xạ khác nhau với bằng chứng và dẫn xuất.

+0

Tuyệt. Làm thế nào bạn tạo ra các số liệu (ngôn ngữ/thư viện)? – Praxeolitic

+1

Tôi đã viết một chương trình xử lý hình ảnh đơn giản trong C++ sử dụng các phương trình ánh xạ khác nhau trên mỗi pixel. Xem liên kết đến liên kết mã mẫu. Libpng hữu ích khi đọc và ghi ra các tệp PNG –

Các vấn đề liên quan