我需要将点击位置转换为极坐标。
这是我目前的算法。位置是画布上的点击位置({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),是应该发生的事情。
我的印象是我的中心坐标略微移开了。它似乎适用于规模&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中运行
所以我的问题是:为什么这不起作用?
答案 0 :(得分:0)
出于某种原因,当我关闭萤火虫时,程序会自动生效。它似乎不适用于Firefox 5,只有我拥有的版本(在3s的某个地方)。无论哪种方式,我正在废弃项目以获得更面向对象的东西。目前的算法无法处理基因组。 (这正是我将要映射的)
更新:
我想出了问题......我正在测量页面左上角的距离,而不是画布的左上角。因此,当启用firebug时,屏幕会移动,从而使问题变得更糟。解决方案是使用canvas.offsetLeft和canvas.offsetTop来计算画布上的位置。