2010-06-17 279 views
2

您好,我只是在做一個小動畫,它將對象從a點移動到b點或按角度/弧度移動。C#動畫 - 將對象從A移動到B或按角度移動對象

我目前擁有的是這個

Point CalcMove(Point pt, double angle, int speed) 
    { 
     Point ret = pt; 

     ret.X = (int)(ret.X + speed * Math.Sin(DegToRad(angle))); 
     ret.Y = (int)(ret.Y + speed * Math.Cos(DegToRad(angle))); 

     return ret; 
    } 

,但它不看我所期待的。

請幫忙?

更新:
OH和正在使用NETCF


CalcMove(點Pt,雙角度,INT速度)
「點Pt」 是當前對象位置。 「角度」是對象應該去的地方。 「速度」是一步。


所以數天以後。
這裏是我工作過的.. Neko for Windows Mobile 6.5

+0

你需要告訴我們哪些角度你正在使用的三角形。從左到騎?從下到上? – 2010-06-17 17:15:52

+0

你使用度數還是弧度? – luke 2010-06-17 17:35:16

+0

「degress」,從0到360,或者我有一個0(北),90(東),180(南)和-90(西)的方法。這些值我傳遞(我猜誤導參數)「角」 – jaysonragasa 2010-06-17 17:44:16

回答

1

使用旋轉矩陣。此代碼將從一個點(X,Y)由THETA弧度移動到新的點(PX,像素)

Point Rotate(x, y, theta) 
    int px = (x * Math.Cos(theta)) - (y * Math.Sin(theta)); 
    int py = (y * Math.Cos(theta)) + (x * Math.Sin(theta)); 
    return new Point(px, py); 
end 

上面所用的矩陣,

[cosθ - sinθ][x] 
[cosθ + sinθ][y] 

可否移動周圍的圓上的點使用圖形座標時順時針旋轉

上週我做了同樣的事情。您可以通過查找您希望移動的全部theta,然後將其除以幀數(或步數)來設置動畫。現在,在某個任意點(例如(0,半徑))處開始每一步,然後增加一些計數器totalSteps,並始終從該初始點開始移動。如果你簡單地移動點本身,每一幀你都會累積一些錯誤,但是如果你總是從當前增量開始移動,停止增量== totalTheta時,它會是完美的。讓我知道這是否合理。

也許我應該多說明一點。比方說,你有一個方法「BeginMove」:

double totalTheta = 0; 
double increment = 0; 
double currentTheta = 0; 
bool moving = false; 
void BeginMove() 
{ 
    totalTheta = (2 * Math.PI)/numObjects; 
    increment = totalTheta/steps; 
    currentTheta = 0; 
    moving = true; 
} 

現在你有哪些更新,此舉每一幀的方法:

void Update 
{ 
    if (!moving) return; 
    // do a min/max to ensure that you never pass totalTheta when incrementing. 
    // there will be more error handling, but this is the basic idea. 
    currentTheta += increment; 
    SomeObject.Location = Rotate(0, radius, currentTheta); 
    moving = (currentTheta < totalTheta); 
} 

有顯然會更加這裏的邏輯根據您的具體情況,但這個想法是:

  1. 找到總共移動的theta。
  2. 找到增量(totalTheta/steps)
  3. 維持一個已經移動的總數。
  4. 在每次移動之前將跑步總數增加角度增量。
  5. 從圓上的相同(任意)點開始每個移動,並按運行總數旋轉。
  6. 重複,直到運行總數==總θ。
+0

也會嘗試這一個。 – jaysonragasa 2010-06-17 17:46:57

+0

我上週剛剛做了一個視頻遊戲項目(我的愛好)。它絕對有效,所以如果你遇到任何麻煩,請告訴我。 – 2010-06-17 17:50:48

+0

一定會嘗試。現在創建新的示例項目,並將回報 – jaysonragasa 2010-06-17 18:03:52

0

是的,你的公式不正確了一下:

讓我們把實際的角度α和要旋轉的角度爲β d是線的長度:d = sqrt(x x + y y)

要計算新座標,我們需要:

罪(α+β)= COSβ罪α+罪βCOSα

COS(α+β)= COSαCOSβ - 罪α罪β

COSα= X/d 罪α= Y/d

新COORDS將是: X = SIN(α+β)* d Y = COS(α+β)* d

all together:

double d = Math.Sqrt(x*x + y*y); 
double sina = pt.Y/d; 
double cosa = pt.X/d; 
double sinb = Math.Sin(DegToRad(angle)); 
double cosb = Math.Cos(DegToRad(angle)); 

ret.X = (int)(cosb*sina + sinb*cosa); 
ret.Y = (int)(cosa*cosb - sina*sinb); 
+0

謝謝安德烈。這是否適用於我的角度從0到360?對不起,一個非常愚蠢的問題..但是x和y從「double d = Math.Sqrt(x * x + y * y)」哪裏來的;「會從哪裏來? – jaysonragasa 2010-06-17 16:56:51

+0

他們pt.X和pt.Y – Andrey 2010-06-17 17:00:41

+0

比它需要更復雜。 – 2010-06-17 18:30:42

0

在每次測試失敗的那些建議的代碼(我感到羞恥)..我剛想出一個非常古老的解決方案。

繪製每xypixel了一圈,這裏有一個方法,我做到了前回TurboBasic(DOS)

x = xcenter + radius * Cos(radian)<br/> 
y = ycenter + radius * Sin(radian) 

我通過使XY中心爲對象的位置應用了同樣的想法,半徑只是一個值增量(每步),和弧度是由從A點移動到B點的最後一個XY對象位置和目的地XY

現在,我有我的目標計算