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

Javascript 如何在ECMAScript中将点转换为极坐标?,javascript,coordinates,trigonometry,Javascript,Coordinates,Trigonometry,我需要将单击位置转换为极坐标。 这是我目前的算法。Location是单击在画布上的位置({x:evt.clientX,y:evt.clientY}),center是原点从0,0的偏移量。例如,如果圆的中心是250,250,则中心是{x:250,y:250}。“比例”是半径的比例。例如,如果圆心的半径通常为50,比例为.5,则半径为25。(用于放大/缩小) this.getPolarLocation=函数(位置){ var unscaledFromCenter={ x:location.x-cen

我需要将单击位置转换为极坐标。 这是我目前的算法。Location是单击在画布上的位置(
{x:evt.clientX,y:evt.clientY}
),center是原点从0,0的偏移量。例如,如果圆的中心是250,250,则中心是
{x:250,y:250}
。“比例”是半径的比例。例如,如果圆心的半径通常为50,比例为.5,则半径为25。(用于放大/缩小)

this.getPolarLocation=函数(位置){
var unscaledFromCenter={
x:location.x-center.x,
y:位置,y-中心,y
};
var angle=此.getAngleOnCircle(未缩放自中心);
var dist=数学.sqrt(unscaledFromCenter.x*unscaledFromCenter.x+unscaledFromCenter.y*unscaledFromCenter.y)*此.ds.scale;
返回{
角度:角度,,
地区:地区,
toString:function(){
返回“θ:”.concat(角度).concat(“;距离:”).concat(距离);
}
};
}
this.getAngleOnCircle=函数(位置){
var x=位置x;
var y=位置y;
如果(x==0&&y>0)
返回Math.PI/2;
如果(x==0&&y<0)
返回3*Math.PI/2;
如果(y==0&&x>0)
返回0;
如果(y==0&&x<0)
返回Math.PI;
变量角度=数学坐标(y/x);
如果(x>0&&y>0)
返回角;
if(x<0)
返回Math.PI+角度
返回Math.PI*2+角度;
}
该问题的截图。左边是放大的(不应该发生的)发生的事情。右边被放大(比例>=1),这就是应该发生的事情。

我觉得我的中心坐标有点偏移。对于比例>=1,它似乎可以正常工作,但对于比例<1的情况则不行

资料来源: circos.html: circos.js: datasource.js: 在Firefox中运行


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

出于某种原因,当我关闭firebug时,程序会自动工作。它在Firefox5上似乎不起作用,只有我的版本(在3s的某处)。不管怎样,我都是为了更面向对象的东西而放弃这个项目。目前的算法无法处理基因组。(这正是我要映射的内容)

更新:


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

你说的“不工作”是什么意思?什么不起作用?它当然会计算值(也就是说,您的代码不会无限地抛出错误或循环),因此根据您所声称的值不准确的原因,角度似乎有点偏离。如果你愿意,我可以发布一个截图?嗯。。。真有趣。它现在自动运行。让我看看我能不能让它再胡闹一次。编辑:它会自动停止运行。这将非常有帮助。任何可复制的,甚至更好的,如果你的值产生意外的输出,你可以在笔和纸上显示结果应该是不同的。有可能你的中心不再是绝对的(不会解释为什么它工作在
比例>=1
)?我需要查看代码的其余部分,尽管您可能应该通过
{x:location.x-center.x*this.ds.scale,y:location.y-center.y*this.ds.scale}计算点
稍等,我似乎已经解决了问题。我希望如此。我似乎无法让整个事情顺利进行,尽管从我的推断,问题不在于firebug,而是在缩放和平移时没有考虑缩放比例。在Firefox 3上缩放和平移都很好。此外,我同意Firebug本身不是问题所在,但它必须以某种方式与之相关。如果需要较小的圆图,请使用Circos.html中的
new Circos(ds)
而不是
new Circos(fireshore)
。不管怎样,我都需要从头开始,因为设计无法处理我的任务。
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;
}