Làm thế nào để chuyển đổi tọa độ chuột thành chỉ mục đẳng cự?


21

Tôi vẽ bản đồ đẳng cự với ô 64x32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

Hình ảnh, minh họa mã này:

Hình ảnh, minh họa mã này:

Kính gửi các chuyên gia, xin vui lòng giúp đỡ với một công thức chuyển đổi tọa độ chuột trong các chỉ số đẳng cự của một tế bào. Ví dụ: (105; 100) -> [1; 4].


có thể trùng lặp với kết xuất và chọn Isometric?
bummzack

Lưu ý bên lề: Nếu bạn không thực sự muốn truy cập giá trị trước đó của biến bạn đang tăng, như trong while(val = arr[i++])các công trình tương tự, thì đừng sử dụng nó . Sử dụng ++a++bthay vào đó.
Martin Sojka

Câu trả lời:


25

Bạn cần xác định ma trận biến đổi từ tọa độ không gian ô vuông sang tọa độ không gian màn hình, sau đó tính ma trận nghịch đảo cho ma trận này, khi áp dụng cho tọa độ không gian màn hình sẽ chuyển đổi chúng thành tọa độ không gian ô.

Nhân tiện: Phần bù của bạn thực sự đang chỉ đến một vị trí (0,0, 1,0) trong bất kỳ hệ tọa độ lành mạnh nào, nhưng đó không phải là vấn đề lớn, chỉ là điều cần lưu ý. Điều này có nghĩa là phần bù của gốc tọa độ của hệ tọa độ được chuyển đổi của bạn là (Offset + 32, 0).


Trường hợp cụ thể

Những gì bạn về cơ bản đang làm để chuyển đổi tọa độ không gian gạch (a, b) thành tọa độ không gian màn hình (x, y) là để chạy nó thông qua ma trận biến đổi sau:

nhập mô tả hình ảnh ở đây

Định nghĩa: ab cho ô (0, 0) nằm trong phạm vi [0,0, 1,0) với (0,0, 0,0) là góc trên, (1,0, 1,0) góc dưới, (0,0, 1,0) góc bên trái và (1.0, 0.0) góc phải trong không gian màn hình.

Chúng tôi mở rộng các định nghĩa tọa độ bằng tọa độ thứ ba không đổi (luôn luôn chính xác là 1) để có thể kết hợp bản dịch vào ma trận.

Bây giờ bạn có thể tạo ma trận nghịch đảo cho phép chuyển đổi này. Công thức cơ bản là:

nhập mô tả hình ảnh ở đây

... với Cma trận của các đồng yếu tố cho một .

Trong trường hợp của bạn, yếu tố quyết định | Một | luôn luôn là 1024, bất kể giá trị bù, vì vậy ma trận nghịch đảo là:

nhập mô tả hình ảnh ở đây


Tính toán ví dụ

Bây giờ, cho dữ liệu ví dụ của bạn ...

Đặt số của bạn để bù vào công thức và bạn nhận được:

nhập mô tả hình ảnh ở đây

Nhân (105, 100, 1) (tọa độ màn hình) với ma trận giúp bạn:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Vì tọa độ thứ ba luôn là 1, chúng ta không phải tính toán nó. Làm tròn xuống đến số nguyên gần nhất và bạn nhận được (1, 4) làm tọa độ không gian ô của mình, như mong đợi.


Ma trận chiếu tổng quát

Nếu bạn có một phối cảnh như thế này với mỗi ô có chiều rộng 2 w (ví dụ 64, thì w = 32) và 2 h chiều cao (ví dụ 32, vì vậy h = 16) và phần bù của điểm gốc trong không gian màn hình lần lượt là f x và f y cho trục ngang và trục dọc (ví dụ 192 và 0), các ma trận trông như sau.

Không gian gạch để không gian màn hình

nhập mô tả hình ảnh ở đây

Không gian màn hình để không gian gạch

nhập mô tả hình ảnh ở đây

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.