簡體   English   中英

如何檢查鼠標指針是否在javascript中順時針或逆時針移動

[英]how to check if mouse pointer is moving clockwise or anticlockwise in javascript

我想檢查鼠標是否在jtml5畫布上順時針或逆時針移動javascript,但沒有得到如何繼續。

UPDATE
我所做的是我采用了3個XY坐標並計算了第1點和最后點之間的角度,如本文本文所述

var resultX = p2x - p1x;
var resultY = p2y - p1y;
var angle = Math.atan2(resultY, resultX) * 180 / Math.PI;

但是當我順時針移動鼠標時,結果是正向,直到鼠標向東南方向移動,但是當鼠標向西南方向移動時順時針方向移動,角度變為負值,這不應該發生,因為鼠標仍在順時針方向移動。

有任何建議請。

我假設你知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM