2012-12-05 28 views
5

Tôi đang tạo một chuỗi đường dẫn SVG lớn đại diện cho biểu đồ dạng đường.Đơn giản hóa chuỗi đường dẫn SVG bằng cách giảm số lượng nút

Bên dưới biểu đồ Tôi có thanh trượt để chọn một lát phạm vi thời gian. Đằng sau thanh trượt là bản xem trước mini của toàn bộ biểu đồ đường kẻ.

Tôi hiện đang thu nhỏ đường dẫn để tạo bản xem trước tuy nhiên khi làm như vậy, tôi sẽ kết thúc với hàng chục nút trên mỗi pixel và do đó, chi tiết hơn rất cần thiết. Tất nhiên điều này cho phép trình duyệt hiển thị nhiều hơn là phải làm.

Có rất nhiều thông tin có sẵn khi nén chuỗi svg (gzipping v.v.), mặc dù ít trên các thuật toán thực sự đơn giản hóa đường dẫn bằng cách giảm các nút.

Tôi đang sử dụng Raphaeljs và đang tìm kiếm giải pháp dựa trên javascript. Bất kỳ ý tưởng?

+0

bạn có một ví dụ về con đường 'd' thuộc tính? ví dụ .. lostsource

+1

Bạn đang tải đường dẫn "độ phân giải" đầy đủ bằng cách hiển thị nó lớn, hiệu suất nhấn để hiển thị lại lần nữa trong hình thu nhỏ phải nhỏ, ít hơn nhiều hơn là có thuật toán đơn giản hóa đường dẫn. – Duopixel

+0

@Duopixel: Tôi không nghĩ đó là sự thật. Bạn sẽ có cùng một đường dẫn xuất hiện hai lần trong DOM. Tôi sẽ rất ngạc nhiên nếu các trình duyệt sẽ tối ưu hóa cho điều đó. Ngoài ra, như tôi đã hiểu, bản xem trước mini sẽ không có tỷ lệ khung hình giống như đường dẫn đầy đủ - cũng chiều rộng nét có thể khác (sẽ có ý nghĩa để làm cho nó hơi nặng hơn so với biểu đồ kích thước đầy đủ). –

Trả lời

11

Simplify.js có lẽ là những gì bạn đang chăm sóc.

Với biểu đồ đường thẳng của bạn bao gồm các đoạn đường thẳng chỉ (mà theo định nghĩa nó nên), bạn có thể sử dụng nó như thế này:

var tolerance = 3 
    var pathSegArray = [] 
    for (var i=0; i<path.pathSegList.numberOfItems; i++) { 
    pathSegArray.push(path.pathSegList.getItem(i)) 
    } 
    var newPathArray = simplify(pathSegArray,tolerance) 
    var newD = "M"; 
    for (i=0; i<newPathArray.length; i++) { 
    newD += newPathArray[i].x + " " + newPathArray[i].y + " " 
    } 
    path.setAttribute("d",newD) 
+0

Thật không may, điều này dường như không hoạt động trong Chrome. –

+3

Đã thay đổi mã để hoạt động với Chrome –

+0

Không phù hợp với các đường cong, A, C, Q, T, S, v.v. – cuixiping

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