2014-11-05 3 views
5

작은 개인적인 게임의 필요성 때문에 경마장을 SVG 경로로 그려야합니다. 이를 위해 D3.js 라이브러리를 사용하여 내 요구 사항에 완벽하게 맞는 것으로 생각했지만 원하는 작업을 수행 할 수있는 방법을 찾을 수없는 것 같습니다. 내 회로는 다음과 같은 형태로되어 있으며 게임 엔진을 통해 자동차의 속도와 동작을 계산합니다. 단순히 난 소박 D3.js 사용하려고하는 직선과 곡선d3.js로 경마장을 그립니다

"sectors": [ 
    { 
     "length": 300, 
     "type": "line" 
    }, 
    { 
     "length": 18, 
     "type": "curve", 
     "radius": 11, 
     "angle": 86, 
     "turn" : 'right' 
    }, 
    { 
     "length": 100, 
     "type": "line" 
    } 

]

의 시퀀스이며, I는 회로의 각 섹터에 대응하는 여러 가지 경로를 그릴 수 있었다 : 직선 및 아크. 이제 저는이 모든 요소들을 합치는 방법을 찾고 싶습니다. 그래서 최종 회로를 그려보십시오. 나는 다음 페이지 (https://www.dashingd3js.com/svg-paths-and-d3js을)에 튜토리얼을 따라 난 잘 같은 코드로 내 회로의 다른 직선을 나타내는 여러 줄로 구성된 경로를 만들 수 있습니다

var lineFunction = d3.svg.line() 
        .x(function(d) { return d.length; }) 
        .y(function(d) { return 0; }) 
        .interpolate("linear"); 

var lineGraph = svgContainer.append("path") 
         .attr("d", lineFunction(mySectors)) 
         .attr("stroke", "blue") 
         .attr("stroke-width", 2) 
         .attr("fill", "none"); 

을하지만 전환 할 수있는 방법 선 그리기와 곡선 사이에? 큰

이이 글을 읽을 사람들에게 사전에 감사하고 누가 나에게 나는 이런 식으로 뭔가 발견


답변

너구리 제공 할 수

path = svg.append("path") 
    .datum(points); 


path.attr("d", function (d) { 
    var lines = new Array(); 

    for (var i = 0; i < d.length; i++) { 
     lines.push([d[i][0], d[i][1]]); 
    } 
    return line(lines); 
}) 

가 그것을인가를 좋은 궤도?


나는 이것을 시도하지만 나는 효과가 없다. 어떤 생각?

svg.append("path") 
      .datum(formatSectors) 
      .attr("d", function (d) { 
       var paths = new Array(); 
       for (var i = 0; i < d.length; i++) { 
        if (d[i].type === 'line') { 
         var lineData = [{"x": 0, "y": 0}, {"x": d[i]['distance'], "y": d[i]['distance']}] 
         paths.push(lineFunction(lineData)); 
        } 
        if (d[i].type === 'curve') { 
         var curveData = {"radius": d[i].radius, "angle": d[i].angle}; 
         var arcData = arcFunction(curveData); 
         paths.push(arcData); 
        } 
       } 
       return paths; 
      }) 
      .attr("stroke", "blue") 
      .attr("stroke-width", 2) 
      .attr("fill", "none"); 

답변

0

d3이 필요한 것보다 많을 수 있습니다. 당신은 당신은 https://codepen.io/anthonydugois/pen/mewdyZ

당신이 경로 명령을 SVG로 해당 값으로 데이터를 변환해야합니다에 그것을 밖으로 시도 할 수있는 SVG 경로 구 https://www.w3.org/TR/SVG/paths.html

보고해야하지만, 꽤 정직해야한다.

M 100 300 L 400 300 A 11 11 0 1 1 400 418 L 300 418 

은 위의 세 가지 세그먼트를 설명합니다. 단, 아크 재료를 만들었지 만 :) 수학을하지 않았기 때문에.

M 100 300 - 포인트 100, 300 L 400 300 그리지 않고 이동 - 400 라인, 300 그릴 (길이 300) 11 11 0 1 1 400 418 - 반경 (X)를 사용하여 11 및 11의 y, 회전 없음 및 스윕 플래그 세트 400을 가리키는 호를 그립니다. 418
L 300 418 - 선을 300, 418 (길이 100)으로 그립니다.

관련 문제