'프로그래밍/Actionscript3.0'에 해당되는 글 55건

  1. 2011/06/27 Verlet Integration - 게임에 어울리는 객체 운동 시뮬레이션
  2. 2010/10/20 3D 농구게임 - 플래시 (2)
  3. 2010/07/23 유머나라에 올라간 예전에 만들었던 플래시 (2)
  4. 2010/07/08 Actionscript 3 - 읽기쉬운 프로그래밍 하기 (2)
  5. 2010/07/03 플렉스로 만든 웹기반 그래픽 저작 툴 – Sumo Paint (2)
  6. 2010/06/29 플래시의 uint 표현방법
  7. 2010/06/26 Actionscript Project 로 Air 프로그래밍 하기
  8. 2010/05/26 플래시의 정수 표현 방법 - 2의 보수 표기법 (3)
  9. 2010/04/30 심심풀이로 만들어본 플래시 게임
  10. 2010/04/28 Actionscript3 - Matrix3D 의 버그?? (5)
  11. 2010/04/07 벡터의 외적 연산
  12. 2010/04/03 플레시 Actionscript 3.0 - 10만개 파티클 테스트 mouseX의 비용 체험 (6)
  13. 2010/03/20 flash - 3D rendering Test 와이어 프레임
  14. 2010/03/03 Actionscript 3 - Catmull-Rom Spline curve code
  15. 2010/02/26 Actionscript 3.0 /flash drawing
  16. 2010/02/04 컴퓨터가 그린 설리와 손담비 (3)
  17. 2010/01/21 Flash Actionscript Media Art - Line
  18. 2010/01/11 액션스크립트와 수학 - Bezier(베지어) 곡선 소스 source
  19. 2010/01/11 액션스크립트 3 . 전구줄 효과
  20. 2010/01/02 액션스크립트 3 - 확률 구하는 알고리즘
  21. 2009/12/28 Actionscript 3 , Isometric 과 PathFinding A*(astar) 알고리즘을 사용..
  22. 2009/12/21 Actionscript 3 원과 원 충돌 테스트
  23. 2009/11/25 Actionscript3 - TheFWA 따라한것..
  24. 2009/11/23 Actionscript3 - 원과 선의 충돌 테스트
  25. 2009/11/12 Actionscirpt 3.0 - Papervision3D (1)
  26. 2009/11/07 Actionscript 3.0 - 탄성 이미지
  27. 2009/11/03 Actionscript 3.0 3D Cube
  28. 2009/11/01 Actionscript3.0 Wave
  29. 2009/11/01 Actionscript 3.0 흐름...
  30. 2009/10/31 Actionscript 3.0 역기구학

  이곳에 가시면 Verlet Inegration의 구현에 대해 매우 상세히 설명되어 있는 글을 보실 수 있습니다. 설명되어 있는 예제가 html5의 Canvas를 이용하였기 때문에, 크롬 브라우저나 파이어폭스 혹은 익스 9 버전으로 확인 하셔야 합니다.


위의 예제는 Verlet Integration을 이용하여 구현해본 것입니다.  전에 Euler Integration을 사용하여 비슷한걸 구현해 본적이 있는데요. Verlet Integration을 이용하면 놀라울 정도로 간단히 구현할 수 있습니다.

Posted by 웹눈

( 위 아래 화살표로 화면 회전 가능합니다 )
3D 링과 백보드 충돌 테스트를 해볼겸 만들었던 것입니다.

회전력에 대한 운동도 구현해 보아야 겠습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈

10만개 파티클 

제가 만든게 웹상에 돌아다니니까 신기하네요.. 지돌스타님이 손봐주신거지만.. ㅋㅋ

http://webnoon.net/entry/플레시-Actionscript-30-10만개-파티클-테스트-mouseX의-비용-체험

Posted by 웹눈

Actionscript 3 로 만든 프로그램을 이해하기 위해서는 프로그램의 수행흐름을 따라가야 합니다. 즉, 머리속에 현재 프로그램의 수행상태, 제어흐름, 데이터 흐름등을 파악하고 있어야 합니다.

저는 플래시 프로그래밍을 하다보면, 이벤트 모델의 사용으로 인해 수많은 함수 분기가 일어나서 나중에 그 프로그램을 다시 보았을때 수행흐름을 파악하는데 어려움을 겪었습니다.

즉, 제가 원했던 것은 아래와 같은 수행흐름을 이해하기 편한 표현방법 이었다면,

이해하기 쉬운 플래시 프로그래밍 하기

실제로는 아래와 같이 되는게 일반적이였습니다.

읽기 쉬운 프로그래밍 하기

이렇게 되면 구현내용을 일일이 파악해야지 이 프로그램이 무엇을 하는것인지 이해가 가능할것입니다.

이런 어려움을 겪고 있던 저는 얼마전 구세주와 같은 해결방법을 보게되었습니다. 바로 hika님이 포스팅 하신 “Message Queueing 서비스” 라는 포스트입니다. hika님이 알려주신 팁을 적용하면, 위와 같은 문제점은 대략 아래와 같이 해결가능해졌습니다.

이해하기 쉬운 플래시 프로그래밍 하기

(위에 예를든 프로그램과 별개입니다. 헷갈리실수도 ^^;) 아래는 디버그 결과입니다.

이해하기 쉬운 프로그래밍 - 디버그 결과

init 함수 안에 이 프로그램에 대한 수행흐름을 모두 나타낼수 있었습니다. 이로써 자세한 구현사항을 파악하지 않아도 이 프로그램이 무엇을 하는 프로그램인지 보다 쉽게 이해가 가능해진것 같습니다.

 

p.s - 제목은 마치 읽기쉬운 프로그래밍을 할수 있는 방법을 제시할것처럼 해놓았지만 결국은 “Message Queueing 서비스”에 대한 저의 감상문 정도의 글이 였습니다. ^^; 개인적으로 이런 훌륭한 팁을 마구마구 알려주시는 hika님께 매우 감사드린다는… 아무튼, 보다 구체적이고 원론적인 내용을 원하시는 분들은 위에 언급한 포스트를 읽어보세요.

Posted by 웹눈

웹기반 소프트웨어에 대한 자료를 조사하던중 플렉스로 제작된 그래픽 저작툴을 발견하였습니다. 아무래도 포토샵에 비해서는 기능이 부족해보이지만 플렉스로 이런 소프트웨어를 만들었다는 자체가 저에게는 놀랍기만 하네요.

 

플렉스로 만든 그래픽 저작툴 - sumo paint

Sumo Paint는 보시는 바와같이 무료는 아니지만 Try Online 버튼을 클릭하시면 테스트하실수 있습니다. 아래는 테스트 화면입니다.

Sumo Paint 실행화면 - 플렉스로 만든 웹기반 소프트웨어

Posted by 웹눈

저번에 “플래시의 정수 표현방법 - 2의 보수표기법” 이라는 제목으로 포스팅한 적이 있습니다. 그 포스트에 hika 님이 uint 에 관해서도 진리표 작성을 권유(?) 하셔서 한번 삽질을 해보았습니다.

우선 uint는 양의 정수만을 표현할때 사용하는 기본형으로, 32비트를 사용하여 양의 정수를 표현한다고 레퍼런스에 나와있습니다. 최대값이 int 형의 두배가 된다고도 나와있는데 (즉, 2^32  – 1 ,정확히 두배는 아니…음..) 여기에서 32비트 전부를 수를 표현하는데 사용한다는걸 알수 있었습니다.

그럼 간단히 테스트를 해본 결과를 보겠습니다.

플래시의 uint 표현방법

위 그림과 같이 255 크기의 uint 를 byteArray에 쓰고, 한 바이트씩 읽었습니다.

여기서 4번째 바이트를 읽어왔을때 반환값이 –1 인것을 볼수 있는데, 이것은 ByteArray의 readByte() 메소드는 int형을 반환하고, 2의 보수표기법을 사용하는 int형은 비트열 11111111 을 -1로 표현한다는것을 알수 있습니다.

따라서 플래시의 uint형은 비트열의 32비트열의 2진 체계를 그대로 10진법으로 변환하여 표현해주는 방식을 사용한다고 볼수 있겠습니다.

Posted by 웹눈

플래시 빌더4를 사용해서 Actionscript Project 형식으로 Air 프로젝트를 생성 하는 방법을 알아보겠습니다.

 

1. File > New > "Flex Project"
2. 프로젝트 이름을 입력합니다. 예로, “Foo”
3. "Desktop (runs in Adobe AIR)" 를 선택합니다.
4. "Finish" 버튼을 클릭.
5. "Foo.mxml" 지웁니다.
6. File > New > ActionScript Class 에서 Sprite 를 상속받는 Foo.as 파일을 생성합니다.
7. 완료 버튼 클릭.
8. "Foo.as" 파일에 마우스 우측 버튼을 클릭후,  "Set as Default Application" 를 선택합니다.
9. Foo.as 생성자에 다음과 같이 입력합니다. "this.stage.nativeWindow.visible = true;"
10. Run & Done!

image

Posted by 웹눈

플래시에서 정수를 표현하기 위해 어떤 비트패턴을 사용하는지 알아보고 정수를 사용할 때 나타날수 있는 이슈사항들에 대해 알아보도록 하겠습니다.

 

1. 컴퓨터의 정수표현 - 2의 보수 표기법

 

2의 보수 표기법(two’s complement) 은 컴퓨터에서 정수 표현에 사용되는 표기법이며 다른 표기법으로는 초과 표기법이 있습니다.

이 글에서는 플래시에서 정수를 표현하는데 사용되는 2의 보수 표기법에 대해서 알아보도록 하겠습니다.

 

현재 플래시는 길이가 32인 비트패턴을 사용하여 정수를 표현하고 있습니다. 여기서는 2의 보수 표기법이 무엇인지 설명하기 위해 내용전달이 충분히 가능면서 보다 설명하기 편한 길이가 4인 비트패턴을 사용하겠습니다.

 

2의 보수 표기법은 양수와 음수의 정보를 나타내는 하나의 최상위 비트와 나머지 값을 나타내는 비트들로 이루어져 있습니다. 길이가 4인 비트패턴으로 예를 들면 아래 표와 같습니다.

 

비트 패턴

표현 값

0111
0110
0101
0100
0011
0010
0001
0000
1111
1110
1101
1100
1011
1010
1001
1000

7
6
5
4
3
2
1
0
-1
-2
-3
-4
-5
-6
-7
-8

 

2의 보수 표기법에서 최상위 비트(제일 왼쪽 비트) 0은 양수를 , 1은 음수를 표현합니다. 이는 부호비트(sign bit) 라고 불립니다. 나머지 3비트는 정수의 크기를 나타내는데, 양수 표현에서는 일반 2진 체계로 정수를 나타내는 방법과 동일합니다. 즉, 정수 3은 2진 체계로 010 의 값으로 나타낼수 있습니다.

 

여기서 음의 정수를 표현한 비트패턴과 양의 정수를 표현한 피트패턴 사이에는 재미있는 규칙이 있습니다. 양의 정수 비트패턴을 오른쪽에서 왼쪽으로 읽어나갈 때 처음으로 1이 나오는 부분까지는 양과 음의 비트패턴이 같고, 나머지는 양의 정수 비트패턴과 보수관계 입니다. 예를 들어 정수 2와 -2의 비트 패턴을 살펴보면, 비트 패턴의 오른쪽으로 부터 2번째에 처음으로 1이 나오고, 3번째 부터는 양수와 음수의 비트패턴이 보수관계에 있는것을 볼수 있습니다. (보수 관계란 1은 0 , 0은 1 이 되는것을 말함.)

 

위의 보수 관계를 이용하면 음의 정수 7의 비트패턴을 양의 정수 7의 비트패턴을 이용하여 구할수가 있는데, 다음과 같이 양의 정수 7의 비트패턴을 구하고 (0111), 오른쪽으로부터 처음으로 1이 나오는 자리 다음부터 보수를 취하면 됩니다. (1001)

 

2. 플래시의 int 를 사용할때 나타날수 있는 이슈사항

 

정수를 표현하기 위해 이용하는 비트의 자리수에 따라 표현할수 있는 정수의 최대값과 최소값이 정해지는데, 위의 4비트로 예를 들면, 부호 비트 하나를 제외한 나머지 비트열들의 경우의 수 만큼 정수를 표현할수 있습니다( 즉, 양수는 2^3 –1 , 음수는 - 2^3 ).  플래시는 정수를 표현하기 위해 길기가 32인 비트패턴을 사용하므로, 최대값은 2^31 – 1 , 최소값은 -2^31 이 됩니다.

 

얼마전 팀에서 모 증권 사이트 프로젝트를 진행한적이 있는데, 다른 팀원분이 금액을 나타내기 위해 int 형을 사용해서 이슈가 되었던 적이 있습니다. 즉, 원(WON) 단위 금액을 표현하는데, 최대로 표현할수 있는 수 2,147,483,647 (약 21억) 을 넘어가니까 오버플로(overflow) 가 발생한것이지요.

 

 

 

Posted by 웹눈
회피(avoid) 게임의 일종입니다. 사실 이런 게임을 어디선가 보고 약간의 아이데이션만 추가해서 만들어본 게임입니다.
게임이라 하기에는 무리가 있을수도 있습니다. ^^;

간단한 공 충돌만 필요해서 다른 물리엔진은 사용하지 않았습니다.

운동량 보존법칙을 사용해서 충돌반응을 하는 시뮬레이션 자체는 어렵지 않은것이나 "어디선가 보았던" 아름다운 알고리즘이 있어서 그것을 약간 손보고(버그 해결?) 적용해보았습니다.

그 알고리즘에 관련되서 간단히 포스팅한게 있는데 날려먹기로 포스팅 한것이라 ;; 나중에 출처(어느 외국인 블로거 분이셨는데 까먹었..;;) 부터 해서 소스를 분석하는 시간을 가져보도록 해야겠습니다.

지금은 구조를 공부하고 있으니 이 게임에 한번 실험해 봐야겠네요..


녹색공을 마우스로 콘트롤하여 빨간색 공을 피하셔야 합니다. 빨간색 공끼리 충돌하면 일정 확률로 파란색 공이 되는데 그것을 드셔서 위험을 줄이세요!
저작자 표시 비영리 변경 금지
Posted by 웹눈
아래와 같이 내장 API인 Matrix3D 을 사용해서 객체를 X,Y,Z 축으로 로테이션 시켜보려하였습니다.

_mat = new Matrix3D();
_mat.identity();
_mat.appendRotation(1, Vector3D.Y_AXIS) ;

_vec = new Vector3D(100,0,0) ;

private function loop(e:Event):void
{
_vec = _mat.transformVector(_vec) ;

_obj.x = _vec.x ;
_obj.y = _vec.y ;
_obj.z = _vec.z ;
}

그런데 위와 같이 실행하면 _vec (Vector3D) 의 x,y,z 성분이 모두 0으로 수렴(?) 하게 되네요. 레퍼런스를 찾아보면 Matrix3D 의 transformVector 멤버함수는 매개변수로 넘어온 벡터에 변환을 적용한후 새로운 Vector3D 객체를 반환한다고 나오는데 해석을 잘못한건지 ..

그래서 일단 CustomMatrix3D 클레스를 만들어 보았습니다.

CustomMatrix3D 를 사용해서 위와 같은 시도를 해보았습니다.
package example.matrix {
   
    import flash.display.Shape;
    import flash.events.Event;
    import flash.geom.Vector3D;
   
    import flash.display.Sprite;

    /**
     * @author Lee
     * http://webnoon.net
     */
    public class MatrixMain extends Sprite {

       
       
       
        private var _vec : Vector3D;
        private var _ball : Shape;
        private var _mat : CustomMatrix3D;

        public function MatrixMain() {
           
           
           
           
            _vec = new Vector3D(100,0,0) ;
            _vec.w = 1 ;
            var rad : Number = Math.PI/180 ;
           
            _mat = new CustomMatrix3D() ;
            _mat.rotationY(rad) ;
            //_mat.rotationZ(rad) ;
            //_mat.rotationX(rad) ;
            //_mat.translation(0, 1, 0) ;
           
            _ball = new Shape();
            with(_ball.graphics)
            {
                beginFill(0xff0000) ;
                drawCircle(.0, .0, 10) ;
                endFill();
            }
            addChild(_ball) ;
           
            addEventListener(Event.ENTER_FRAME,loop);
        }
       
        private function loop(event : Event) : void {
           
            _mat.transformVector(_vec) ;
           
            _ball.x = _vec.x + stage.stageWidth/2;
            _ball.y = _vec.y + stage.stageHeight/2 ;
            _ball.z = _vec.z ;
           
        }
    }
}

[소스코드]

아래는 실행 결과...


rotationX,Y,Z , translation 모두 잘 적용됨을 알수 있습니다.

Flash Builder4 에서 실행결과 flash.geom.Matrix3D 사용에는 이상이 없었습니다.
오류(?) 가 발생한 환경은 FDT + Flash CS4(컴파일) 입니다.
개발 환경이 잘못된건지 제가 실수한건지 정확히 알수는 없지만 Flash Builder4 에서 실행한 코드는 같은 코드로 실행하였습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈

벡터 외적 연산의 핵심은 연산한 결과가 연산한 두 벡터에 수직인 벡터로 표현된다는 점이였습니다.
외적 연산의 수학적 표기방법은 X 를 사용합니다.
(내적은 dot를 사용해서 dotproduct , 외적은 X 를 사용해서 crossProduct라고 불립니다.)



위 SWF 에서 볼수 있듯이

 녹색 선은 L2 벡터.
빨간색 선은 L1 벡터.
파란색 선은 L3 벡터. 로 표현하고 있고,

 L2 X L1 = L3 의 결과를 나타내고 있습니다.

 화살표키로 로테이션 시킬때마다 L2 X L1 의 연산결과를 나타내고 있습니다.

 

내장 Vector3D API 를 사용한 연산은 아래와 같습니다.

var l1 : Vector3D = new Vector3D(100,0,0);
var l2 : Vector3D = new Vector3D(0,100,0) ;
var l3 : Vector3D = l1.crossProduct(l2) ;

 

위 코드에서 벡터 l1은  방향은 x축방향이고 크기는 100 인 벡터입니다.
l2 는 방향은 y축 방향, 크기는 100인 벡터입니다.

 두 벡터의 외적 연산 결과는 l3로 벡터이며, 크기는 |l1|*|l2|*sin@ (여기서 @는 l1과 l2의 사이각) 이고 방향은 양의 Z축과 평행한 방향입니다.(l1과 l2의 수직한 방향).

 만약 여기서 외적 순서를 바꿔서 l2.crossProduct(l1) 을 하게 되면 l3는 크기는 위와 같고 방향은 음의 z축방향을 향하게 됩니다.

 여기서 볼수 있듯이 외적계산은 교환법칙이 성립하지 않으며, 이러한 성질을 이용해서 3D 엔진에서 평면을 렌더링할때,평면이 앞을 바라보고 있는지 뒤를 바라보고 있는지 알수 있습니다.

 예를들어, l3와 시선벡터 Vector(0,0,-1)를 내적을 하게 된 결과가 양수이면 앞면을 바라보고 있는것이고, 음수이면 뒤를 바라보고 있는것입니다.

 

위 예제 sWF에서 l3와 Vector(0,0,-1)을 내적해서 양수(앞면)이면 노란색으로 평면을 칠하고, 음수(뒷면)이면 회색을 칠하도록해보았습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈
어제 지돌스타님의 10만개 입자를 이용한 유체 시뮬레이션 포스팅에서 최적화에 관한 팁을 보고 간단한 시뮬레이션을 만들어 보았습니다.

플레시 10만개 파티클 particle 테스트

그림 1-1. 대충 이러한..


대충 모양은 그림 1-1과 같습니다. 마우스 포지션에 따라 각각의 파티클들이 적절한 힘을 받도록 해보았습니다. 그런데 분명 지돌스타님의 시뮬레이션보다 연산하는 양이 매우 적었음에도 불구하고 지돌스타님의 시뮬레이션과 같은 속도는 나오지 않았습니다.

그래서 차이점이 무엇인가 곰곰히 생각해보니, 마우스에 대한 인터랙션 부분이 보였습니다.

매번 프레임마다 수행되는 mouseX, mouseY의 값을 임의의 특정한 값으로 고정시켜 보았습니다.
var dx : Number = pt.x - mouseX ;
var dy : Number = pt.y - mouseY ;

//이부분을 아래와 같이..
var dx : Number = pt.x - 200 ;
var dy : Number = pt.y - 200 ;

그랬더니 체감 속도가 엄청 향상된것을 느낄수 있었습니다. (디버깅 모드는 귀찮아서 패스..)
아무래도 mouseX와 mouseY 가 많은 비용을 필요로 한다는것을 경험할수 있었습니다.

*추가사항

위와 같은 문제점에 대해서 hika님이 해결 방법을 알려주셨습니다.

실시간으로 fps를 측정하여서 render주기를 조절하는 방법입니다.
var time:uint
++fps;
time = getTimer();
if( time > fpsNext ){
fpsNext = time + 1000;
renderRate = 1000 / fps;
fps = 0;
}
if( time > renderNext ){
mx = mouseX;
my = mouseY;
renderNext = time + renderRate; 
}



저작자 표시 비영리 변경 금지
Posted by 웹눈
+ SpaceBar = 와이어 프레임 보이기 / 숨기기
+ Shift = 폴리곤 보이기 /숨기기

플레시 캠프에서 본것을 따라해보려고.. 우선 와이어 프레임으로 구성된 Shape과 렌더링 엔진만 만들어보았습니다.
다음에는 쉐이더를 얹힌 버전으로 업로드 해봐야겠습니다.
Posted by 웹눈
TAG 3d, flash



more..


사용방법은.. 곡선을 이을 포인트(x,y쌍) 배열을 매개변수로 넘긴다. $n 은 보간 정도..

ex)
var points : Vector.<Number> = Vector.<Number>(50,50,100,200,200,100,300,300);
var path : Vector.<Number> = CatmullRomSpline.curve(points,20) ;

path[2*i] -> x
path[2*i+1] -> y

Posted by 웹눈




Posted by 웹눈

ㅋㅋ... 그리는 과정은 아래에..


Posted by 웹눈

just click..


Posted by 웹눈


{\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}(1-t)^{n-i}t^i\mathbf{P}_i =(1-t)^n\mathbf{P}_0+{n\choose 1}(1-t)^{n-1}t\mathbf{P}_1+\cdots
+{n\choose n-1}(1-t)t^{n-1}\mathbf{P}_{n-1}+t^n\mathbf{P}_n,\quad t \in [0,1],}

^n\mathbf{C}_i = {n \choose i} = \frac{n!}{i!(n-i)!}.


위키미디아 에 나와있는 베지어 공식입니다.

위 식을 액션스크립트 3 코드로 짜보았습니다.

package sk_engine.math {
 /**
  * @author Lee Seul - ki
  * http://webnoon.net
  */
 public class Bezier {
  public function Bezier():void
  {
   
  }
  /*
   * 매개변수 t는 분활되는 정도. 값이 클수록 비용이 크다.
   */
  public static function getPath(t:uint,pt:Vector.<Number>):Vector.<Number>
  {
   var n : uint = pt.length*.5 - 1 ;
   var path : Vector.<Number> = new Vector.<Number>() ;
   var dist : Number = 1 / t ;
   var tv : Number = 0 ;
   for (var j : Number = 0; j <= t; j++) {
    var x : Number = 0 ;
    var y : Number = 0 ;
    for (var i : int = 0; i <= n; i++) {
     x += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2] ;
     y += cn(n,i)*Math.pow((1-tv),n-i)*Math.pow(tv, i)*pt[i*2+1] ;
    }
    path.push(x);
    path.push(y);
    tv += dist ;
   }
   return path ;
  }
  /*
   * (n i) 연산
   */
  private static function cn(n : uint, i : uint):Number
  {
   return factorial(n)/(factorial(i)*factorial(n-i)) ;
  }
  /*
   * 팩토리얼 연산
   */
  private static function factorial(val:int):uint
  {
   var cr : uint = 1 ;
   for (var i : int = val; i > 1; i--) {
    cr *= i ;
   }
   return cr ;
  }
 }
}

이것을 활용한 예제를 보시려면 이곳으로 가세요.
Posted by 웹눈



Bezier 커브와 Hook's law 를 응용..
Posted by 웹눈
RPG 게임을 하다가 ( ㅡㅡ; )  흔히 말하는 '아이템 지르기' 를 했다.

성공할 확률은 60%. 즉, 10 번 시도하면 6번은 성공한다는 말인데... 도대체 왜 자꾸 아이템을 날려 먹는것이냐고..

그래서 확률에 대해서 생각을 해보다가 함수를 만들었는데, 목적은 0< p < 1 의 값을 넘겨주면 그 확률(p)에 대한 Boolean 값을 반환하는  함수 이다.

즉, p = 0.1 이 되면 10번 중에 1 번 꼴로 true 값을 반환하는 함수이다.

(분명 어딘가에..  아름다운 알고리즘이 있을테지만...무식한게 용감하다고...)

public function probability(percent:Number):Boolean
         {
             var divvy : Number = Math.min(1,percent);
             divvy = Math.max(0,divvy);
            
             var $i : uint = 0 ;
             var divideValue : Number = 10 ;
            
            
             while(divvy != Math.round(divvy))
             {
                 $i++ ;
                 divvy = divvy * divideValue ;
             }
             var N : Number = Math.floor(Math.pow(divideValue,$i)*Math.random()) ;
             return (N < divvy) ;
         }

예를 들어 다음과 같이 이 함수를 실행하면..

for(var i:uint = 0 ; i < 100 ; i++ )
{
      if(probability(0.03))
      {
trace("성공") ;
       }
}

성공 메세지는 평균 3회 정도 출력된다.


Posted by 웹눈


기존의 것을 접목시킨 정도..
Posted by 웹눈

<-클릭


기존의 방식은 두 원간의 거리 차가 두 원의 반지름의 합보다 작으면, 충돌을 확인하는 방법이였다면, 이 방식은 두 원의 속도 벡터를 분석하여, 충돌이 일어날지의 여부를 미리 예측하고 그에 따른 적절한 대응을 해준것이다.

두 원을 각각 s0 , s1 이라고 하고, 두원의 시간(t)에 대한 위치를 p0 , p1 이라고 하자. (0<= t <= 1 )

p0(t) = C0 + V0*t
p1(t) = C1 + V1*t

로 쓸수 있다.

그럼 시간에 따른 두 원간의 거리를 d(t) 로 나타내어 보면

d(t) = p1(t) - p0(t) = (c1 - c0) + (v1 - v0)*t

즉, d의 length 가 두 원의 반지름의 합(r0 + r1) 보다 작으면 충돌이 일어나게 된다.

if (|d| <= r0 + r1 ) -> 충돌

Cost 를 절감하기 위해서(sqrt 함수 사용을 피하자, 이는 고비용을 요구한다.)

d.dot(d) = = r^2 일때의 t의 값을 구하면 충돌지점을 알아낼수 있다.

d = c + v*t 라고 하면,

c.dot(c) + 2*c.dot(v)*t + v.dot(v)*t^2 = r^2

이 방정식을 근의 공식을 사용해서 풀면 t를 구할수 있음..

즉, c0.add(v0 * t) 의 위치에서 충돌이 발생한다.



Posted by 웹눈


여기저기서 눈에 많이 뛰는 예제네.. TheFWAwonderfl 에서 나왔길래.. 한번 만들어 본것..
Posted by 웹눈


Posted by 웹눈
(<-흰색 영역 마우스 클릭)

open API 를 사용하는건 별로 안좋아하는데...

그냥 심심해서 만들어 본것....



'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscript3 - 원과 선의 충돌 테스트  (0) 2009/11/23
Actionscirpt 3.0 - Papervision3D  (1) 2009/11/12
Actionscript 3.0 - 탄성 이미지  (0) 2009/11/07
Actionscript 3.0 3D Cube  (0) 2009/11/03
Posted by 웹눈


FDT3 테스트겸 만든것...

'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscirpt 3.0 - Papervision3D  (1) 2009/11/12
Actionscript 3.0 - 탄성 이미지  (0) 2009/11/07
Actionscript 3.0 3D Cube  (0) 2009/11/03
Actionscript3.0 Wave  (0) 2009/11/01
Posted by 웹눈


'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscript 3.0 - 탄성 이미지  (0) 2009/11/07
Actionscript 3.0 3D Cube  (0) 2009/11/03
Actionscript3.0 Wave  (0) 2009/11/01
Actionscript 3.0 흐름...  (0) 2009/11/01
Posted by 웹눈


'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscript 3.0 3D Cube  (0) 2009/11/03
Actionscript3.0 Wave  (0) 2009/11/01
Actionscript 3.0 흐름...  (0) 2009/11/01
Actionscript 3.0 역기구학  (0) 2009/10/31
Posted by 웹눈


'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscript3.0 Wave  (0) 2009/11/01
Actionscript 3.0 흐름...  (0) 2009/11/01
Actionscript 3.0 역기구학  (0) 2009/10/31
ActionScript 3.0, 스프링, 탄성운동  (0) 2009/10/23
Posted by 웹눈


'프로그래밍 > Actionscript3.0' 카테고리의 다른 글

Actionscript 3.0 흐름...  (0) 2009/11/01
Actionscript 3.0 역기구학  (0) 2009/10/31
ActionScript 3.0, 스프링, 탄성운동  (0) 2009/10/23
Actionscript 3.0 // spaceship  (1) 2009/10/11
Posted by 웹눈