在D3中从圆计算中优化路径距离
在这个D3.js图中,我使用了直线时的魔术数字20
和直线作为边缘时的30
作为边距从路径中退出,以便在圆圈(图形节点)和路径(图形边缘)。
我还使用相当随机的数字1.5
作为乘数来增加距离路径末端圆的距离,因为它有一个marker-end
。
给定19
的圆半径和箭头路径坐标M0,0 V4 L2,2 Z
,我认为应该有可能计算路径应该具有的圆的准确距离(“边距”),但是我的数学技能只是没有不起作用了。 我还假设可以找出路径的方向,因此不再需要边界反演。
如果您有关于如何优化withMargins()
函数中的距离和边距计算的withMargins()
,请提供答案。 所有优化和代码减少都是受欢迎的。 以下是相关的代码:
this.withMargins = function() {
var diff = {
x: edge.end.x - edge.start.x,
y: edge.end.y - edge.start.y
};
var margins = {
start: {
x: 0,
y: 0
},
end: {
x: 0,
y: 0
}
};
if (diff.x > 0 && diff.y === 0) {
margins.start.x = 30;
} else if (diff.x < 0 && diff.y === 0) {
margins.start.x = -30;
} else if (diff.x > 0) {
margins.start.x = 20;
} else if (diff.x < 0) {
margins.start.x = -20;
}
if (diff.y > 0 && diff.x === 0) {
margins.start.y = 30;
} else if (diff.y < 0 && diff.x === 0) {
margins.start.y = -30;
} else if (diff.y > 0) {
margins.start.y = 20;
} else if (diff.y < 0) {
margins.start.y = -20;
}
if (margins.start.x != 0) {
margins.end.x = margins.start.x < 0 ?
Math.abs(margins.start.x * 1.5) :
margins.start.x * -1.5;
}
if (margins.start.y != 0) {
margins.end.y = margins.start.y < 0 ?
Math.abs(margins.start.y * 1.5) :
margins.start.y * -1.5;
}
// The top branch edges are inverted, so their margins
// needs to be inverted too.
if (edge.branch === 'top') {
var startX = margins.start.x;
var startY = margins.start.y;
margins.start.x = margins.end.x * -1;
margins.start.y = margins.end.y * -1;
margins.end.x = startX * -1;
margins.end.y = startY * -1;
}
edge.start.x += margins.start.x;
edge.start.y += margins.start.y;
edge.end.x += margins.end.x;
edge.end.y += margins.end.y;
return edge;
};
代码可能看起来有点不可思议,但这主要可以通过它正在从我正在开发的Reveal.js演示文稿中删除来解释。 我完全了解如何改进代码的其他部分,但它特别是我不满意的withMargins()
函数的主体。
据我了解 - 第一个圆的中心(x0,y0),第二个圆的中心(x1,y1),圆的半径R,圆周M的所需边距,并且想要查找箭头的起始和结束坐标。
(看起来你正在使用圆心的全部距离,在这种情况下设置Marg)
dx = x1 - x0
dy = y1 - y0
Len = math.sqrt(dx * dx + dy * dy) //use math.hypot if available
Marg = R + M //full distance from circle center to arrow end. 30 in your case
Coeff = Marg / Len
ax0 = x0 + Coeff * dx //arrow start coords
ay0 = y0 + Coeff * dy
ax1 = x1 - Coeff * dx //arrow end
ay1 = y1 - Coeff * dy
就这样。
链接地址: http://www.djcxy.com/p/84989.html上一篇: Optimize path distance from circle calculation in D3
下一篇: How to determine distance to a point on arc perpendicular from tangent?