2011-05-09 65 views
1

我正在嘗試將一些位圖相對於中心點進行動畫處理。他們並不都是從那個中心點開始的,但我希望他們能飛出去,就好像來自中心點的力量猛擊了他們,並徑向向外推動它們,使它們完全飛離舞臺。如何使用atan2在線計算第三個點?

所以:我知道中心點以及圍繞它排列的每個位圖的x和y位置。對於每一個我可以從中心畫一條線到那個x,y點。然後,我應該能夠將該線形成的角度與水平線相接,然後在該線上設置更遠的目標點。位圖將被補償到那一點。我相信這就是Math.atan2的目的。

下面是我得到了什麼,因爲我遍歷位圖的陣列(我是一個對象):

var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX) * 180/Math.PI; 
var dist:Number = 200;    //arbitrary number, just to test 
destX = centerX + dist * Math.cos(angle); //destination x 
destY = centerY + dist * Math.sin(angle); //destination y 

,而不是這些事情徑向滑動出來,他們跳來跳去。

我很難理解atan2以及我做錯了什麼。

感謝,

大衛

+0

只要有可能,您可以使用MatrixTransformer助手類:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/motion/MatrixTransformer.html因爲它的rotateAroundExternalPoint()和rotateAroundInternalPoint()方法 – 2011-05-09 22:27:52

回答

0

嘗試取出* 180/PI以保持角度弧度。

var angle:Number = Math.atan2(i.bitmap.y-centerY, i.bitmap.x - centerX); 

然後改變destX和destY到

destX = i.bitmap.x + dist * Math.cos(angle); 
destY = i.bitmap.y + dist * Math.sin(angle); 
+0

只要我使dist爲負數,這似乎工作。 – David 2011-05-10 01:25:23

+0

我不知道我是否應該添加一個新的問題或什麼,但是......因爲我已經與此合作,我已經意識到將dist編碼爲負數是不好的。總的來說,這些事情應該從中心點出發。如果我們將中心點視爲原點,那麼如果位圖的x> centerX,那麼它應該向右移動;如果 centerY,它應該向下移動,如果y David 2011-05-29 22:55:42

0

ATAN2能在這種情況下,我想工作,但我只想用ATAN:

VAR角度:數= Math.atan((i.bitmap.y - centerY)/(i.bitmap.x - centerX));

此外:我剛纔看到的,似乎做你想做的另一個論壇

代碼(有僅是從你在第一時間寫了一個微小的差別)

var angle:Number = Math.atan2(mouseX,mouseY-180)-Math.PI/2; 
var xNew:Number = 20*Math.cos(angle); 
var yNew:Number = -20*Math.sin(angle); 
+0

我認爲你的意思是Math.atan(...我嘗試過,但有些東西還是錯的,它們在跳動,還需要Math.atan2,如果你想要的行爲在所有四個象限(負值和正值,x和y)保持一致 – David 2011-05-10 00:55:02

+0

哎呀好點是我的意思是數學。atan – jhocking 2011-05-10 01:04:22

+0

此外,我認爲atan2的參數是y,x不是x,y – 0e4ef622 2014-04-29 05:10:01

1

您可以直接用向量運算達到同樣的效果,而不三角函數:

var dist:Number = 200;    //arbitrary number, just to test 
var dx:Number = i.bitmap.x - centerX; 
var dy:Number = i.bitmap.y - centerY; 
var length:Number = Math.sqrt(dx*dx + dy*dy); 
var normalizeddx:Number = dx/length; 
var normalizeddy:Number = dy/length; 
destX = centerX + dist * normalizeddx; //destination x 
destY = centerY + dist * normalizeddy; //destination y 

這應該是要快得多,比使用三角函數功能。我不知道actionscript的語言細節,因此可能會優化更多。

0

你必須擺脫* 180/Math.PI部分。角度必須以弧度表示。所以第一行看起來像
var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX); 其餘的應該沒問題。

相關問題