【问题标题】:transformation issues when implementing fisheye distortion in a radial tree在径向树中实现鱼眼失真时的转换问题
【发布时间】:2014-01-17 09:06:00
【问题描述】:

基本上,我正在尝试将 d3 鱼眼失真算法应用于径向树。我相信我遇到的问题围绕着这样一个事实,即被馈送到鱼眼失真的坐标是由 d3.layout.tree 计算的坐标。但实际坐标已通过 g 变换进行了调整。因此,鱼眼畸变产生的坐标需要调整回g变换。

例如:

// re-setting the projection according to fisheye coords
diagonal.projection(function(d) { d.fisheye = fisheye(d); return [d.fisheye.y, d.fisheye.x / 180 * Math.PI]; })

我一直在尝试这个……这是fiddle

我有点接近...感谢您的帮助。

【问题讨论】:

  • 通过不设置坐标并让 g-transform 完成它的工作,我能够更接近我想要的。然而,鼠标坐标仅在象限 IV(东南)中有效,并且当发生失真时,其半径似乎大于指定值。更新小提琴here.
  • 我没有仔细研究过鱼眼失真,但我怀疑将其适应径向坐标会比使用基本三角函数将径向坐标转换为笛卡尔 (x,y) 点更复杂你定位你的节点。
  • 感谢您关注@AmeliaBR。是的,这不是在公园里散步。

标签: d3.js fisheye


【解决方案1】:

按照我在 cmets 中建议的方向,结果如下:

https://jsfiddle.net/xdk5ehcr/

我没有使用旋转和平移来定位节点,而是创建了两个基于三角函数的函数来根据数据 (x,y) 值计算水平和垂直位置,这些值被视为极坐标。

然后我必须设置鱼眼功能以将我的定位功能用作“访问器”功能,而不是直接读取d.xd.y。不幸的是,您用于鱼眼的基本插件不包括获取和设置 x/y 访问器函数的方法,因此我也必须对其进行修改。我很惊讶它还没有在代码中。这是大多数 d3 布局对象的标准功能。

(当我设置好 github 后,我将不得不发出拉取请求来添加它。不过,我需要弄清楚鱼眼缩放/缩放功能是如何工作的——我从这个示例中删除了它因为你没有使用它。)

定位功能如下:

function getHPosition(d){
    //calculate the transformed (Cartesian) position (H, V)
    //(without fisheye effect)
    //from the polar coordinates (x,y) where 
    //x is the angle
    //y is the distance from (radius,radius)
    //See http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html

    return (d.y)*Math.cos(d.x);
}
function getVPosition(d){
    return (d.y)*Math.sin(d.x);
};

这些函数用于设置节点和链接的原始位置,然后一旦鱼眼进入,它就会在内部使用这些函数,将结果(如果合适,会失真)返回为d.fisheye.xd.fisheye.y

例如,对于意味着投影设置d3.svg.diagonal 函数的链接,如下所示进行初始化:

var diagonal = d3.svg.diagonal()
    .projection(function(d) { 
        return [getHPosition(d), getVPosition(d)]; 
});

但是像这样更新:

diagonal.projection(function(d) { 
    d.fisheye = fisheye(d); 
    return [d.fisheye.x, d.fisheye.y]; 
});

还有一些其他的小变化:

我稍微简化了绘图区域的尺寸。

我添加了一个带有pointer-events:all; 的背景矩形,这样当鼠标在节点和空白背景之间移动时,鱼眼不会打开和关闭。

没有打扰旋转文本(因为节点组不再旋转,默认情况下不会发生),但您可以轻松地在单个文本上添加旋转转换元素。

最后,这个问题让我感到困扰的时间比我想承认的要长,对于 Javascript 三角函数,角度必须以 弧度 为单位。无法弄清楚为什么我的布局是so ugly, with overlapping lines。我认为这与在 d3.svg.diagonal()d3.svg.diagonal.radial() 之间切换有关,并花了很多时间尝试做逆触发和各种事情......

【讨论】:

  • 这里是the version with rotated text。结果比我想象的要复杂,因为 CSS 函数当然需要以度为单位的角度,并且您必须指定 (0,0) 以外的旋转中心,以使标签不围绕整个图像。我最终将d.x 改回度数,并在三角函数中转换为弧度。很多丑陋的倾斜文本的代码——无论如何,我个人建议坚持使用水平文本!
  • 首先,非常感谢!。当你今天或明天遇到你关心的人时,请他/她给你一个温暖的拥抱!你在旋转文本版本上的努力肯定没有白费。看到您的回复后,我做的第一件事就是将我拥有的大量数据插入两个版本。在玩弄了变形的强度和半径后,我得出结论,旋转文本版本的缩放效果更好。
  • 我在之前的评论中用完了字空间。 @AmeliaBR,我谦虚地建议您在 bl.ocks.org 上提供它。其他拥有大量径向树数据集的人会喜欢这个功能。再次感谢。
  • 正如我上面提到的,我一直想建立一个github帐户。当我这样做时,我将对这个和其他几个更复杂的示例进行 bl.ock-ify,这些示例目前仅存在于与 SO 问题相关的小提琴中。
  • P.S. @FernOfTheAndes:如果由于数据集的大小而使用旋转文本,您可能希望将文本 x、y 和旋转的属性语句分组到 each() 调用中,以便您可以保存 H 和V 在变量中定位,然后重用该值而不是重新计算它。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多