如何在ECMAScript中将点转换为极坐标?

时间:2011-07-08 14:45:22

标签: javascript coordinates trigonometry

我需要将点击位置转换为极坐标。 这是我目前的算法。位置是画布上的点击位置({x:evt.clientX, y:evt.clientY}),中心是原点与0,0的偏移量。例如,如果圆圈以250,250为中心,则中心为{x:250, y:250}。比例是半径的比例。例如,如果从中心开始的圆的半径通常为50,并且比例为.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;
}

问题的屏幕截图。左边是缩小的结果(并且不应该发生)。右边是放大的(比例&gt; = 1),是应该发生的事情。 Glitch

我的印象是我的中心坐标略微移开了。它似乎适用于规模&gt; = 1,但不适用于规模&lt; 1

来源: circos.html:http://pastie.org/private/cowsjz7mcihy8wtv4u4ag circos.js:http://pastie.org/private/o9w3dwccmimalez9fropa datasource.js:http://pastie.org/private/iko9bqq8eztbfh8xpvnoaw 在Firefox中运行

所以我的问题是:为什么这不起作用?

1 个答案:

答案 0 :(得分:0)

出于某种原因,当我关闭萤火虫时,程序会自动生效。它似乎不适用于Firefox 5,只有我拥有的版本(在3s的某个地方)。无论哪种方式,我正在废弃项目以获得更面向对象的东西。目前的算法无法处理基因组。 (这正是我将要映射的)

更新:

我想出了问题......我正在测量页面左上角的距离,而不是画布的左上角。因此,当启用firebug时,屏幕会移动,从而使问题变得更糟。解决方案是使用canvas.offsetLeft和canvas.offsetTop来计算画布上的位置。