Đại diện bản đồ hình cầu


19

Trò chơi mới nhất của tôi sẽ diễn ra trên một hành tinh nhỏ. Tôi đang tìm kiếm cấu trúc dữ liệu tốt để biểu diễn các tế bào trên bề mặt của một hình cầu. Hình tam giác, hình vuông, hình ngũ giác, hình lục giác? Cái nào giảm thiểu tối đa kéo dài nhất và tạo ra ốp lát tốt nhất?

Ánh xạ hình cầu là dễ nhất nhưng sự kéo dài ở hai cực là không thể chấp nhận được. Việc tạo khối cũng khá dễ dàng nhưng vẫn sẽ có sự kéo dài đáng kể ở gần các góc khối. Việc phân chia một icosahedron có vẻ tốt nhất về độ giãn nhưng có vấn đề về việc lập chỉ mục cho nhiều mảng tam giác và tìm các ô lân cận ở ranh giới sẽ khó khăn.

Tôi đoán rằng tôi có thể sử dụng một mảng các điểm tuyến tính duy nhất đại diện cho N-gons, mỗi điểm có một mảng chỉ số N lân cận, nhưng điều đó có vẻ như là một sự lãng phí không gian rất lớn.

Trò chơi có các yếu tố RTS, vì vậy tôi sẽ lưu trữ những thứ như bản đồ ảnh hưởng và thực hiện tìm đường và tích chập A *, do đó việc biểu diễn phải hiệu quả.


Cấu trúc liên kết chính xác của bản đồ quan trọng như thế nào, trái ngược với việc chỉ để các diễn viên đi theo một hướng và cuối cùng kết thúc nơi họ bắt đầu? Đại diện đơn giản và hiệu quả nhất sẽ là hình xuyến / bánh rán.
congusbongus

1
Vâng, tôi đã đề cập đến ánh xạ hình cầu và các vấn đề nó có với các cực. Tôi muốn lưu trữ các giá trị xung quanh bề mặt vì vậy tôi cần ánh xạ từ điểm bề mặt 3D sang chỉ số mảng với độ giãn càng ít càng tốt.
DaleyPaley

Bạn có thể cố gắng chia nhỏ một tứ diện để tạo một hình cầu. Nó bao gồm các hình tam giác có kích thước và phân phối bằng nhau.
thalador

1
@thalador Cảm ơn bạn đã gợi ý. Không chắc chắn nhưng tôi nghĩ rằng icosahedron tốt hơn tứ diện nếu tôi đi theo con đường tam giác. Nhưng dù sao, tàu không phải là vấn đề. Đó là việc lập chỉ mục mảng hiệu quả đang làm phiền tôi.
DaleyPaley

Câu trả lời:


12

Được rồi, đối với bất cứ ai quan tâm đến chủ đề này, bây giờ tôi sẽ chi tiết giải pháp tôi đã chọn. Cảm ơn mọi người đã trả lời và cho tôi ý kiến.

Đầu tiên, đối với tàu 'tốt nhất', tôi sẽ chọn icosahedron cắt ngắn làm điểm bắt đầu. Việc phân chia nó dẫn đến một hình lục giác rất đẹp với 12 hình ngũ giác cung cấp độ cong. Ngoài ra, tiếp tục phân chia trên kép của nó sẽ cho tôi một lưới tam giác rất tốt để kết xuất với các thuộc tính đẹp. Về 12 ô hình ngũ giác: Tôi có thể bỏ qua chúng, làm cho chúng trở nên đặc biệt (giống như những nơi duy nhất có thể xây dựng căn cứ) hoặc tôi có thể ẩn chúng dưới khung cảnh.

Các ô hình lục giác và hình ngũ giác sẽ được lưu trữ trong cấu trúc dữ liệu nửa cạnh để dễ dàng truy cập vào hàng xóm và di chuyển nhanh. Phần khó khăn duy nhất là tìm ra tế bào nào có điểm thế giới nhất định, nhưng điều đó có thể được thực hiện bằng cách bắt đầu tại một ô ngẫu nhiên và đi về phía điểm qua hàng xóm.

Tôi hy vọng ai đó tìm thấy thông tin này hữu ích. Tôi đã học được rất nhiều và mong muốn nhận được một số kết quả.

Chỉnh sửa:

Dưới đây là hình ảnh hiển thị kết quả của phân khu icosahedron của tôi và chuyển đổi lưới kép sử dụng cấu trúc dữ liệu nửa cạnh.

Tôi có thể thực hiện một vài lần thư giãn để có được các vùng tế bào đồng đều hơn.

phân khu icosahedron


7

Có một cách để làm điều này khá thanh lịch dựa trên việc phân chia một khối hình chữ nhật, như bạn đã đề xuất trong câu hỏi của mình. Một hình tam giác được tạo thành từ 20 hình tam giác đều và các hình tam giác này có thể được nhóm thành 5 bộ, trong đó 4 hình tam giác trong một bộ tạo thành hình bình hành:

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

.

Nếu các hình tam giác này được chia thành các hình tam giác nhỏ hơn, toàn bộ hình bình hành có thể được lập chỉ mục giống như một n hình chữ nhật 4n (ví dụ n = 4):

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

Các số trong mỗi ô là số cột của mảng hình chữ nhật. Các quy tắc tìm hàng xóm trong mảng khá đơn giản: hàng xóm ngang chỉ cộng hoặc trừ 1 cột, trong khi hàng xóm dọc là trừ một hàng và cộng một cột, hoặc cộng một hàng và trừ một cột, tùy thuộc vào việc số cột là chẵn hoặc lẻ, tương ứng.

Tuy nhiên, bạn vẫn phải viết một số mã trường hợp đặc biệt để tìm hàng xóm vượt qua ranh giới từ hình bình hành này sang hình bình hành tiếp theo. Có một chút khó khăn vì ở một số nơi, đỉnh hoặc đáy của một hình bình hành sẽ được kết nối với mặt khác, hoặc đỉnh và đáy sẽ được kết nối với một phần bù ngang giữa chúng, v.v. Có thể có cấu trúc nửa cạnh hoặc tương tự cho các hình bình hành sẽ hữu ích ở đây. Tuy nhiên, ít nhất các mối quan hệ là đối xứng giữa tất cả 5 hình bình hành: tất cả chúng đều theo cùng một mô hình ở phía nào được kết nối với phía bên kia của hàng xóm.


Đó thực sự là một đại diện rất tốt đẹp. Mối quan tâm chính của tôi với các phương pháp tam giác là với việc duy trì các mảng tam giác và tất cả các khâu. Vẫn còn một chút khâu ở đây nhưng các mảng là hình chữ nhật. Cảm ơn, rất tốt để biết
DaleyPaley

3

Hmmm - các nhận xét về độ giãn cho thấy bạn đang di chuyển giữa ánh xạ hình cầu và mặt phẳng, đó là những gì dẫn đến biến dạng ở hai cực

Nếu bạn muốn gạch phẳng và đồng đều, bạn chính xác rằng một khối hình chữ nhật, cụ thể là một hình chữ nhật bị cắt cụt là khá phổ biến

Bạn có thể tìm thấy tất cả các ánh xạ khác nhau ở đây - Khối đa diện hình cầu trên wikipedia

Theo như duy trì mối quan hệ giữa các khuôn mặt, đó là một vấn đề cấu trúc liên kết - bạn có thể thấy cạnh có cánh hoặc cạnh bốn hữu ích (và bạn có cơ hội tuyệt vời để gặp một dạng đại số hoàn toàn mới) Cạnh có cánh


Ah, một icosahedron cắt ngắn. Vâng, đó chính xác là những gì tôi cần. Cảm ơn. Ngoài ra, trong khi tôi chưa bao giờ sử dụng cạnh có cánh, tôi đã sử dụng một nửa cạnh rất nhiều cho thao tác lưới nên tôi rất thành thạo trong lĩnh vực đó. Chúc mừng, tôi gần một giải pháp.
DaleyPaley

2

Tôi đoán rằng tôi sẽ đến bữa tiệc muộn một chút, nhưng đây là một giải pháp khả thi có thể được sử dụng để duy trì một thế giới hình cầu có kích thước tùy ý và diện mạo đồng đều.

Điều quan trọng cần hiểu ở đây là thế giới không phẳng, và do đó, việc ốp lát đồng nhất 100% là không thể (điều này tuân theo cái gọi là Định lý bóng lông ). Một số bất thường phải được cho phép, và điều tốt nhất chúng ta có thể hy vọng là trải đều những bất thường đó ra khắp bề mặt, làm cho mỗi cái càng nhỏ càng tốt.

Nó thực sự khá dễ dàng để làm theo cách không xác định. Đầu tiên, chọn N điểm ngẫu nhiên đồng đều xung quanh bề mặt. Đảm bảo rằng các điểm đó thực sự đồng nhất (xem phần Chọn điểm hình cầu , công thức 9-11). Trong bước thứ hai, chúng ta làm cho các điểm đó ít ngẫu nhiên hơn và đồng đều hơn: giả sử tất cả các điểm đó có điện tích âm để chúng đẩy nhau. Mô phỏng chuyển động của các điểm trong một số bước, cho đến khi chúng hội tụ vào trạng thái cân bằng. Cấu hình cuối cùng này của các điểm sẽ cung cấp cho bạn một lưới được phân bố gần như đồng đều xung quanh bề mặt của hình cầu.


1
Tôi chưa bao giờ nghe về lý thuyết bóng lông, nó khá thú vị. Phải ngăn bản thân mình làm những trò đùa puerile. Tôi đã phân phối các điểm trên các mặt cầu trước đó, nhưng vấn đề là đa giác hóa nó chậm hơn nhiều so với việc chia một đa giác. Ngoài ra, hình dạng và hóa trị của các tế bào sẽ không đồng nhất theo ý thích của tôi. Nhưng dù gì cũng cảm ơn.
DaleyPaley
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.