[SimpleFileWriter] AS3 에서 파일을 저장하자



기존 의 http://www.scripter.co.kr/entry/Simple-Text-Writer-V01-간편한-파일-쓰기-어플 를 업그래이드 해봤다.

예전에는 Text 만 되는 반면 이번꺼는 모든 As3 의 ByteArray를 죄다 기록할수 있다.

사용법

as3

 
package 
{
    import flash.display.BitmapData;
    import flash.utils.ByteArray;
    import jjongun.server.file_Socket_Server;
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            var sp : Sprite = new Sprite();
            sp.graphics.beginFill(0xcc);
            sp.graphics.drawCircle(0, 0, 100);
            addChild(sp);
            
            //test
            var writer : file_Socket_Server = file_Socket_Server.getInstance();
            
            var data : BitmapData = new BitmapData(400, 400);
            data.draw(this);
            writer.writeFile("e:\test3.Png", writer.writeBitmap(data));
            
            
            var d : ByteArray = new ByteArray();
            d.writeUTFBytes("WOW!");
            writer.writeFile("e:/WOW.txt", d);
            
            
            var xml : XML = <root>AAA</root>;
            writer.writeFile("e:/test.xml", writer.writeText(xml.toXMLString()));
        }
    }
}

주의점은 경로를 적을때 "\" 를 적으면 에러난다.

관련 클래스는 첨부파일을 아래 "get AS3 file "에서 얻을수 있다.




* 버그수정 : 오버라이트시 파일바이트를 완전이 최신화 하지 못하는 버그가 있었다.
Yamecoder 야매코더_
C# 2011.03.10 14:37

[Draw Line Algorithm] 1. 기본(2) 총정리


[Draw Line Algorithm] 1. 기본(2) 총정리



우선 직선의 방정식은 위와 같다. (공통수학의 정석 554p) 두점 p1 , p2 을 알고 있을때 두점의 방정식이다.
m 은 기울기 이다. 즉 x점과 y점의 변화량이다. 그리고 이 공식에는 x1 과 x2는 같지 않을때 이다.
이때는 값이 무한대가 되거나 에러가 난다. 그래서 적절한 예외 처리를 해주어야 한다.



공식을 적용하여 보면 우선 기본적인 m이 -1보다 크고 1보다 작을때 이다. for 루프로 찍혀질
점(자취) _x의 영역을 잡고 범위 안에서 자취_y를 계산 하여 비트맵 데이터의 점을 찍는다.

이때 직선 방정식의 해의 범위가 실수 인데, 우리가 모니터로 보는 모는 비트맵 영역은 정수
이므로 정수로 타입 케스팅 된다
( 사용하는 언어에 따라 자동으로 타입캐스팅이 안되는 경우가 있다 )

이런 식으로 하나하나의 점이 모여 선이 되는것이다.

그러나 이 방법 대로 코딩을 해보면 특정 영역에서는 선이 이루어 지지 않는 경우가 있다.
예시로는 예전의 글의 데모를 보면 알수 있다 http://scripter.egloos.com/2272309 
특히 p0.x 와 p1.x 가 같아질때는 선이 아에 없어 진다.

그래서 범위를 나누어 처리할 필요가 있다. 
노란색 선은 기울기를 말한다. 기초 수학과 차이점은 원점이 좌측 상단이다 그래서 기초수학과 비교하여
기울기가 서로 반대 이다. (2D 의 경우)

점선은 P0.x 와 P1.x 가 같아질 경우 무한대(+- infinity) 혹은 (ZeroDivisionError) 가 발생할경우 인데 요것 역시  
if 로 처리하여 y= P1.x 꼴로 바꾸면 된다.
영역안에 글자는 if 로 처리할 영역의 조건들이다.

우선 P1을 기준으로 오른쪽은 바로 이전의 그림에서 해결하였다. 그리고 P1의 왼쪽영역은 두점의 예외만 처리하면
된다. 문제는 붉은색 영역이다. 붉은색 영역을 기존의 방법 으로 방정식을 풀면 아래의 그림처럼 나온다. 


for 루프는 _x의 영역만 해당하여 X축 에 해당하는 점은 충실히 찍었으나 위의 그림처럼 _x보다 _y가 클때
 선의 점을 모두 충당하지 못하는 경우가 발생한다. 이유는 아까도 말했드시 비트맵은 정수의 영역이기 때문에.
정수로 처리할수 없는 값이 나오기 때문이다.
이럴경우 점선이 되거나 영역을 벗어 나게 된다. 이는 기울기가 급격해 질수록 간격이 벌어져서 수직이 되면
사라지는 현상이 발생한다

이를 해결하기 위해서는 아래의 그림처럼 ...
X축과 Y축을 90도 돌려서 생각하면 된다. 즉 X성분과 Y성분을 를 서로 바꾸어 생각하면 된다.
유의 할점은 기울기 m 도 x성분과 y성분을 바꾸면 1/m 이 된다. 

위의 구차한? 설명들은 코드로 한방에 생각해 보자
코드를 보면 쉽다.

circle클래스는 단순한 Sprite 에 원을 그리고 글자를 넣은 단순한 클래스 이다.


위의 코드를 컴파일 하면
영역별로 선 색깔을 다르게 했다.

'수학' 카테고리의 다른 글

[Draw Line Algorithm] 1. 기본(2) 총정리  (90) 2010.12.04
[Draw Line Algorithm] 1. 기본(1)  (65) 2010.12.04
[회전변환] 특정좌표를 중심으로 회전변환  (122) 2010.12.04
[삼각함수] 기울어진 그리드의 좌표 구하기  (39) 2010.12.04
정렬  (45) 2010.12.04
atan2 를 "도" 로 환산  (200) 2010.12.04
Yamecoder 야매코더_
수학 2010.12.04 03:40

[회전변환] 특정좌표를 중심으로 회전변환


[회전변환] 특정좌표를 중심으로 회전변환

점 S 를 중심으로 점 P 를 R 만큼 회전 하였을때 P' 의 좌표를 구하는 공식!

회전변환 행렬을 보면 이러하다,.


그리고 이것을 정리하면

x' = (x-a) * cosR - (y-b)sinR
y' = (x-a) * sinR + (y-b)cosR

이것을 메소드로 만들면..


            private function init():void
               {
                    //특정 오브젝트 sp 의 원래 좌표
                    sp.x = 100
                    sp.y = 100

                    var ob:Object = transformation(0,0,sp.x,sp.y,30*Math.PI/180)   
                    trace(ob.x , ob.y)

                    sp.x = ob.x
                    sp.y = ob.y
               }

               private function transformation(cx:Number,cy:Number,
                                                  px:Number,py:Number,
                                                  rad:Number):Object
               {

                    var rx:Number = (px-cx)*Math.cos(rad) - (py-cy)*Math.sin(rad) + cx;
                    var ry:Number = (px-cx)*Math.sin(rad) + (py-cy)*Math.cos(rad) + cy;                 
                    return {x:rx , y:ry}     
               }

와 같이 좌표를 변환할수 있다.

그리고 참고자료
transformation.PDF 을 참고 하면 증명이 될것이다. 고등학교 수학이다.
문득 고등학교 수학선생님이 생각난다. 회전변환이 중요하다고는 하는데 그때당시 이유를
몰랐다. 하지만 프로그래밍을 하고 있는 요즘 그때 생각이 절로 난다.

그리고 약간 어눌하지만 칠판에 쉽게 그리는 3차원 변환좌표와 도형을 그리는 고등학교때
수학선생님은 지금 생각하건데 천재였다. 당시 코싸인과 싸인의 연속, 역함수와 행렬의
연속인 수식은 오늘날 생각하면 3D의 기초 로직이었다.

당시 선생님은 그러한것을 알고 가르치신 건지는 모르겠다만.
내가 기억하는 고등학교 수학선생님은 수업 시작시 수학책 한번만 보고 바로 덮는다.

그리고  예제나 질문을 칠판과 분필을 이용해 풀이했다. 엄청난 악필이었다.
하지만 다른 수학선생님들과 다르게 막힘이나 오답이 거의 없었다. 나이도 꾀 있으셨는데..
그래서인지 약간 고등학교 수준을 벗어나는 3차원 미적분 까지 경험?할수 있었던것같다.


'수학' 카테고리의 다른 글

[Draw Line Algorithm] 1. 기본(2) 총정리  (90) 2010.12.04
[Draw Line Algorithm] 1. 기본(1)  (65) 2010.12.04
[회전변환] 특정좌표를 중심으로 회전변환  (122) 2010.12.04
[삼각함수] 기울어진 그리드의 좌표 구하기  (39) 2010.12.04
정렬  (45) 2010.12.04
atan2 를 "도" 로 환산  (200) 2010.12.04
Yamecoder 야매코더_
수학 2010.12.04 03:38

[PageFlip] Foxy의 PageFlip을 이용한 책갈피 영역의 제한 로직


[PageFlip] Foxy의 PageFlip을 이용한 책갈피 영역의 제
한 로직
Yamecoder 야매코더_
tags : AS3, flash, Flex, pageFlip
수학 2010.12.04 03:37

원의 자취 구하기


원의 자취 구하기 수학


각도 sin(angle) = 높이(b) / 빗면(c)
각도 cos(angle)= 밑면(a) / 빗면(c)

밑면(a) = cos(angle)* 빗면(c)
높이(b) = sin(angle) * 빗면(c)

p1.x = cos(angle) *빗면(c)
p1.y = sin (angle) *빗면(c)

기초에 충실하자! 고등학교때 '얼싸안코' 가 생각난다.


또한 이를 응용하여 가로 세로 값을 알고 있을때는..

tan( angle ) = height/width
이고 , 각을 알기 위해 tan 를 넘겨야한다.

( angle ) = atan( height/width )
넘길때는 tan의 역수인 atan으로 넘긴다.

angle을 cos , sin 에 대입하여 푼다



또한 원의 중심점을 옮겨 자취를 구해야 할 상황이 생긴다.

                    var cx:Number = 100 // 가로로 움직일 양
                    var cy:Number = 100 // 세로로 움직일 양
                    var theta:Number = Math.atan2(mouseY - cy , mouseX - cx)
                    var p:Point = CirclePosition(theta , 100 , cx , cy)
                   
                    ob.x = p.x
                    ob.y = p.y

                   function CirclePosition( theta:Number,Radius:Number=100,cx:Number=0,cy:Number=0 ):Point
                  {
                          var tx:Number = cx+Radius*Math.cos(theta);
                          var ty:Number = cy+Radius*Math.sin(theta);
                          return new Point(tx,ty);
                  }

 만약 타원을 원한다면 tx 와 ty 의 반지름을 달리하면 된다!
Yamecoder 야매코더_
수학 2010.12.04 03:36

[HP의 Slate 안의 AdobeAIR ]





애플이 플래시를 깠는데,  과연 hp 의 타블렛이 , 플래시의 명예를 회복할수 있을지..


하지만 , 솔직히 새로울것은 없다 어차피 윈도우에서 돌아가는거랑 기술적으로 틀릴게 없다.

, , , , , ,

'New Tech' 카테고리의 다른 글

[죽이는 게임 ]Boost 3D  (122) 2010.12.04
Bump Top UI  (55) 2010.12.04
변해야 하는 이유  (40) 2010.12.04
The Intel Wall at CES  (111) 2010.12.04
[HP의 Slate 안의 AdobeAIR ]  (913) 2010.12.04
[Microsoft Surface Mobile] Sixsence의 상용화  (318) 2010.12.04
Yamecoder 야매코더_
New Tech 2010.12.04 03:01

[drawTriangles] 가장?쉬운 삼각형 응용 예제



 


testTriangle.zip

테스트 코딩이다.



Yamecoder 야매코더_
AS3 2010.12.04 02:41

[bitmapData Capture] stage capture 시 유의점

상황은 트위너로 5개의 cicle을 랜덤하게 트위닝 하고,
그것을 엔터프레임으로 비트맵 데이터로 캡춰를 하는 상황이다.

그리고 엔터프레임 안에는 기본적으로 아래와 같이 작성을 한다.

//in EnterFrame
capture = new BitmapData(stage.stageWidth, stage.stageHeight , false ,0xd0d0d0)
capture.draw(stage)
//

그럼 결과는


하지만 이것은 원하는결과가 아니다.
잔상이 없는 결과를 원하면 스테이지에 바로 addChild하지말고
컨테이너를 하나 만든다음 해줘야 한다.

//in EnterFrame
capture = new BitmapData(stage.stageWidth, stage.stageHeight , false ,0xd0d0d0)
capture.draw(contaner) // contaner 는 Sprite 인스턴스이다.
//

결과는



테스트 코드는 captureTest.txt
Yamecoder 야매코더_
AS3 2010.12.04 02:41
Powerd by Tistory, designed by criuce
rss