【发布时间】:2011-07-08 14:45:21
【问题描述】:
我需要将点击位置转换为极坐标。
这是我目前的算法。 Location 是点击在画布上的位置 ({x:evt.clientX, y:evt.clientY}),center 是原点距离 0,0 的偏移量。例如,如果圆以 250、250 为中心,则中心为 {x:250, y:250}。比例是半径的比例。例如,如果圆心的半径通常为 50,比例尺为 0.5,则半径变为 25。(用于放大/缩小)
this.getPolarLocation = function(location){
var unscaledFromCenter = {
x: location.x - center.x,
y: location.y - center.y
};
var angle = this.getAngleOnCircle(unscaledFromCenter);
var dist = Math.sqrt(unscaledFromCenter.x * unscaledFromCenter.x + unscaledFromCenter.y * unscaledFromCenter.y) * this.ds.scale;
return {
angle:angle,
dist:dist,
toString: function(){
return "Theta: ".concat(angle).concat("; dist: ").concat(dist);
}
};
}
this.getAngleOnCircle = function(location){
var x = location.x;
var y = location.y;
if(x == 0 && y > 0)
return Math.PI / 2;
if(x == 0 && y < 0)
return 3 * Math.PI / 2;
if(y == 0 && x > 0)
return 0;
if(y == 0 && x < 0)
return Math.PI;
var angle = Math.atan(y/x);
if(x > 0 && y > 0)
return angle;
if(x < 0)
return Math.PI + angle
return Math.PI * 2 + angle;
}
问题的屏幕截图。左边是缩小的情况(并且不应该发生)。右边被放大(比例> = 1),这是应该发生的事情。
我的印象是我的中心坐标略有偏移。它似乎适用于 scale >= 1,但不适用于 scale
来源: circos.html: http://pastie.org/private/cowsjz7mcihy8wtv4u4ag circos.js:http://pastie.org/private/o9w3dwccmimalez9fropa 数据源.js:http://pastie.org/private/iko9bqq8eztbfh8xpvnoaw 在火狐中运行
所以我的问题是:为什么这不起作用?
【问题讨论】:
-
“不起作用”是什么意思?什么不起作用?它当然会计算值(即您的代码不会抛出错误或无限循环),所以您认为这些值不准确是基于什么?
-
角度似乎有点偏离。如果你愿意,我可以发一张截图?
-
嗯...这很有趣。它现在自动运行。让我看看我是否可以让它再次行为不端。编辑:它又自动停止了行为。
-
那将非常有帮助。任何可重现的东西,如果你的值会产生意想不到的输出,你可以在笔和纸上显示结果应该不同。
-
您的中心是否可能不再是绝对的(无法解释为什么它适用于
scale>=1)?我需要查看您的其余代码,但也许您应该通过{x: location.x - center.x * this.ds.scale, y: location.y - center.y * this.ds.scale}计算点
标签: javascript coordinates trigonometry