2011-05-09 3 views
1

중심점과 관련하여 일부 비트 맵을 애니메이션화하려고합니다. 그들은 그 중심점에서 모두 시작하지는 않지만, 나는 그 중심점으로부터의 힘이 그들 속으로 빠져 나와 방사형으로 바깥쪽으로 밀린 것처럼 무대 밖으로 완전히 날아갈 수 있도록 날아 가기를 원합니다.atan2를 사용하여 세 번째 점을 계산하는 방법은 무엇입니까?

So : 중심점과 그 주위에 배열 된 각 비트 맵의 ​​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() 메서드에 대해 –

답변

0

이를 제거하십시오 (당신이 처음에 쓴 것과 약간의 차이는있다) * 180/PI를 사용하여 각도를 라디안 단위로 유지합니다. 삼각 함수를 사용하는 것보다, 훨씬 더 빨리

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 

이되어야한다 :

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

그런 다음 당신은 그냥 벡터 연산을 사용하여 삼각 함수 않고 같은 효과를 얻을 수

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

이것은 dist를 음수로 만들면 작동하는 것 같습니다. – David

+0

새로운 질문이나 뭐 추가해야할지 모르겠지만 ... 이와 같이 작업 한 것처럼 dist를 음수로 하드 코딩하는 것은 좋지 않습니다. 요점은 이러한 것들이 중심점에서 움직여야한다는 것입니다. 중심점을 원점으로 생각하면 비트 맵의 ​​x가> centerX이면 오른쪽으로 이동해야합니다. centerY이면 아래로 이동해야하고 y David

0

ATAN2 내가 가정이 상황에서 일할 수 있지만, 난 그냥 ATAN 사용합니다 :

VAR 각도 : 번호 = Math.atan ((i.bitmap.y를 - centerY)/(i.bitmap.x - centerX));

ADDITION : 난 그냥 당신이 원하는 것을 할 것으로 보인다 다른 포럼에서 본

코드

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

+0

죄송합니다. 나는 수학을 의미했습니다.atan – jhocking

+0

또한 atan2에 대한 매개 변수는 y, x는 x, y가 아닌 것 같아요 – 0e4ef622

1

에 destX 및 destY 변경 기능. 나는 액션 스크립트의 언어 특성을 모른다. 아마 이것은 더 최적화 될 수있다.

0

* 180/Math.PI 부분을 제거해야합니다. 각도는 라디안이어야합니다. 그래서 첫 번째 줄은 다음과 같을 것입니다.
var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX); 나머지는 괜찮을 것입니다.

관련 문제