4

抱歉,如果这非常简单,我已经尝试寻找解决方案。

在 D3 中,我可以通过定义这个来执行弧:

var ringBannerCcwArc = d3.svg.arc()
.innerRadius(420)
.outerRadius(470)
.startAngle(0)
.endAngle(function(t) {return t * -1 * 2 * Math.PI / 6; });

然后在此处的 DOM 中定义它:

labels.append("path")
.attr("id", "ring-banner");

然后在适当的时候我可以做:

labels.transition.select("#ring-banner").style("fill", "red")
.attrTween("d", function() { return ringBannerCcwArc });

这将产生一个红色的弧形“标签”,从 0 开始,在任何地方停止

t * -1 * 2 * Math.PI / 6

产生一个角度(是的,60度,但我打算让它成为一个可变的结果)。

想做的只是在“endAngle”的半径上创建一条从这个横幅向外延伸的线(这样我就可以构建一个动态驱动的显示)。

像这样的图像: img 显示我的 d3 目标

我的目标是动态地将数据附加到它,并利用 D3 的惊人功能。因此,一旦我了解了如何绘制上述解决方案,我就想知道最终线 (x2,y2) 的结果坐标。线本身可以是一个设定的长度(例如,50),但我将如何确定它的位置以便我可以将最终区域附加到它?

像这样的图像: 在此处输入图像描述

再次,如果这看起来很明显,我深表歉意。谢谢你的帮助。

编辑: 最初的问题是关于我使用 D3 - 创建 ringBannerArc - 然后想要进入坐标系。因此,正如两位受访者所说,这是一个基本的三角问题,但这并不是真正的问题。

最后,答案是 d3 没有按照我的要求做。但它可以轻松执行解决方案。如果像我一样,您正在努力实现 d3 并理解它是非常独特(并且非常强大)的数据可视化方法,那么您可能会发现这些链接很有帮助。感谢d3 Google Group的伙计们。

有用的贡献者:

伊恩约翰逊: 首先你想知道如何从一个点到另一个点画一条线。这就是你想要的最终结果,如果你不能为任意行做到这一点,你就不能为你想要的行做到这一点。所以让我们从那里开始: http: //tributary.io/inlet/4229462/ 第二部分是计算你要绘制的圆上的点。但在您这样做之前,您应该进行设置,以便您可以轻松验证该点在哪里。所以让我们画出整个圆,然后画一个我们可以使用的点:http: //tributary.io/inlet/4229477/ 现在让我们尝试根据输入半径将该点放置在圆上的某个点上: http ://tributary.io/inlet/4229496/一旦我们可以控制那个点,我们就绕了一圈;)并移动这条线 http://tributary.io/inlet/4229500/

Chris Viau:用一个很好的辅助函数包裹起来:http: //jsfiddle.net/christopheviau/YPAYz/推荐一本 Scott Murray 为初学者写的好书:http: //ofps.oreilly.com/titles/9781449339739/index .html

Scott Murray:对 d3 作者撰写的白皮书进行了精彩的参考 - 对于我们这些喜欢了解具体细节的人:http: //vis.stanford.edu/files/2011-D3-InfoVis.pdf

4

2 回答 2

2

这本质上是一个基本的三角学问题。

对于一个圆,如果角度从垂直开始顺时针方向,并且您的坐标是正常的屏幕坐标,

x = cx + sin(angle) * r
y = cy + cos(angle) * r

根据这些,您可以简单地计算任何一条线。

于 2012-12-06T19:23:02.493 回答
1

首先,您想知道如何从一个点到另一个点画一条线。这就是你想要的最终结果,如果你不能为任意行做到这一点,你就不能为你想要的行做到这一点。

第二部分是计算要绘制的圆上的点。但在您这样做之前,您应该进行设置,以便您可以轻松验证该点在哪里。所以让我们画出整个圆,然后画一个我们可以使用的点:http: //tributary.io/inlet/4229477/

现在让我们尝试根据使用 trig 的输入半径将该点放置在圆上的某个点上,一旦我们可以控制该点,我们就来一个完整的圆;)并移动线 http://tributary.io/inlet/4229500/

于 2012-12-07T00:21:11.107 回答