Hệ mặt trời có thể được biểu diễn chính xác trong không gian 3d bằng cách sử dụng gấp đôi (hoặc dài) không?


15

Tôi muốn biết cách quản lý tọa độ tốt nhất trong trò chơi 3D với mục đích mô hình thực tế toàn bộ hệ mặt trời, nhưng vẫn có thể xử lý các chuyển động nhỏ nhất trong một "con tàu" (nghĩa là: có lẽ chúng ta có thể coi 1cm là nhỏ nhất chuyển động chấp nhận được cho một khung). Các nhân đôi 64 bit (hoặc dài 64 bit) có hỗ trợ điều này không, hay chúng ta gặp vấn đề tràn? Nếu không, thì nên sử dụng dài hay gấp đôi, hoặc nếu vậy, bạn nghĩ cách tiếp cận thay thế nào là hợp lý nhất để mô hình hóa các vị trí trong hệ mặt trời trong trò chơi 3D? (tức là: chỉ giữ một chút hệ thống trong màn hình tại một thời điểm dựa trên khoảng cách vận chuyển hoặc hệ thống được thể hiện bằng cách nào đó trong một không gian phối hợp khác, v.v.)


Ngôn ngữ nào bạn đang nhắm mục tiêu: C / C ++? Java? Thứ gì khác?
Laurent Couvidou

4
@lorancou: Không liên quan, anh ấy chỉ định rõ ràng kích thước của long.
DeadMG

@DeadMG Có thể là 32 bit trong C / C ++. 64-bit là nhiều hơn a long long. Nhưng vâng, bất cứ điều gì, gọi nó là nitpicking nếu bạn muốn.
Laurent Couvidou

Chỉ cần sử dụng BigInteger. Hầu hết các ngôn ngữ đều có một số biến thể của nó - giá trị nguyên kích thước không giới hạn (mức sử dụng là O (log (n)))
tro999

Đó có thể là một câu trả lời, với điều kiện trò chơi không quá nặng về điện toán.
Laurent Couvidou

Câu trả lời:


11

Đã có câu trả lời tốt về số nguyên, nhưng tôi cảm thấy không nên loại bỏ các dấu phẩy động. Trong câu trả lời của mình, Byte56 đã chọn tùy chọn để đi theo quỹ đạo tối đa của Sao Diêm Vương, có lẽ được lấy từ bảng excel này , vì vậy tôi sẽ tuân theo điều đó.

Điều đó đặt ranh giới của hệ mặt trời tại:

7.376.000.000 km = 7.376x10 ^ 9 km = 7.376x10 ^ 14 cm ≈ 7.4x10 ^ 14 cm

Các đúp chính xác dấu chấm động định dạng Mời một độ chính xác tối đa 15 số thập phân có ý nghĩa. Vì vậy, bạn thật may mắn: nếu nguồn gốc của bạn ở trung tâm của Mặt trời và bạn sử dụng một vị trí xung quanh Sao Diêm Vương, bạn có thể đại diện cho tất cả các centimet, ví dụ như trong C ++:

printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);

Output:
-------
740000000000000
740000000000001
740000000000002

Vì vậy, nếu bạn có thể giới hạn trò chơi của mình vào quỹ đạo của Sao Diêm Vương, thì xin chúc mừng! Bạn đã có đủ độ chính xác với gấp đôi để thể hiện nó.

Hãy coi chừng, điều đó đủ để thể hiện nó trong một mô phỏng , nhưng đừng hy vọng sẽ thể hiện điều này một cách không đau đớn. Bạn sẽ phải chuyển đổi thành số float 32 bit, có thể thay đổi nguồn gốc của bạn để bạn có đủ độ chính xác trên các vật thể gần gũi và có lẽ bạn sẽ phải dựa vào một số thủ thuật bực bội của bộ đệm Z và máy ảnh để có được tất cả điều này để hiển thị đúng .

Bây giờ, nếu bạn muốn các phi hành gia của bạn đến thăm một số sao chổi ở xa trong đám mây Oort , lớn hơn nhiều, thì nó đã kết thúc. Khoảng 10 ^ 16 cm, bạn bắt đầu mất độ chính xác:

printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);

Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002

Và nó trở nên tồi tệ hơn nữa, tất nhiên.

Vì vậy, nếu bạn trong trường hợp này, bạn có thể muốn thử một số giải pháp nâng cao hơn. Tôi khuyên bạn nên xem bài viết của Peter Freeze trong Lập trình trò chơi Gems 4: "2.3 Giải quyết các vấn đề chính xác trong các tọa độ thế giới rộng lớn". IIRC, ông đề xuất một hệ thống có thể phù hợp với nhu cầu của bạn, đó thực sự là một loại nhiều không gian phối hợp khác nhau.

Đó chỉ là một số gợi ý, có lẽ bạn sẽ phải sử dụng một số công thức của riêng bạn để có được hoạt động này. Ai đó đã thực hiện loại công cụ đó có thể giúp bạn nhiều hơn. Tại sao không gửi email cho những kẻ đứng sau Chương trình Không gian Kerbal chẳng hạn?

Chúc may mắn với trò chơi của bạn!


1
Câu trả lời này là tốt vì nó ánh xạ dễ dàng hơn vào không gian dấu phẩy động 3d được sử dụng bởi OpenGL và DirectX và có các tài liệu tham khảo tốt. Do đó, tôi đã đánh dấu nó là câu trả lời :)
Nicholas Hill

Thật tuyệt :) Như một phần thưởng, vì đây là tất cả rất gần đúng, bạn sẽ tìm thấy một số thông tin chuyên sâu về phao trong blog của Bruce Dawson: Randomascii.wordpress.com/2012/05/20/ .
Laurent Couvidou

17

Giả sử Sao Diêm Vương cho "cạnh" của hệ mặt trời (mặc dù một số người nói rằng nó cách xa 3 năm ánh sáng). Sao Diêm Vương, ở quỹ đạo tối đa của nó cách mặt trời khoảng 7.376.000.000 km. Đó là 7.37600 × 10 ^ 14 cm. Nhân đôi số đó để có đường kính và bạn sẽ nhận được 1.485.200.000.000.000 cm. Đó cũng là trong kích thước tối đa của một 64 bit dài. Vì chiều cao của hệ mặt trời không đáng kể so với đường kính của nó, chúng ta có thể bỏ qua điều đó.

Vì vậy, có, bạn có thể sử dụng một thời gian dài để thể hiện vị trí của bạn trong hệ mặt trời. Trên thực tế, bạn có thể có các vị trí cách xa 9,75 năm ánh sáng với một chữ ký dài (gấp đôi cho không dấu).

Lưu ý rằng đây không phải là trường hợp để tìm khoảng cách. Khoảng cách tối đa bạn có thể tìm thấy là căn bậc hai của khoảng cách tối đa bạn có thể đi tới. Điều này có thể được khắc phục bằng cách sử dụng một mức độ của hệ thống chi tiết để tìm khoảng cách. Bạn có thể thực hiện một số kiểm tra đơn giản để đoán khoảng cách bao xa (so sánh giá trị x và giá trị y của chúng), sau đó sử dụng khoảng tăng 1.000.000 km cho khoảng cách lớn xuống khoảng cách centimet cho khoảng cách nhỏ.

Tất nhiên có câu hỏi về, bạn có thực sự muốn? 99,999% hệ mặt trời là không gian trống hoàn toàn không thú vị. Nếu bạn đại diện chính xác cho hệ mặt trời, tôi chắc chắn hy vọng bạn không đại diện chính xác cho vật lý. Phải mất một thời gian dài để đi xung quanh hệ mặt trời. Cách quá dài cho hầu hết mọi người ở lại quan tâm.

Và tại sao thậm chí có độ chính xác tốt như vậy trừ khi bạn cũng sẽ mô hình hóa các vật thể trong hệ mặt trời với độ chính xác đó? Đó là nơi bạn sẽ gặp rắc rối. Thể tích của mặt trời là 1,40900 × 10 ^ 18 km khối. Trên thang đo centimet khối, sử dụng một bit đơn để biểu thị rằng không gian bị "chiếm" chiếm 1,4 × 10 ^ 33 bit hoặc 1,6 × 10 ^ 23 gigabyte. Tôi nghĩ bạn không có nhiều RAM.


3
Khá đẹp trên. Phiên bản ngắn: Độ chính xác nổi là ít lo lắng nhất của bạn.
aaaaaaaaaaaa

1
Bạn sẽ nhận được tràn các số nguyên, thậm chí 64 bit. Tàu vũ trụ quay quanh Sao Diêm Vương. Thử tính khoảng cách từ tàu vũ trụ đến mặt trời. Bình phương. Bùng nổ.
Laurent Couvidou

3
Tôi không đồng ý mạnh mẽ với khẳng định trong đoạn cuối - câu hỏi của OP có ý nghĩa hoàn hảo và người ta không cần phải thực sự có các vật phẩm trong mỗi (centimet) để quan tâm đến độ chính xác 1cm trên các vị trí.
Steven Stadnicki

1
@StevenStadnicki Đủ công bằng, nhưng ngay cả ở quy mô km, nó vẫn là 164.029.188 gigabyte cho 1 bit trên mỗi km. Nó giống như yêu cầu độ chính xác nguyên tử trong đồng hồ tốc độ xe của bạn. Đó chỉ là cách chính xác hơn nó cần phải được.
MichaelHouse

1
Chà, đi đến thang điểm AU hay năm ánh sáng là quá thiếu chính xác. Vì chúng ta đang nói về hệ mặt trời. Năm ánh sáng hoặc phân tích cú pháp sẽ tốt hơn cho một cái gì đó lớn hơn, như một tinh vân lớn.
MichaelHouse

2

Bạn có thể sử dụng BigInteger, bất cứ ngôn ngữ lập trình nào của bạn gọi nó. Đó là một số nguyên có kích thước không giới hạn; nó có tỷ lệ tốt - thường sử dụng log(n)bộ lưu trữ cho một số nguyên kích thước n.

Java và C # có nó; Tôi chắc chắn các ngôn ngữ khác làm. Nếu không, bạn có thể dịch ngược và thực hiện lại mà không gặp quá nhiều khó khăn.

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.