2014-04-04 86 views
1

我想要使用加速度算法來改變假定的移動速度以在2D環境中移動它。在例如:基於加速度移動對象

positionX = positionX + (speed based on acceleration); 
positionY = positionY + (speed based on acceleration); 

我的問題是,如果我那樣做的結果,假設速度爲50,將位置+ = 50,這是完全錯誤的,因爲我不希望使用速度它將在軸上移動的X的數量。我希望速度成爲軸數的某種基礎。 在例如,如果讓說速度爲50和50的速度是指每移動3×那麼這意味着

positionX + speed = positionX+3; 

我希望創建一個在代碼與加速度方法將由百分比增加速度沿。 所以我的問題是如何使速度成爲一種參考點。

+0

你需要速度和方向,或者只是簡化了這個,並有兩個speex,一個用於x軸,另一個用於Y軸 – user902383

+0

我希望速度相同我已經有一個方向方法,但我想改變軸基於速度的位置。我已經實現了所有這些,但用簡單的x + 3或y + 3,我想現在實現速度 – user3498565

+0

我會使用離散時間步驟,並在每一步:1.計算加速度值,如果它正在改變; 2.加速加速; 3.將速度轉換爲座標的增量(因爲我知道您使用不同的單位來進行速度和座標); 4.通過在步驟3中檢索的值增加座標。順便說一句,您可能還需要計算速度矢量的角度,因爲您有兩個座標,並且通過速度值增加它們會產生sqrt(2)倍的速度比實際更大(畢達哥拉斯定理)。 –

回答

-1

這樣的:

double calculateSpeed(double value) { 
    return value/16.66; 
} 

,並調用它是這樣的:

positionX = positionX + calculateSpeed(50); 
+0

是的,但這不實際位置X + 50? – user3498565

+0

不,因爲50除以16.66這實際上是3 – markusw

1

你只需要使用的運動方程爲每個軸:

X(t)= X + v0 * t + 1/2 * a * t^2#其中x0是初始位置,v0是初始速度,a是您正在考慮的加速度,全部相對於軸線

現在,您需要定義計算位置的瞬間,以及按照@markusw建議的正確單位寫入速度和加速度的值。

+0

這就是我想用我的問題是在Java代碼中轉換此。完全誠實,我吸吮數學,所以這就是我需要幫助。 – user3498565

+0

@ user3498565:你不需要*更多*數學,它就在那裏。只要不要忘記使用'double'0.5而不是整數除法並將't'重寫爲't * t'。那麼它是有效的Java。 – maaartinus

2

保持簡單。物理並不難。 「數學」並不比乘法和加法更困難。

你想處理速度和位置隨時間增量的變化。

位置,速度和加速度是向量。在你的2D世界中,這意味着每個人都有一個在X和Y方向的組件。

所以,如果你增加你的時間:

t1 = t0 + dt 

您的位置將改變這樣如果速度超過該時間增量dt的常數:

(ux1, uy1) = (ux0, uy0) + (vx0*dt, vy0*dt) 

速度將改變這樣如果在該時間遞增dt時加速度是恆定的:

(vx1, vy1) = (vx0, vy0) + (ax0*dt, ay0*dt) 

更新如果存在使用牛頓定律的力,則加速:

(ax0, ay0) = (fx0/m, fy0/m) 

其中m是身體的質量。

在時間步結束時更新位置,速度和加速度並重復。

這假設在步驟開始時使用加速度和速度的值是足夠準確的。這會限制你相對較小的時間步長。 (它被稱爲「顯式整合」)。

下面是一個例子。你在(x,y)=(0,0)處有一個大炮,裏面有一個20磅質量的炮彈。大炮從水平傾斜30度。我們會忽視空氣阻力,所以在x方向上沒有任何力量作用於炮彈。只有重力(-32.2英尺/秒^ 2)將在y方向上起作用。

當大炮熄滅時,它將以40英尺/秒的初始速度發射炮彈。 (vx,vy)分量爲(40 * cos(30度),40 * sin(30度))=(34.64 ft/sec,20 ft/sec)

所以,如果插入我們的方程組0.1秒的時間步長:

(ax0, ay0) = (0, -32.2 ft/sec^2) 
(vx1, vy1) = (vx0, vy0) + (ax0, ay0)*dt = (34.64 ft/sec, 20 ft/sec) + (0, -3.22 ft/sec) = (34.64, 16.78) 
(ux1, uy1) = (ux0, uy0) + (vx0, vy0)*dt = (3.464 ft, 1.678 ft) 

以這些值爲起點,以0.1秒爲另一個時間步。沖洗,重複......

您可以單獨爲x軸和y軸執行此操作。

通過使炮彈的初始高度等於炮輪直徑的一半,可以使其稍微更加真實。

您可以在x方向添加一個小的負向加速度來模擬風阻。

假設您的目標沿着x軸向右。

如果你用大炮指向直線向上發射,則方程將顯示球向上,減速到達其頂點,然後直線下降。沒有命中,除了你的頭和大炮。

如果你用大炮水平方向射擊,方程式會說球在x方向上以恆定速度移動並且只落在大炮的初始高度。你的敵人會嘲笑你:「空氣球!空氣球!」因此,如果你想讓球與目標位置的某個爆炸半徑內的地面相交(又名到達位置y = 0),就必須使用初始速度和炮塔角度水平。

+0

該死的這是非常簡單的解釋,謝謝。我不在乎質量,所以我們可以忽略這一點。現在只是爲了確保在java中做到這一點,我基本上必須爲X軸和Y軸單獨做對嗎?還有可能告訴我如何從我自己的(x,y)到目標的(x,y)找到我的距離?我知道(myX-targetX)+(myY-targetY)是錯誤的,據我記得我需要做一些連接2個點的直線的角落,但我不能在java中這樣做。 – user3498565