2013-07-29 29 views
12

Trong ví dụ này: http://bl.ocks.org/mbostock/1747543:Tránh va chạm giữa các nút và các cạnh trong D3 bố trí lực lượng

enter image description here

... Mike cho chúng ta thấy làm thế nào để tránh va chạm giữa các nút để không có hai nút chồng lên nhau.

Tôi tự hỏi liệu có thể tránh va chạm giữa các nút và các cạnh sao cho không có nút 'clip' hoặc chồng chéo một cạnh trừ khi nó được kết nối bởi cạnh đó.

Ví dụ sau sử dụng chương trình D3 lực trực tiếp mà nút L trùng lặp với các cạnh nối IA, và tương tự, nút M trùng lặp với các cạnh nối LD. Làm thế nào để chúng tôi ngăn chặn các trường hợp như vậy?

enter image description here

+2

Điều này là không thể thực hiện bố cục lực trong D3. Bạn sẽ cần phải thực hiện điều này cho mình. Lưu ý rằng đây thực sự là một vấn đề rất khó (tính toán), vì vậy ngay cả khi bạn đã thực hiện nó có thể sẽ không muốn chạy nó trong trình duyệt. –

+0

@LarsKotthoff, bạn đang nói, nói chung, không có thuật toán bố cục đồ thị đã biết (bao gồm cả thuật toán được triển khai cho D3) có thể giải quyết vấn đề này hiệu quả? – skyork

+0

Điều đó tùy thuộc vào định nghĩa của bạn về hiệu quả. Để tìm một giải pháp (tĩnh) cho âm thanh này ít nhất là NP-cứng với tôi. Điều này không có nghĩa là nó có thể được giải quyết nhanh chóng trong tất cả các trường hợp cụ thể, nhưng đó là khó khăn nói chung (và đối với các đồ thị lớn, bạn có thể không thể làm điều đó một cách nhanh chóng). Để sau đó thay đổi giải pháp ban đầu như vậy mà các nút sẽ di chuyển nhẹ (như mô phỏng sẽ làm) sẽ rất dễ dàng vì bạn chỉ cần thực hiện sửa chữa cục bộ. –

Trả lời

6

Nếu đồ thị của bạn không có quá nhiều nút, bạn có thể giả mạo nó. Chỉ cần chèn một hoặc nhiều nút cho mỗi liên kết và đặt vị trí của chúng dọc theo liên kết trong trình xử lý tick. Kiểm tra http://bl.ocks.org/couchand/7190660 cho một ví dụ, nhưng những thay đổi số lượng phiên bản Mike Bostock để về cơ bản chỉ:

var linkNodes = []; 

graph.links.forEach(function(link) { 
    linkNodes.push({ 
    source: graph.nodes[link.source], 
    target: graph.nodes[link.target] 
    }); 
}); 

// force.on('tick', function() { 
linkNodes.forEach(function(node) { 
    node.x = (node.source.x + node.target.x) * 0.5; 
    node.y = (node.source.y + node.target.y) * 0.5; 
}); 

này sẽ giới thiệu một buổi biểu diễn trên không khá nghiêm trọng nếu bạn có rất nhiều nút và các cạnh , nhưng nếu đồ thị của bạn không lớn hơn nhiều so với ví dụ của bạn, nó sẽ khó nhận thấy.

Bạn cũng có thể muốn nhấn mạnh với lực tương đối của các nút thực so với các nút liên kết.

Thực hiện thêm một bước nữa và bạn sẽ nhận được các liên kết cong đẹp của http://bl.ocks.org/mbostock/4600693.

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