Tôi đã làm việc trên một dự án trực quan hóa cho dữ liệu liên tục 2 chiều. Đó là loại điều bạn có thể sử dụng để nghiên cứu dữ liệu độ cao hoặc các mẫu nhiệt độ trên bản đồ 2D. Ở cốt lõi của nó, nó thực sự là một cách làm phẳng 3 chiều thành hai chiều cộng với màu sắc. Trong lĩnh vực nghiên cứu cụ thể của tôi, tôi không thực sự làm việc với dữ liệu độ cao địa lý, nhưng đó là một ẩn dụ tốt, vì vậy tôi sẽ gắn bó với nó trong suốt bài đăng này.Vẽ Bản đồ địa hình
Nhưng dù sao, vào thời điểm này, tôi có một "màu liên tục" renderer rằng tôi rất hài lòng với:
Gradient là tiêu chuẩn màu bánh, nơi pixel màu đỏ chỉ ra tọa độ với giá trị cao và điểm ảnh màu tím cho biết giá trị thấp.
Cấu trúc dữ liệu cơ bản sử dụng thuật toán nội suy rất thông minh (nếu tôi tự nói) để cho phép phóng to sâu tùy ý vào chi tiết của bản đồ. Tại thời điểm này, tôi muốn vẽ một số đường viền địa hình (sử dụng đường cong bezier bậc hai), nhưng tôi đã không thể tìm thấy bất kỳ tài liệu tốt nào mô tả các thuật toán hiệu quả để tìm ra những đường cong đó.
Để cung cấp cho bạn một ý tưởng cho những gì tôi đang suy nghĩ về, đây là thực hiện một kém của con người (trong đó các renderer chỉ sử dụng một giá trị RGB đen bất cứ khi nào nó gặp một điểm ảnh mà nó phân cắt một đường đồng mức):
có một số vấn đề với cách tiếp cận này, mặc dù:
khu vực của đồ thị với một kết quả có độ dốc dốc trong dòng topo mỏng hơn (và thường bị hỏng). Lý tưởng nhất, tất cả các dòng topo nên liên tục.
Các khu vực của biểu đồ có độ dốc phẳng hơn dẫn đến các đường trên cùng rộng hơn (và thường là toàn bộ vùng màu đen, đặc biệt là ở chu vi ngoài của vùng hiển thị).
Vì vậy, tôi đang xem xét phương pháp vẽ vector để có được những đường cong đẹp, dày 1 pixel hoàn hảo này. Cấu trúc cơ bản của thuật toán sẽ phải bao gồm các bước sau:
Ở mỗi độ cao rời rạc mà tôi muốn vẽ một đường topo, tìm một tập hợp các tọa độ nơi cao ở đó phối hợp rất chặt chẽ (đưa ra một giá trị epsilon tùy ý) đến độ cao mong muốn.
Loại bỏ các điểm dư thừa. Ví dụ, nếu ba điểm nằm trong một đường thẳng hoàn hảo, thì điểm trung tâm là thừa, vì nó có thể được loại bỏ mà không thay đổi hình dạng của đường cong. Tương tự như vậy, với đường cong bezier, nó thường có thể loại bỏ các điểm neo cetain bằng cách điều chỉnh vị trí của các điểm kiểm soát liền kề.
Tập hợp các điểm còn lại thành một chuỗi, sao cho mỗi đoạn giữa hai điểm xấp xỉ với quỹ đạo trung lập cao, và sao cho không có hai đoạn đường nào đi qua đường. Mỗi chuỗi điểm phải tạo một đa giác khép kín hoặc phải giao nhau với hộp giới hạn của vùng hiển thị.
Đối với mỗi đỉnh, tìm một cặp điểm kiểm soát sao cho đường cong kết quả biểu thị lỗi tối thiểu, đối với các điểm dư thừa được loại bỏ trong bướC# 2.
Đảm bảo rằng tất cả các đối tượng địa lý có thể nhìn thấy ở thang tỷ lệ hiển thị hiện tại được thể hiện bằng các dòng đầu thích hợp. Ví dụ, nếu dữ liệu chứa một cành với độ cao cao, nhưng với đường kính cực nhỏ, các đường topo vẫn nên được vẽ. Bạn chỉ nên bỏ qua các đối tượng địa lý dọc nếu đường kính của đối tượng địa lý nhỏ hơn độ chi tiết hiển thị tổng thể của hình ảnh.
Nhưng ngay cả dưới những khó khăn, tôi vẫn có thể nghĩ đến chẩn đoán khác nhau cho việc tìm kiếm các dòng:
Tìm các điểm cao trong rendering bounding-box. Từ điểm cao đó, du lịch xuống dốc dọc theo nhiều quỹ đạo khác nhau. Bất cứ lúc nào đường truyền đi qua một ngưỡng cao, thêm điểm đó vào một xô cao độ cụ thể. Khi đường đi ngang đạt đến mức tối thiểu cục bộ, hãy thay đổi khóa học và đi lên dốc.
Thực hiện truyền tải có độ phân giải cao dọc theo hộp giới hạn hình chữ nhật của vùng hiển thị. Tại mỗi ngưỡng độ cao (và tại các điểm uốn, bất cứ nơi nào độ dốc đảo chiều), hãy thêm các điểm đó vào một xô cao độ cụ thể. Sau khi hoàn thành việc truyền tải ranh giới, bắt đầu truy tìm vào trong từ các điểm ranh giới trong các nhóm đó.
Quét toàn bộ vùng hiển thị, thực hiện đo lường độ cao ở khoảng thời gian thường xuyên thưa thớt. Đối với mỗi phép đo, sử dụng nó gần với một ngưỡng cao như một cơ chế để quyết định có hay không để đo lường nội suy của các nước láng giềng. Sử dụng kỹ thuật này sẽ cung cấp bảo đảm tốt hơn về vùng phủ sóng trên toàn bộ vùng hiển thị, nhưng sẽ rất khó để tập hợp các điểm kết quả thành một thứ tự hợp lý để xây dựng đường dẫn.
Vì vậy, đó là một số suy nghĩ của tôi ...
Trước khi lặn sâu vào một thực hiện, tôi muốn xem liệu bất cứ ai khác trên StackOverflow có nhiều kinh nghiệm với loại này của vấn đề và có thể cung cấp gợi ý cho thực hiện chính xác và hiệu quả.
Edit:
Tôi đặc biệt quan tâm đến các "Gradient" gợi ý do ellisbben. Và cấu trúc dữ liệu cốt lõi của tôi (bỏ qua một số các phím tắt nội suy tối ưu hóa) có thể được biểu diễn dưới dạng tổng kết của một tập hợp các hàm gaussian 2D, có thể hoàn toàn khác biệt.
Tôi cho rằng tôi sẽ cần cấu trúc dữ liệu để biểu thị độ dốc ba chiều và hàm để tính vectơ độ dốc đó tại điểm tùy ý. Trên đỉnh đầu của tôi, tôi không biết làm thế nào để làm điều đó (mặc dù nó có vẻ như nó phải dễ dàng), nhưng nếu bạn có một liên kết giải thích toán học, tôi sẽ có nhiều nghĩa vụ!
UPDATE:
Nhờ sự đóng góp xuất sắc của ellisbben và Azim, bây giờ tôi có thể tính toán góc đường viền cho bất kỳ điểm tùy ý trong lĩnh vực này. Vẽ các đường topo thực sẽ sớm theo dõi!
Dưới đây là các kết xuất được cập nhật, có và không có trình kết xuất đồ họa dựa trên đường rạch mà tôi đã sử dụng. Mỗi hình ảnh bao gồm một nghìn điểm mẫu ngẫu nhiên, được biểu thị bằng các chấm đỏ. Góc đường viền tại điểm đó được biểu diễn bằng một vạch trắng. Trong một số trường hợp nhất định, không thể đo độ dốc tại điểm đã cho (dựa trên độ chi tiết của phép nội suy), do đó, chấm đỏ xảy ra mà không có đường góc-đường viền tương ứng.
Tận hưởng!
(LƯU Ý: Các kết xuất này sử dụng địa hình bề mặt khác với kết xuất trước đó - vì tôi tạo ngẫu nhiên các cấu trúc dữ liệu trên mỗi lần lặp lại, trong khi tôi đang tạo mẫu - nhưng phương pháp kết xuất lõi giống nhau chắc chắn bạn sẽ có được ý tưởng)
Dưới đây là một thực tế thú vị:. qua trên tay phía bên phải của các render, bạn sẽ thấy một loạt các đường viền lạ dòng ở ngang và dọc hoàn hảo góc ical. Đây là hiện vật của quá trình nội suy, sử dụng một mạng lưới các bộ nội suy để giảm số lượng tính toán (khoảng 500%) cần thiết để thực hiện các hoạt động dựng hình lõi. Tất cả những đường viền kỳ lạ này xuất hiện trên ranh giới giữa hai ô lưới nội suy.
May mắn thay, những hiện vật đó không thực sự quan trọng. Mặc dù các hiện vật có thể phát hiện được trong khi tính toán độ dốc, trình kết xuất cuối cùng sẽ không nhận thấy chúng, vì nó hoạt động ở độ sâu bit khác nhau.
CẬP NHẬT LẠI:
Aaaaaaaand, như một niềm đam mê cuối cùng trước khi tôi đi ngủ, đây là một cặp render, một trong những trường học cũ "màu liên tục" phong cách, và một với 20.000 mẫu dốc . Trong tập hợp các kết xuất này, tôi đã loại bỏ chấm đỏ cho các điểm mẫu, vì nó không cần thiết làm xáo trộn hình ảnh.
Ở đây, bạn thực sự có thể thấy các đồ tạo tác nội suy mà tôi đã đề cập trước đó, nhờ cấu trúc lưới của bộ sưu tập nội suy. Tôi nên nhấn mạnh rằng các đồ tạo tác đó sẽ hoàn toàn vô hình trên kết xuất đường viền cuối cùng (vì sự chênh lệch về độ lớn giữa bất kỳ ô nội suy liền kề nào nhỏ hơn độ sâu bit của ảnh được hiển thị).
Bon appetit !!
Tại sao bạn không sử dụng thư viện, công cụ hiện có (chẳng hạn như gnuplot, tecplot)? – jfs
Bạn nói dữ liệu liên tục - điều đó ngụ ý rằng bạn có thể tính toán các giá trị cho các tọa độ liên pixel? – Alnitak
Vâng, tôi có thể tính toán giá trị tại bất kỳ tọa độ nào (với độ chính xác điểm nổi 64 bit). Cấu trúc dữ liệu thực sự là một tập hợp các hàm Gauss 2D, mỗi hàm có biên độ riêng và độ lệch chuẩn của nó, và nội suy sử dụng một Trình Ước lượng Mật độ Hạt nhân để tìm các giá trị trung gian đó. – benjismith