2012-05-23 26 views
6

Tôi là một chút mới đối với SVG và d3.js.Điểm đánh dấu SVG không định hướng đúng trên đường cong d3.svg.diagonal được sử dụng làm liên kết bố cục lực D3

Khi vẽ đồ thị có bố cục lực D3, tôi đang sử dụng trình tạo đường chéo đơn giản và sử dụng điểm đánh dấu để vẽ đầu mũi tên.

Khi sử dụng vòng cung thay vì máy phát đường chéo, đầu mũi tên chỉ xuất hiện tốt. Nhưng sử dụng máy phát điện chéo như trong các mã dưới đây không tạo ra các dấu hiệu thích hợp:

var vis = this.vis = d3.select(el).append("svg:svg") 
    .attr("width", w) 
    .attr("height", h); 

var force = d3.layout.force() 
    .gravity(0.03) 
    .distance(120) 
    .charge(-800) 
    .size([w, h]); 

var linkDiag = d3.svg.diagonal() 
    .projection(function(d) 
    { 
     return [d.x, d.y]; 
    }); 

vis.append("svg:defs") 
     .selectAll("marker") 
    .data(["normal", "special", "resolved"]) 
    .enter() 
     .append("svg:marker") 
    .attr("id", String) 
    .attr("viewBox", "0 -5 10 10") 
    .attr("refX", 15) 
    .attr("refY", -1.5) 
    .attr("markerWidth", 6) 
    .attr("markerHeight", 6) 
    .attr("orient", "auto") 
    .append("svg:path") 
    .attr("d", "M 0,-5 L 10,0 L0,5"); 

... và sau đó thêm:

force.on("tick", function() { 
     link.attr("x1", function(d) { return d.source.x; }) 
      .attr("y1", function(d) { return d.source.y; }) 
      .attr("x2", function(d) { return d.target.x; }) 
      .attr("y2", function(d) { return d.target.y; }) 
     .attr("d", linkDiag) 
     .attr("marker-end", function(d) { return "url(#special)"; }); 

    }); 

Các dấu hiệu không định hướng ở tất cả với các đỉnh.

Bất kỳ trợ giúp sẽ được đánh giá cao!

+0

Bất kỳ cơ hội nào bạn có thể giải quyết vấn đề này? Trong trường hợp của tôi, tôi nhận ra rằng các nút tròn của tôi lớn và điểm đánh dấu đã được hiển thị, nhưng luôn luôn được hiển thị phía sau vòng tròn. Tuy nhiên, tôi vẫn gặp sự cố, xác định giá trị refX, refY, v.v. phù hợp cho điểm đánh dấu:/ – dchang

+0

Tôi cũng tò mò nếu có giải pháp cho vấn đề này. –

Trả lời

0

Bạn có thể chỉ định bạn hỏi thêm một chút không? Tuy nhiên với ngay cả chạy bạn mã Tôi nghĩ rằng bạn có thể là vấn đề

.attr("orient", "auto") 

Cố gắng xác định pos

2

Nó chỉ xuất hiện như thể các mũi tên không chỉ đi đúng hướng bởi vì bạn đang di chuyển mũi tên đến một vị trí mới qua refXrefY.

Ví dụ: hãy xem this code để vẽ đường chéo theo các hướng khác nhau. Các đầu mũi tên xuất hiện chính xác, ngoại trừ đầu mũi tên ở 180 độ, nhưng đó có thể do lỗi làm tròn.

Bây giờ, hãy thử thay đổi refX trên dòng 10 thành giá trị, giả sử 5. Bây giờ, đầu mũi tên gần ngang xuất hiện không chính xác. Để thấy điều này đáng kể hơn, hãy thử thay đổi giá trị thành 8.

Điều đang xảy ra là bạn đang ẩn một phần đường chéo sao cho đường dường như kết thúc tại điểm trước đó, hơi cong hơi khác so với đầu cuối thực tế điểm. Điều tương tự sẽ xảy ra nếu đầu mũi tên quá lớn sao cho nó phủ lên một phần của đường cong. Lưu ý rằng đối với đường chéo trong d3, là đường cong bezier đối xứng, đầu mũi tên phải luôn xuất hiện trỏ hoàn toàn theo chiều ngang hoặc chiều dọc. Bạn có thể thấy chính xác những gì đang xảy ra bằng cách giảm độ mờ đục của đầu mũi tên.

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