2012-10-19 2 views
1

강제 레이아웃의 일부 지점을 기반으로 보로 노이 경로를 생성합니다. 무작위로 10 개의 클래스 중 1 개를 할당 한 다음 이러한 클래스 중 일부를 다른 요소에 적용 할 수있는 clipPath로 래핑하고 싶습니다.강제 레이아웃에서 경로를 ClipPath로 사용

추가하는 것과 달리 d3을 사용하여 요소 주위에 svg 태그를 래핑 할 수 있습니까?

또는 clipPath에서 d3에 의해 생성 된 여러 경로를 사용할 수도 있습니까?

는 jQuery를하고 D3의 이상한 혼합이에있다,

w = $(window).width(); 
    h = $(window).height(); 

    function ranNum(){ 
     return Math.floor((Math.random()*10)+1); 
    } 


    $('#grid').css('height', h); 

    var vertices = d3.range(50).map(function(d) { return {x: d.x, y: d.y}; }); 
    //console.log(vertices); 


    links = []; 
    voronoiVertices = []; 
    var force = d3.layout.force() 
     .nodes(vertices) 
     .size([w, h]) 
     .linkDistance(60) 
     .charge(-900) 
     .on("tick", tick) 
     .start(); 


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


    //path gradient 
    var defs = svg.append('defs') 
    var radialGradient = defs.append('radialGradient') 
     .attr('id', 'pathGrad') 
     .attr('cx', '50%') 
     .attr('cy', '50%') 
     .attr('r', '50%') 
     .attr('fx', '50%') 
     .attr('fy', '50%'); 

    var stop1 = radialGradient.append('stop') 
     .attr('offset', '.2') 
     .attr('stop-color', '#a8a8a8'); 

    var stop2 = radialGradient.append('stop') 
     .attr('offset', '1') 
     .attr('stop-color', '#0000000'); 

    //path dropShadow 
    var filterShadow = defs.append('filter') 
     .attr('id', 'pathShadow') 
     .attr('height', '130%'); 

    var gCir = svg.append('g') 
     .attr("class", "gCircle"); 

    var gPath = svg.append('g') 
     .attr("class", "gPath"); 

    var circle = svg.selectAll("circle"); 
    var path = gPath.selectAll("path") 
      .data(d3.geom.voronoi(vertices)) 
       .enter().append("path") 
      .attr("fill", "url(#pathGrad)"); 

      //wraps path with random class after generation 
    $('path').each(function(){$(this).attr('class', 'path-' + Math.floor((Math.random()*10)+1))}); 

    var clip = defs.append("svg:clipPath") 
     .attr("id", "clip") 
      .append("svg:rect") 
      .attr("id", "clip-rect") 
      .attr("x", "0") 
      .attr("y", "0") 
      .attr("width", '900px') 
      .attr("height", '900px'); 

    var gClip = svg.append("svg:g") 
     .attr('clip-path', 'url(#clip)'); 
/* 
    var clip = gClip.append("svg:image") 
     .attr("class", "circle") 
     .attr("xlink:href", "clip.jpg") 
     .attr("x", "0px") 
     .attr("y", "0px") 
     .attr("width", w) 
     .attr("height", h); 
*/ 
    var selectPath = d3.selectAll('.path-10');  
    console.log(selectPath);  


    function tick() { 
     voronoiVertices = vertices.map(function(t){return [t.x, t.y]}) 
     path = path.data(d3.geom.voronoi(voronoiVertices)) 
      path.enter().append("path") 
      .attr("d", function(t) { return "M" + t.join("L") + "Z"; }); 
     path.attr("fill", "url(#pathGrad)") 
      .attr("d", function(t) { return "M" + t.join("L") + "Z"; });   

     circle = circle.data(vertices) 
     circle.enter().append("circle") 
      .call(force.drag) 
      .attr("r", 0) 
      .attr('class', function(d) { return d.index; }) 
      .attr("cx", function(d) { return d.x; }) 
      .attr("cy", function(d) { return d.y; }) 
      .transition().duration(5000).attr("r", 5); 

      circle.attr("cx", function(d) { return d.x; }) 
      .attr("cy", function(d) { return d.y; }); 
    } 


}); 

답변

0

당신의 도움을 주셔서 감사합니다. D3에서 작업 할 때 D3에서 작업을 수행하십시오. 예를 들어 차라리 이렇게 것 : 이것보다

.attr("class", function(d){return 'path-'+Math.floor((Math.random()*10)+1))}); 

을 :

$('path').each(function(){$(this).attr('class', 'path-' + Math.floor((Math.random()*10)+1))}); 

D3는 exotic but smart way of doing things을 가지고, 그것은 잘 심각한 무언가를하기 전에이 업데이트 패턴을 학습하는 것이 좋습니다.

w = 1200; 
h = 500; 

function ranNum(){ 
    return Math.floor((Math.random()*10)+1); 
} 


var vertices = d3.range(50).map(function(d) { return {x: d.x, y: d.y}; }); 
//console.log(vertices); 


links = []; 
voronoiVertices = []; 
var force = d3.layout.force() 
    .nodes(vertices) 
    .size([w, h]) 
    .linkDistance(60) 
    .charge(-900) 
    .on("tick", tick) 
    .start(); 


var svg = d3.select("body").append("svg") 
    .attr("width", w) 
    .attr("height", h); 


//path gradient 
var defs = svg.append('defs') 
var radialGradient = defs.append('radialGradient') 
    .attr('id', 'pathGrad') 
    .attr('cx', '50%') 
    .attr('cy', '50%') 
    .attr('r', '50%') 
    .attr('fx', '50%') 
    .attr('fy', '50%'); 

var stop1 = radialGradient.append('stop') 
    .attr('offset', '.2') 
    .attr('stop-color', '#a8a8a8'); 

var stop2 = radialGradient.append('stop') 
    .attr('offset', '1') 
    .attr('stop-color', '#0000000'); 

//path dropShadow 
var filterShadow = defs.append('filter') 
    .attr('id', 'pathShadow') 
    .attr('height', '130%'); 

var gCir = svg.append('g') 
    .attr("class", "gCircle"); 

var gPath = svg.append('g') 
    .attr("class", "gPath"); 

var circle = svg.selectAll("circle"); 
var path = gPath.selectAll("path") 
     .data(d3.geom.voronoi(vertices)) 
      .enter().append("path") 
     .attr("fill", "url(#pathGrad)"); 

     //wraps path with random class after generation 
//$('path').each(function(){$(this).attr('class', 'path-' + Math.floor((Math.random()*10)+1))}); 

var clip = defs.append("svg:clipPath") 
    .attr("id", "clip") 
     .append("svg:rect") 
     .attr("id", "clip-rect") 
     .attr("x", "0") 
     .attr("y", "0") 
     .attr("width", '900px') 
     .attr("height", '900px'); 

var gClip = svg.append("svg:g") 
    .attr('clip-path', 'url(#clip)'); 


function tick() { 
    voronoiVertices = vertices.map(function(t){return [t.x, t.y]}) 
    path = path.data(d3.geom.voronoi(voronoiVertices)) 
     path.enter().append("path") 
     .attr("d", function(t) { return "M" + t.join("L") + "Z"; }); 
    path.attr("fill", "url(#pathGrad)") 
     .attr("d", function(t) { return "M" + t.join("L") + "Z"; });   

    circle = circle.data(vertices) 
    circle.enter().append("circle") 
     .call(force.drag) 
     .attr("r", 0) 
     .attr('class', function(d) { return d.index; }) 
     .attr("cx", function(d) { return d.x; }) 
     .attr("cy", function(d) { return d.y; }) 
     .transition().duration(5000).attr("r", 5); 

     circle.attr("cx", function(d) { return d.x; }) 
     .attr("cy", function(d) { return d.y; }); 
} 

행운을 빕니다 :

그리고 여기에는 작업 코드입니다!

관련 문제