[英]how to check if mouse pointer is moving clockwise or anticlockwise in javascript
我假设你知道mousemove事件,并在浏览器窗口中获取鼠标的X / Y位置?
我将采用的方法是将鼠标的最后5-6个坐标存储在一个数组中,然后执行圆拟合算法以找到正在旋转的点。
由此,可以找到从第一点到圆心到最后一点的角度,并且旋转方向基于它是正还是负。
首先,您可能需要一个能够为您提供两个向量之间角度的函数。 以下是编写它的方法:
两个矢量的叉积的大小等于矢量的大小乘以它们之间的角度的正弦的乘积。
设A = P1的矢量 - > P2; 设B = P2的矢量 - > P3; 设θ为角度
| A×B | = | A | | B | sin(θ)因此sin(θ)=(| A×B |)/(| A | | B |)
两个2D矢量的叉积的大小计算如下:| A×B | = Ax By - Bx Ay
并且两个矢量的点积的大小等于矢量的大小乘以它们之间的角度的余弦的乘积。 A·B = | A | | B | cos(θ)因此cos(θ)=(A·B)/(| A | | B |)
点积计算如下:A·B = Ax Bx + Ay By
| A | = sqrt(Ax Ax + Ay Ay)| B | = sqrt(Bx Bx + By By)
这给你sin(θ)和cos(θ)。
你可以调用atan2从sin(θ)和cos(θ)得到θ。 θ= atan2(sin(θ),cos(θ))
现在在代码中:
/// <summary>
/// Calculates the angle between two 2-D vectors.
/// </summary>
/// <returns>angle in radians</returns>
static double AngleBetweenVectors( double Ax, double Ay, double Bx, double By )
{
double magA = Math.Sqrt( Ax * Ax + Ay * Ay );
double magB = Math.Sqrt( Bx * Bx + By * By );
double magAmagB = magA * magB;
if( magA * magB == 0 ) throw new Exception( "Vectors must be non-zero length" );
double sinTheta = (Ax * By - Bx * Ay) / magAmagB;
double cosTheta = (Ax * Bx + Ay * By) / magAmagB;
double theta = Math.Atan2( sinTheta, cosTheta );
return theta;
}
结果是弧度。 乘以180 / Math.PI获得学位。 如果您发现由于您的坐标系而使顺时针和逆时针方向相反,则只需取消结果。
圆弧绘制功能使用x轴作为参考点,因此您需要找到矢量和x轴(1,0)之间的角度。 您必须提供开始和结束角度。 可能需要进行一些条件检查以验证电弧是否符合您想要的方向,并且您可以根据需要调整角度,使得θStart> thetaEnd或thetaStart <thetaEnd。
你也想检查这个链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.