2012-10-01 32 views
0

我正在做一個(可能很簡單)的任務,其中我想使繪製對象移動到用戶控制(繪製太)。我所有的是球員X和Ycoördinate,分別定義爲Xp和Yp。必須移動(在觸發器之後,不包括在代碼中)到'player-object'的對象在this.X和this.Y中定義了它的coördinates。C#2D矢量運動 - 速度和方向

 int xDirection = Xp - this.X; 
     int yDirection = Yp - this.Y; 
     int angleInDegrees = (int)Math.Atan2(xDirection, yDirection); 
     double radians = (Math.PI/180) * angleInDegrees; 
     double xTmp = 3 * Math.Cos(radians); 
     int xSpeed = (int)xTmp; 
     double yTmp = 3 * Math.Sin(radians); 
     int ySpeed = (int)yTmp; 
     Console.WriteLine(xDirection); 
     Console.WriteLine(yDirection); 
     Console.WriteLine(xSpeed); 
     Console.WriteLine(ySpeed); 
     Console.ReadLine(); 

這不給我正確的數字,所以我想知道什麼可能是錯的。

關於這個最棘手的問題可能是必須移動到playerobject的對象可能從所有邊(360度)接近,但沒有可用的方法角度。

我希望能完成我的問題, 添

+0

只是可能導致問題的一些事情。您的XY座標,速度和角度_應該被視爲雙打。通過使用整數,會引入相當多的蠕變和舍入誤差(特別是在處理弧度時)。您還可以考慮引入明確的Degrees/Radians類以避免可能的混合兩者的情況。另外,考慮利用極座標來表示速度(角度+速度)。這裏既是樣本:http://stackoverflow.com/questions/12126907/when-should-i-define-a-explicit-or-implicit-conversion-operator-in-c/12232002#12232002 –

回答

1

Math.Atan2返回弧度值,所以其他的C#三角函數。

double angle = Math.Atan2(yDirection, xDirection); 

還要確保強制類型轉換到小數:

3.0 * Math.Cos(radians); 
+0

這是不是真的回答我的問題.. –

+0

@TimLagerburg毫米我已經指向你在你的代碼2級的錯誤,所以這可能是一個很好的入門:對 – catflier

+0

得到了他們已經固定;) –

1

我敢打賭,你看到的主要問題是這一行:

int angleInDegrees = (int)Math.Atan2(xDirection, yDirection); 

由於@catflier提到,Math.Atan2以弧度返回角度(所以數字範圍從0到2pi)。但是,你執行一個表演int其中截斷的小數位數。所以如果你的角度是45度,那實際上會返回〜0.785398弧度。投到int將會變成0。同樣,在90度時,即〜1.570796弧度,投射到int將導致1。這是重大的舍入錯誤。正如我在我的評論中提到的,考慮將所有類型更改爲雙精度,並且只在最後一點執行整型轉換(我假設您的對象基於整數進行定位)。