Мне нужно превратить место щелчка в полярную координату.
Это мой текущий алгоритм. Местоположение - это местоположение на холсте клика ({x:evt.clientX, y:evt.clientY}
), центр - это смещение начала координат от 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;
}
Скриншоты вопроса. Слева - то, что происходит в уменьшенном масштабе (и не должно происходить). Право увеличено (scale> = 1), и это то, что должно произойти.
У меня такое впечатление, что мои координаты центра немного смещены. Кажется, что это нормально работает для масштаба> = 1, но не для масштаба <1 </p>
Источник:
circos.html: http://pastie.org/private/cowsjz7mcihy8wtv4u4ag
circos.js: http://pastie.org/private/o9w3dwccmimalez9fropa
datasource.js: http://pastie.org/private/iko9bqq8eztbfh8xpvnoaw
Запустите в Firefox
Итак, мой вопрос: почему это не работает?