2012-05-23 9 views
6

Soy un poco nuevo en SVG y d3.js.Los marcadores SVG no se orientan correctamente en una curva d3.svg.diagonal utilizada como enlace de diseño de fuerza D3

Mientras dibujo un gráfico con el diseño de fuerza D3, estoy usando un generador de líneas diagonales simple y uso de marcador para dibujar cabezas de flecha.

Cuando se utiliza arco en lugar de generador diagonal, las puntas de flecha aparecen bien. Pero el uso del generador en diagonal, como en el siguiente código no produce marcadores adecuados:

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"); 

... y luego también:

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)"; }); 

    }); 

Los marcadores no están orientados en absoluto con los vértices.

¡Cualquier ayuda sería apreciada!

+0

¿Alguna posibilidad de que haya podido resolver esto? En mi caso, me di cuenta de que mis nodos circulares eran grandes y el marcador se estaba representando, pero siempre se representaba detrás del círculo. Sin embargo, aún estoy teniendo problemas para determinar los valores apropiados de refX, refY, etc. para el marcador:/ – dchang

+0

También tengo curiosidad por saber si hay una solución para esto. –

Respuesta

0

¿Puede usted especificar su pregunta un poco más? Sin embargo, incluso con la ejecución de código que creo que podría ser un problema

.attr("orient", "auto") 

intenta especificar pos

2

Sólo parece como si las flechas no apuntan en la dirección correcta, ya que está moviendo la punta de flecha a una nueva posición a través de refX y refY.

Por ejemplo, mira this code que dibuja diagonales en varias direcciones. Las puntas de flecha aparecen correctamente, a excepción de la que está a 180 grados, pero es probable que se deba a un error de redondeo.

Ahora, intente cambiar refX en la línea 10 por un valor de, digamos, 5. Ahora, las puntas de flecha cercanas a la horizontal aparecen incorrectas. Para ver esto más dramáticamente, intente cambiar el valor a 8.

Lo que está sucediendo es que está ocultando parte de la diagonal, por lo que la línea parece estar terminando en un punto anterior, que es ligeramente diferente al final real punto. Lo mismo sucederá si la punta de flecha es demasiado grande para que se superponga a una parte de la curva. Tenga en cuenta que para las diagonales en d3, que son curvas de bezier simétricas, las puntas de flecha siempre deben aparecer apuntando perfectamente horizontal o verticalmente. Puedes ver exactamente lo que está pasando al reducir la opacidad de la punta de flecha.

Cuestiones relacionadas