You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取旋转后的新X、Y坐标?向日葵图线条旋转平移回位求助

解决向日葵图中旋转线条后保持位置不变的问题

我明白你的困扰:你想旋转向日葵图的线条,但旋转后线条的位置总是偏移,不知道怎么让它留在原来的位置上。其实核心问题是旋转的中心点设置不对,只要调整transform的旋转参数,就能轻松解决!

问题分析

你当前的代码里,transform先执行了translate(50, 360)再旋转,但旋转时默认是以SVG的原点(0,0)为中心,这就导致线条旋转后整体偏移了正确位置。我们需要让线条围绕它自己的中心旋转,这样旋转后线条的位置才不会改变。

解决方案

D3的rotate变换支持第三个和第四个参数,用来指定旋转中心的坐标。你的线条中心正好是(xOld, yOld)(因为线条是从xOld-lineLength到xOld+lineLength的水平线段),所以只要在旋转时指定这个中心,再结合你的平移需求,就能实现旋转后位置不变的效果。

修改后的代码如下:

var xOld = (save[i][0])/(xS.value/100/3.4); 
var yOld = (save[i][1])/(yS.value/100/3.5*-1); 
// 获取并转换绘图位置,无旋转时运行正常
var line = d3.select("svg") 
.append("line") 
.attr("stroke-width","1") 
// 反向线条起点
.attr("x1", xOld - lineLength) 
.attr("y1", yOld) 
// 正向线条终点
.attr("x2", xOld + lineLength) 
.attr("y2", yOld) 
// 先平移画布,再围绕线条中心旋转
.attr("transform", `translate(50, 360) rotate(${-45}, ${xOld}, ${yOld})`)
.style("stroke","blue");

原理说明

  1. translate(50, 360):将线条整体移动到你需要的画布位置,这部分保留你的原有需求。
  2. rotate(-45, ${xOld}, ${yOld}):指定以线条的中心(xOld, yOld)为旋转点,旋转-45度。这样旋转时线条会围绕自己的中心转动,不会偏离原来的位置。

如果你不需要手动计算旋转后的新坐标,用这种方式就能直接实现旋转且位置不变的效果。如果确实需要获取旋转后的坐标,可以用三角函数计算:

  • 旋转后的x坐标:xOld + (x - xOld)*cos(angle) - (y - yOld)*sin(angle)
  • 旋转后的y坐标:yOld + (x - xOld)*sin(angle) + (y - yOld)*cos(angle)
    其中angle是旋转角度(弧度制),(x,y)是原坐标点。不过对于你的场景,用transform的旋转参数会更简单高效。

内容的提问来源于stack exchange,提问作者c1tru5x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:54:05