Javascript 根据鼠标位置在圆上的点

Javascript 根据鼠标位置在圆上的点,javascript,math,processing,Javascript,Math,Processing,我需要做的是创建一个函数,该函数将使用鼠标在HTML5画布上绘制的线条,并将它们围绕圆圈镜像X次。我想到的是下面的函数。它几乎可以正常工作。它能满足我的一切需要。但它的旋转方向与鼠标相反 void mirroring(x1,y1,x2,y2){ var mirrorNumber = 6; for(var i = 1; i < mirrorNumber;i++){ var distance1 = dist(x1,y1,window.innerWidth/2, window

我需要做的是创建一个函数,该函数将使用鼠标在HTML5画布上绘制的线条,并将它们围绕圆圈镜像X次。我想到的是下面的函数。它几乎可以正常工作。它能满足我的一切需要。但它的旋转方向与鼠标相反

void mirroring(x1,y1,x2,y2){

  var mirrorNumber = 6;

  for(var i = 1; i < mirrorNumber;i++){
    var distance1 = dist(x1,y1,window.innerWidth/2, window.innerHeight/2);
    var distance2 = dist(x2,y2,window.innerWidth/2, window.innerHeight/2);

    var deltaY1 = y1-window.innerHeight/2;
    var deltaX1 = x1-window.innerWidth/2;

    var deltaY2 = y2-window.innerHeight/2;
    var deltaX2 = x2-window.innerWidth/2;

    var angle1 = atan2(deltaY1, deltaX1);
    var angle2 = atan2(deltaY2, deltaX2);

    var newX1 = window.innerWidth/2 + distance1 * sin(angle1-(TWO_PI/mirrorNumber)*i);
    var newY1 = window.innerHeight/2 + distance1 * cos(angle1-(TWO_PI/mirrorNumber)*i);

    var newX2 = window.innerWidth/2 + distance2 * sin(angle2-(TWO_PI/mirrorNumber)*i);
    var newY2 = window.innerHeight/2 + distance2 * cos(angle2-(TWO_PI/mirrorNumber)*i);

    line(newX1, newY1, newX2, newY2);

  }

};
无效镜像(x1、y1、x2、y2){ var mirrorNumber=6; 对于(变量i=1;i 这就是它产生的结果:

我想它只需要稍微改变一下,但我想不出来。如果有什么不清楚的,只要问我任何问题

谢谢

编辑:

最终的代码是如何工作的

无效镜像(x1、y1、x2、y2){

var mirrorNumber=6;
var deltaAngle=两个π/镜像数;
var centerX=window.innerWidth/2;
var centerY=window.innerHeight/2;
var distance1=距离(x1,y1,centerX,centerY);
var distance2=距离(x2,y2,centerX,centerY);
变量deltaY1=y1中心;
变量deltaX1=x1 centerX;
var deltaY2=y2中心;
变量deltaX2=x2 centerX;
var angle1=atan2(deltaY1,deltaX1);
var angle2=atan2(deltaY2,deltaX2);
对于(变量i=1;i

})

看起来你应该简单地加上
i*TWO\u PI/mirrorNumber
,而不是减去它。此外,您还有许多可以从循环中移出的计算

void mirroring(x1,y1,x2,y2){

    var mirrorNumber = 6;
    var deltaAngle = TWO_PI / mirrorNumber;

    var centerX = window.innerWidth / 2;
    var centerY = window.innerHeight / 2;

    var distance1 = dist(x1,y1,centerX, centerY);
    var distance2 = dist(x2,y2,centerX, centerY);

    var deltaY1 = y1-centerY;
    var deltaX1 = x1-centerX;

    var deltaY2 = y2-centerY;
    var deltaX2 = x2-centerX;

    var angle1 = atan2(deltaY1, deltaX1);
    var angle2 = atan2(deltaY2, deltaX2);

    for(var i = 1; i < mirrorNumber;i++){
        // note use of '+' instead of '-' in calls to sin() and cos()
        var newX1 = centerX + distance1 * sin(angle1 + i * deltaAngle);
        var newY1 = centerY + distance1 * cos(angle1 + i * deltaAngle);

        var newX2 = centerX + distance2 * sin(angle2 + i * deltaAngle);
        var newY2 = centerY + distance2 * cos(angle2 + i * deltaAngle);

        line(newX1, newY1, newX2, newY2);
    }
};
无效镜像(x1、y1、x2、y2){ var mirrorNumber=6; var deltaAngle=两个π/镜像数; var centerX=window.innerWidth/2; var centerY=window.innerHeight/2; var distance1=距离(x1,y1,centerX,centerY); var distance2=距离(x2,y2,centerX,centerY); 变量deltaY1=y1中心; 变量deltaX1=x1 centerX; var deltaY2=y2中心; 变量deltaX2=x2 centerX; var angle1=atan2(deltaY1,deltaX1); var angle2=atan2(deltaY2,deltaX2); 对于(变量i=1;i
答案可能已经发布了。但是,根据我使用这个三角公式的经验,我必须从x坐标减去,然后加上y坐标。因为y轴向下而不是向上。在不深入研究代码的情况下,我建议:

var newX1 = window.innerWidth /2 - distance1 * sin(angle1-(TWO_PI/mirrorNumber)*i);
var newY1 = window.innerHeight/2 + distance1 * cos(angle1-(TWO_PI/mirrorNumber)*i);
newX2也是如此。我没有查看
角度1-(两个PI/mirrorNumber)*我
您代码的一部分。但是,更改圆图形(x)的一个坐标的方向会使其保持不变

从与鼠标相反的方向移动


什么是无效镜像(x1、y1、x2、y2)
?这看起来不像JavaScript。是的,很抱歉。我正在使用processingjs,这是一个处理java库的端口。所以这有点复杂。但它与函数性无关。具有实际和预期结果的图像会很有帮助。我添加了一张它产生的图片…您可以看到顶部箭头指向其他方向。谢谢,您确实使我的代码更高效。然而,它产生了完全相同的结果。我尝试在之前切换+和-但没有效果。
var newX1 = window.innerWidth /2 - distance1 * sin(angle1-(TWO_PI/mirrorNumber)*i);
var newY1 = window.innerHeight/2 + distance1 * cos(angle1-(TWO_PI/mirrorNumber)*i);