坐标存在对数刻度时如何计算两点连线与x轴的夹角
Math.atan2不需要对输入向量做归一化处理,它的计算仅依赖两个坐标差的比值,输入任意长度的同方向向量都会得到完全相同的角度结果。
你计算结果和视觉预期不符的核心原因是x轴使用了对数刻度,你当前直接使用原始x值计算差值的逻辑,和实际图表的视觉坐标空间不匹配:
- 线性刻度下,坐标的视觉位置和原始数值是线性对应,直接用原始数值差计算即可
- 对数刻度下,x轴的视觉位置和原始x值的对数值线性对应,你当前算出来的是原始数据空间的夹角,不是图表上可见的视觉夹角
修正后的代码如下:
function calcAngle(centerX, centerY, x2, y2) { // y轴为线性刻度,直接计算数值差即可匹配视觉距离 const distY = y2 - centerY; // x轴为对数刻度,先对x值取对数再计算差值,和视觉坐标对齐 const distX = Math.log10(x2) - Math.log10(centerX); const theta = Math.atan2(distY, distX); // 弧度转换为角度返回 return theta * 180 / Math.PI; }
如果你的图表x轴使用的是自然对数而非常用对数,将代码中的Math.log10替换为Math.log即可,只要和绘图时x轴的对数转换规则保持一致就能得到正确结果。

内容的提问来源于stack exchange,提问作者LeonaTheSun
相关产品推荐
相关产品推荐

