5

円弧に沿ったパスの中点を見つけるための正しいジオメトリを見つけるのに苦労しています。x1、y1とx2、y2の2つの点があるとしましょう。以下のような行で:

アーク

x1,y1 は A. x2,y2 は B.

上の画像で距離 (-1 または 1) を指定できる関数を作成しようとすると、x 座標と y 座標が返されます。このようにして、パスに中間点を追加して、以下の行をレンダリングできます。

アーク

[アップデート]

線の角度を使用して、探している x と y を計算する必要があります。以下は、直線が 45 度、三角形の 1 辺が 5、1 辺が 1 であることを示しています。それから、x と y を計算できます。

アーク

私は以下のコードとフィドル フィドルの例でそれを理解したと思います:

var svgContainer = d3.select("#canvas").append("svg")
                                       .attr("width", 400)
                                       .attr("height", 400);

var lineData = [ { "x": 0,   "y": 0},  { "x": 100,  "y": 100}];

var midPoint = {
    x:Math.abs(lineData[1].x - lineData[0].x)/2,
    y:Math.abs(lineData[1].x - lineData[0].x)/2
};

function calcAngle(x1, x2, y1, y2) {
    var calcAngleVal = Math.atan2(x1-x2,y1-y2)*(180/Math.PI);

    if (calcAngleVal < 0) {
        calcAngleVal = Math.abs(calcAngleVal);
    } else{
        calcAngleVal = 360 - calcAngleVal;
    }

    return calcAngleVal;
}

var angle = calcAngle(lineData[0].x, lineData[1].x,lineData[0].y,lineData[1].y);


var sin = Math.sin(angle * Math.PI / 180);
var cos = Math.cos(angle * Math.PI / 180);

var xLen = Math.abs(lineData[1].x - lineData[0].x)/2;
var yLen = Math.abs(lineData[1].y - lineData[0].y)/2;


var n = 1.5;

var midpointArc = {
    x: midPoint.x + (sin * (n * 25)),
    y: midPoint.y + (cos * (n * 25)) 
 };

lineData.splice(1,0,midpointArc);

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

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

var pathEl   = lineGraph.node();
var curvedMidpoint = pathEl.getPointAtLength(pathEl.getTotalLength()/2);

svgContainer.append("circle")
            .attr('r',5)
            .attr('cx', curvedMidpoint.x)
            .attr('cy', curvedMidpoint.y)
4

1 に答える 1