2014-04-10 18 views
7

Fare hareket açısını derece olarak hesaplamak istiyorum. Fareyi düz bir çizgide hareket ettirmek zorunda olmadığınızı bildiğim halde, iyi bir dik açı oluşturmak için başlangıç ​​ve bitiş noktalarına göre hesaplamayı deniyordum.Açıdaki fare hareketi açısının hesaplanması

log("ANGLE: " + getAngle(x1, y1, x2, y2)); garip sonuçlar veriyor:

ANGLE: 0.24035975832980774 
mouse has stopped 
ANGLE: 1.334887709726425 
mouse has stopped 
ANGLE: 0.2722859857950508 
mouse has stopped 
ANGLE: 0.3715485780567732 
mouse has stopped 

Kodu:

 $("canvas").mousemove(function(e) {     
      getDirection(e); 
      if (!set) { 
       x1 = e.pageX, //set starting mouse x 
       y1 = e.pageY, //set starting mouse y 
       set = true; 
      } 
      clearTimeout(thread); 
      thread = setTimeout(callback.bind(this, e), 100); 
     }); 

     function getAngle (x1, y1, x2, y2) { 
      var distY = Math.abs(y2-y1); //opposite 
      var distX = Math.abs(x2-x1); //adjacent 
      var dist = Math.sqrt((distY*distY)+(distX*distX)); //hypotenuse, 
       //don't know if there is a built in JS function to do the square of a number 
      var val = distY/dist; 
      var aSine = Math.asin(val); 
      return aSine; //return angle in degrees 
     } 

     function callback(e) { 
      x2 = e.pageX; //new X 
      y2 = e.pageY; //new Y 

      log("ANGLE: " + getAngle(x1, y1, x2, y2)); 
      log("mouse has stopped"); 
      set = false; 
     } 

cevap

5

Hesaplamanız doğru gibi görünüyor, ancak problem Math.asin (val) değerlerinin radyan cinsinden döndüğü.

Math.degrees = function(radians) 
{ 
    return radians*(180/Math.PI); 
} 

Sonra Math.degrees (Math.asin (val)) arayıp bu çalışması gerekir: dereceye dönüştürmek için aşağıdaki işlevi kullanın!

1

Math.asin() fonksiyon radyan cinsinden açısını döndürür. 180/pi ile çoğalırsanız, cevabı dereceler alırsınız. Ayrıca, 90 dereceden daha fazla bir değer istediğinizden, Math.abs aramasını düşürmeniz ve böylece aSin için negatif bir değere sahip olmanız gerekir. Bu nedenle, Math.abs aramasını düşürmeniz gerekir.

+0

Ah oops. Radyenleri 180/PI ile çarpmanın neden derece verdiğini söyleyebilir misiniz? – Growler

+0

Bu, radyan cinsinden bir derecenin tanımıdır. http://en.wikipedia.org/wiki/Radian#Conversion_between_radians_and_degrees – gcochard

+0

Lol Bunu ben de görmeliydim. Son olarak, daire etrafında hareket ettiğimi fark ettim, her zaman bir '90' cinsinden derece veriyor. Örn: Menşei sağ üst çeyreğe taşıma 0 ila 90 derece aralığında olabilir. Kökenden sağ alt çeyreğe geçerken, 270-360 arasında değişen derecelerde beklerim. Bunu nasıl düzeltirim? – Growler

2

tam daire içinde bir açı elde etmek için atan2 işlevini kullanın, Ek

radians = Math.atan2(y2-y1,x2-x1); 

, sen x1, x2, y1, hesaplama sırasında y2 değerlerini yapmak isteyebilirsiniz, bu olurdu Fare pozisyonunun izlendiği tek bir yere sahip olmak daha iyidir. Şu anda, fareyi her hareket ettirdiğinizde (x2, y2, t2) konumunu her 10 ms'de bir, ancak (x1, y1, t1) güncelleştirin. Bu çok tahmin edilemez örnek kombinasyonları ile sonuçlanabilir.

İlgili konular