【问题标题】:calculating the arc/point in d3 path计算d3路径中的弧/点
【发布时间】:2013-09-05 02:32:21
【问题描述】:

我正在努力找出正确的几何形状以找到沿弧线的路径的中点。假设我有两点:x1,y1 和 x2,y2。在如下一行中:

x1,y1 是 A。x2,y2 是 B。

我正在尝试编写一个函数,我可以在上图中提供距离(-1 或 1)并返回 x 和 y 坐标。这样我可以在路径中添加一个中间点来渲染下面的线:

[更新]

你必须用线的角度找出 x 和 y 我正在寻找。下图显示直线是 45 度,三角形的一侧是 5,一侧是 1。由此,您可以计算 x 和 y。

我想我用下面的代码弄明白了 fiddle 例子:

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)

【问题讨论】:

    标签: javascript math d3.js geometry


    【解决方案1】:

    要找到任何路径的中点(不仅仅是圆弧):

    var pathEl   = d3.select('#pathId').node();
    var midpoint = pathEl.getPointAtLength(pathEl.getTotalLength()/2);
    

    改编自 Duopixel 的 answerbl.ockus

    【讨论】:

    • 谢谢。一旦绘制了线(实际上是路径),这很有帮助,但我的问题是我想在绘制路径之前获得 N(我的绘图中的 -1 或 1)的中心点。关键是你必须弄清楚线的度数才能得到我正在寻找的 x,y 点。看看更新。如果您认为有更好的方法可以得到答案,很想听听。
    • 如果您想知道不在 DOM 中的假想路径中的点,只是为了在 SVG (DOM) 上的该坐标处放置一个圆形元素,该怎么办?似乎您需要注入一条路径才能使计算正常工作?
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2020-09-16
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多