【问题标题】:How to convert a point to polar coordinates in ECMAScript?如何在 ECMAScript 中将点转换为极坐标?
【发布时间】: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&gt;=1)?我需要查看您的其余代码,但也许您应该通过{x: location.x - center.x * this.ds.scale, y: location.y - center.y * this.ds.scale} 计算点

标签: javascript coordinates trigonometry


【解决方案1】:

由于某种原因,当我关闭 firebug 时,程序会自动运行。它似乎不适用于 Firefox 5,只有我拥有的版本(在某处的 3s 中)。无论哪种方式,我都在放弃该项目以寻求更面向对象的东西。当前的算法无法处理基因组。 (这正是我要映射的)

更新:

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

【讨论】:

  • 稍等一下,我似乎已经解决了问题。我希望。
  • 我似乎无法让整个事情正常工作,尽管据我所知,问题不是萤火虫,而是你没有考虑缩放和平移.
  • 它在 Firefox 3 上可以很好地缩放和平移。另外,我同意 Firebug 本身不是问题,但它必须以某种方式相关。如果您需要更小的圆形图,请在 circos.html 中使用 new Circos(ds) 而不是 new Circos(fireworks)。无论哪种方式,我都需要从头开始,因为设计无法处理我的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多