2009-02-03 13 views
7

Tôi có bộ dữ liệu lớn (dữ liệu 10 Hz, vì vậy 864k điểm trên 24 giờ) mà tôi cần vẽ theo thời gian thực. Ý tưởng là người dùng có thể phóng to và xoay thành các ô phân tán chi tiết cao.Làm cách nào để vẽ chính xác các vectơ dữ liệu lớn ở tất cả các mức thu phóng trong thời gian thực?

Dữ liệu không phải là rất liên tục và có các mức tăng đột biến. Vì tập dữ liệu quá lớn nên tôi không thể vẽ từng điểm mỗi lần cốt truyện làm mới.

Nhưng tôi cũng không thể chỉ vẽ từng điểm thứ n hoặc nếu không tôi sẽ bỏ lỡ các tính năng chính như gai lớn nhưng ngắn.

Matlab làm đúng. Bạn có thể cung cấp cho nó một véc tơ 864k đầy 0 và chỉ cần đặt bất kỳ điểm nào thành 1 và nó sẽ vẽ chính xác trong thời gian thực với thu phóng và chảo.

Matlab làm như thế nào?

Hệ thống đích của tôi là Java, vì vậy tôi sẽ tạo ra các khung nhìn của ô này trong Swing/Java2D.

+0

Tôi không thực sự hiểu những gì bạn đang yêu cầu ở đây. Bạn có thể thêm một ví dụ mã về cách bạn đang vẽ sơ đồ dữ liệu trong MATLAB? – gnovice

+0

Câu hỏi của bạn là câu hỏi Java hay câu hỏi của Matlab? –

+0

Tôi tự hỏi làm thế nào Matlab hiện nó, vì vậy tôi tái sản xuất nó trong Java – Pyrolistical

Trả lời

4

Bạn nên cố gắng tập tin từ MATLAB trung ương:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot-downsampled-plot

Từ tác giả:

Phiên bản này của "âm mưu" sẽ cho phép bạn hiển thị dữ liệu mà có rất nhiều yếu tố. Vẽ các tập dữ liệu lớn làm cho đồ họa của bạn chậm chạp, nhưng hầu hết thời gian bạn không cần tất cả thông tin được hiển thị trong cốt truyện. Màn hình của bạn chỉ có quá nhiều điểm ảnh và mắt của bạn sẽ không thể phát hiện bất kỳ thông tin nào không được chụp trên màn hình.

Chức năng này sẽ rút ngắn dữ liệu và chỉ vẽ một tập con của dữ liệu, do đó cải thiện yêu cầu bộ nhớ. Khi ô được phóng to, nhiều thông tin hơn sẽ được hiển thị. Một số công việc được thực hiện để đảm bảo rằng các ngoại lệ bị bắt.

Cú pháp:

dsplot(x, y) 
dsplot(y) 
dsplot(x, y, numpoints) 

Ví dụ:

x =linspace(0, 2*pi, 1000000); 
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x); 
dsplot(x,y1); 
2

Tôi không biết làm thế nào Matlab thực hiện nó, nhưng tôi muốn bắt đầu với Quadtrees.

Dump tất cả các điểm dữ liệu của bạn vào quadtree, sau đó hiển thị ở mức thu phóng nhất định, bạn đi xuống quadtree (bắt đầu với các khu vực chồng chéo những gì bạn đang xem) cho đến khi bạn đạt đến các khu vực có thể so sánh với kích thước của một pixel. Dán một điểm ảnh ở giữa khu vực đó.

đã thêm: Làm bản vẽ của bạn với OpenGL/JOGL cũng sẽ giúp bạn có bản vẽ nhanh hơn. Đặc biệt là nếu bạn có thể dự đoán việc quét và xây dựng các điểm để hiển thị trong danh sách hiển thị hoặc một thứ gì đó, để bạn không phải làm bất kỳ công việc CPU nào cho các khung hình mới.

0

Dữ liệu 10Hz có nghĩa là bạn chỉ phải vẽ 10 khung hình mỗi giây. Nó sẽ được dễ dàng, kể từ khi nhiều trò chơi đạt được> 100 khung hình/giây với đồ họa phức tạp hơn nhiều.

Nếu bạn vẽ 10 pixel mỗi giây cho mỗi điểm dữ liệu có thể, bạn có thể hiển thị một giá trị dữ liệu phút bằng cách sử dụng tiện ích mở rộng 600 pixel. Nếu bạn lưu chỉ mục từ mẫu 600 đến mẫu cuối cùng thì sẽ dễ dàng chỉ vẽ dữ liệu mới nhất.

Nếu bạn không có điểm dữ liệu mới cứ sau mỗi 10 giây, bạn phải tìm ra cách chèn điểm dữ liệu nội suy. Ba lựa chọn cần lưu ý:

  1. Lặp lại điểm dữ liệu cuối cùng.
  2. Chèn điểm dữ liệu "trống". Điều này sẽ gây ra khoảng trống trong biểu đồ.
  3. Không cập nhật biểu đồ cho đến khi điểm dữ liệu tiếp theo đến. Sau đó chèn tất cả các điểm ảnh bạn không vẽ cùng một lúc, với nội suy tuyến tính giữa các điểm dữ liệu.

Để làm cho hoạt ảnh mượt mà sử dụng double-buffering. Nếu ngôn ngữ đích của bạn hỗ trợ tiện ích canvas, nó có thể hỗ trợ đệm đôi.

Khi thu phóng, bạn có cùng ba lựa chọn như trên, vì các điểm dữ liệu được thu phóng không liên tục ngay cả khi các điểm dữ liệu ban đầu là.

This có thể giúp thực hiện nó trong Java.

+0

Xin lỗi, khi tôi nói "thời gian thực", tôi có nghĩa là âm mưu phải xảy ra trong thời gian đọc, nhưng dữ liệu là tĩnh. – Pyrolistical

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