[AS3 , C# ,Serialize]AS3 와 C#의 직렬화 비교

[AS3 , C# ,Serialize]AS3 와 C#의 직렬화 비교



먼저 As3.0( AIR2.0 ) 이다
as.swfcsharp.swf

Created with colorer-take5 library. Type 'csharp'

//c#�� [Serializable] 와 비슷한 개념
[RemoteClass]
public class Test
 {
        private var _str:String = "test";
        public function Test()
        {
            
        }
        
        
        public function get str():String
        {
            return _str;
        }

        public function set str(value:String):void
        {
            _str = value;
        }
}


//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\





            
            //********************
            // as3(AIR2.0 ) code
            //********************
            private function init():void
            {                            
                
                //--------------------
                //  save data
                // 
                // 임시저장 위��는 :
                // C:\Documents and Settings\<내계정>\Application Data\TestSerialize\Local Store
                // ---------------------
                
                
                var t:Test = new Test;
                t.str = "321321321ㅋㅋㅋㅋ";
                //파일을 만들고
                var savefile:File = File.applicationStorageDirectory.resolvePath("data.dat");
                
                //스트림으로 기록 한다.
                var fileStream:FileStream = new FileStream();
                fileStream.open(savefile , FileMode.WRITE);
                fileStream.writeObject(t);
                fileStream.close();
                t= null;
                
                
                
                
                
                // ----------------
                // load data
                // ------------------ 
                
                //파일위��를 참고��고
                var loadfile:File = File.applicationStorageDirectory.resolvePath("data.dat");
                //존재여부를 판단��여,
                if(loadfile.exists){
                    var _t:Test;
                    var fileStrem:FileStream = new FileStream();
                    //읽고, 
                    fileStream.open(loadfile , FileMode.READ);
                    //타입캐스팅 한다
                    _t = fileStream.readObject() as Test;
                    
                    trace(_t.str);
                }
            }
 
 
 
 
 
 
 
 
 
 
 
그다음은 c# (3.0)
 
 
 
 
 
 
 

 
 
 
 
 
 
Created with colorer-take5 library. Type 'csharp'

// ****************
// c#(3.0) code
// *****************

using System;
using System.Collections.Generic;
using System.Text;
//* 추가된 네임스��이스 **//
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    //as3�� [RemoteClass] 와 비슷한개념 //
    [Serializable]
    
    class TestSerilize
    {
        private string str = "test string";
        public String STR
        {
            get{ return str; }
            set { str = value; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {

            //------------
            // save data
            //------------

            TestSerilize s = new TestSerilize();
            s.STR = "!@!@!zz,zㅋㅋㅋㅋ";
            // 파일을 만들고
            Stream saveFile = new FileStream("data.dat", FileMode.Create, FileAccess.Write , FileShare.None);
            BinaryFormatter bf_save = new BinaryFormatter();
            // 바이너리로 쓴다.
            bf_save.Serialize(saveFile, s);
            saveFile.Close();
            s = null;

            


            //---------
            // loadData
            //-----------
            
            try
            {
                //파일을 읽고,
                Stream loadFile = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
                BinaryFormatter bf_load = new BinaryFormatter();
                //바이너리를 읽는다
                TestSerilize _s = (TestSerilize)bf_load.Deserialize(loadFile);
                loadFile.Close();
                Console.WriteLine("deSirialize " + _s.STR);
            }
            catch (IOException e)
            {
                //��시�� ��는,  에러를 ��리한다.
                Console.WriteLine("파일이 없거��..");
            }
        }
    }
}
 
 
 
비슷 하다. 하지만 as3 에서 파일경로를 프로젝트 위치로 하면 보안오류가 발생한다.

(아마 둘의 직렬화 파일을 바꿔치기 하면,, 안되겠지. ㅋ )
Yamecoder 야매코더_
C# 2010.12.04 03:53

[Draw Line Algorithm] 1. 기본(1)


[Draw Line Algorithm] 1. 기본(1)

XNA 에 별다른 비트맵 API가 없다는것을 알고 , 한번 픽셀을 다루기로 했다.

우선 브레슨햄 알고리즘 에 들어가기 전에 일반적인 선을 그리는 알고리즘을

살펴 보아야 하겠다.

먼저 우리가 비트맵에 선을 긋기 위해서는 일반적으로 두점을 필요로 한다. 
(물론 한점과 기울기를 이용할수도 있겠지만 특별한 경우가 아니라면 정확한 포인팅이 가능한 두점을 이용한다)  

우선 고등학교 기초 수학에 보면 두점을 알때 직선 방정식은 ..

(공통수학의 정석 p554)

p0(x0 , y0) 와 p1(x1,y1) 을 알때 직선의 방정식은 

Y - y0 = ( y1 - y0 / x1 - x0 ) * ( X - x0)  (단 , x1  !=  x0)

이러하다. 기본적인 Y = m*X 라는 공식에 대힙하면  ( y1 - y0 / x1 - x0 ) 이 기울기 이자

변화량 이란것쯤은 알수있다. 나머지 Y - y0  ,  X - x0  은 평행 이동 이다.

누구나 알고 있을법한 이 방정식을 비트맵 위에 표현해보자.

우선 비트맵은 정수들 "맵" 이다, 위의 공식의 영역은 "실수" 이다.

따라서 정수로 다운캐스팅 하여 표현 해야 한다.


이제 한번 본격적으로 for 루프를 생각해 보자

기본적으로 X 축 변화량을 생각하면 범위를 쉽게 생각할수 있다.
이다. 따라서 for 루프는 다음과 같이 될수 있겠다.

for( var _x:int =p0.x   ; _x < p1.x  ; ++_x)
{
    //
}


이것으로 공식의 우변 _x 를 설정 했다. 그리고 이것을 Y에 넣기 전에 기울기 m을 설정하자

var m:Number = (p1.y-p0.y)/(p1.x-p0.x);

이다

이제 루프를 완성하면

for( var _x:int =p0.x   ; _x < p1.x  ; ++_x)
{
     var _y:int =Math.round(m*(_x-p0.x) + p0.y);
     data.setPixel(_x,_y,0);
}


완성하면 여기서 dataBitmapData 이다.

그리고 위의 직선 공식을 정리하면 _y 값을 얻을수 있는데 

아까도 말했드시 비트맵은 정수를 사용하여서  round 로 반올림을 하여 정수화 했다.

이 공식을 이용하여 간단히 프로그래밍 해보면,.

Bresenham1_as.swf

p0 와 p1을 직접 움직여 보자



와 같은 결과를 낸다.  ( 브라우저에서 해보기 보단 직접 다운하여 로컬에서 추천)

그런데 조건이 있다.

1.
Y - y0 = ( y1 - y0 / x1 - x0 ) * ( X - x0)  (단 , x1  !=  x0)
에서의 조건인데 p0.x 와 p0.y 가 같으면 안되고

2.
또한 위의 결과물에서는 기울기가 (-) 이 되었을때 , 즉( p0.x > p1.x ) 가 되었을때,

3.
x의 변화량 보다 y의 변화량이 클때 , 즉 기울기가 1 보다 클때 비트맵의 양 조절


이렇게 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:39

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


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

점 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

[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

[socket] c# server , as3 client


pc1 ( server ): c# (windows 7)








pc2 ( client ) : AS3 (windows xp)



c# code (partial)



Created with colorer-take5 library. Type 'csharp'

/*
 * SharpDevelop으로 작성��었습니다.
 * 사용자: jjongun
 * 날짜: 2010-02-09
 * 시간: ��전 9:05
 * 
 * 
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Timers;


namespace testServer3
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        private delegate void serverMrgDele(string str);
        private System.Timers.Timer catchClient;
        private System.Timers.Timer readTimer;
        private IPAddress address;
        private Int32 port;
        private TcpListener server;
        private serverMrgDele mrg;
        private TcpClient client;
        private StreamWriter writer;
        private StreamReader reader;
        private NetworkStream stream;
        
        private Thread serverThread;
        private Thread checkThread;
        private Thread readThread;
        void ConnectBtClick(object sender, EventArgs e)
        {
            if(ipTx.Text == "")
                ipTx.Text = "127.0.0.1";
            if(portTx.Text == "")
                portTx.Text = "1000";
            try{
                address = IPAddress.Parse(ipTx.Text);
                port = Convert.ToInt32(portTx.Text);
            }catch(FormatException fe)
            {
                Trace.WriteLine(fe);
                ipTx.Clear();
                portTx.Clear();
            }
            
            mrg = new serverMrgDele(traceBox.AppendText);
            
            Thread serverThread = new Thread( new ThreadStart(startServer));
            readThread = new Thread(new ThreadStart(readClinet));
            checkThread = new Thread(new ThreadStart(checkClinetStatus));
            serverThread.Start();
        }
        
        //thread1
        private void startServer()
        {
            server = new TcpListener(address , port);
            Invoke(mrg , "start" + Environment.NewLine);
            server.Start();
            client = server.AcceptTcpClient();
            Invoke(mrg , "client connect" + Environment.NewLine);
            stream = client.GetStream();
            
            writer = new StreamWriter(stream);
            
            readThread.Start();
            checkThread.Start();
        }
        
        //thrad2
        private void readClinet()
        {
            reader = new StreamReader(stream);
            readTimer = new System.Timers.Timer();
            readTimer.Elapsed+= new ElapsedEventHandler(readTimer_Elapsed);
            readTimer.Interval=100;
            readTimer.Start();
        }
        
        void readTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Invoke(mrg , reader.ReadLine() + Environment.NewLine);
        }
        
        
        
        //thread3
        private void checkClinetStatus()
        {
            catchClient = new System.Timers.Timer();
            catchClient.Elapsed += new ElapsedEventHandler(catchClient_Elapsed);
            catchClient.Interval = 100;
            catchClient.Start();
        }

        void catchClient_Elapsed(object sender, ElapsedEventArgs e)
        {
            //????
            //Trace.WriteLine(client.Connected);
        }
        
                
        private int checknum = 0;
        void SendBtClick(object sender, EventArgs e)
        {
            checknum ++ ;
            if(sendTx.Text =="")
                sendTx.Text = "mrg form C#" + checknum.ToString();
            writer.WriteLine(sendTx.Text + "\n");
            writer.Flush();
        }
        
        void DisconnectBtClick(object sender, EventArgs e)
        {
            try{
                client.Close();
            }catch( Exception ex){}
            writer.Close();
            reader.Close();
            server.Stop();
        }
    }
}
 
 
 
 
 
 AS3 code (flex4)
 
 
 
 
 
 
 
 
 
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"
               width="299" height="522">

    <fx:Script>
        <![CDATA[
            
            private var client:Socket;
            protected function connetBt_clickHandler(event:MouseEvent):void
            {
                
                client = new Socket;
                
                if(ipTx.text == "")
                    ipTx.text = "127.0.0.1";
                if(portTx.text == "")
                    portTx.text = "1000";
                
                client.connect(ipTx.text , int(portTx.text));
                client.addEventListener(Event.CONNECT , serverConnect);
                client.addEventListener(ProgressEvent.SOCKET_DATA , onData);
                client.addEventListener(Event.CLOSE , disconnect);
                
                // TODO Auto-generated method stub
            }
            private function serverConnect(e:Event):void
            {
                traceBox.appendText("connect server" + "\n");
            }
            private function onData(e:ProgressEvent):void
            {
                trace("data");
                traceBox.appendText("c#Mrg : " + client.readUTFBytes(client.bytesAvailable) + "\n");
            }
            private function disconnect(e:Event):void
            {
                traceBox.appendText("close server" +"\n");
                client.close();
            }

            protected function sendBt_clickHandler(event:MouseEvent):void
            {
                if(sendTx.text == "")
                    sendTx.text = "mrg from As3";
                client.writeUTFBytes(sendTx.text + "\n");
                client.flush();
            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:TextArea x="10" y="89" width="279" height="276" id="traceBox"/>
    <s:TextArea x="11" y="390" width="279" height="26" id="sendTx"/>
    <s:TextArea x="10" y="10" height="24" width="149" id="ipTx"/>
    <s:TextArea x="167" y="10" height="24" width="122" id="portTx"/>
    <s:Button x="10" y="42" label="connect" width="279" id="connetBt" click="connetBt_clickHandler(event)"/>
    <s:Button x="10" y="474" label="disconnect" width="279" id="disconnectBt"/>
    <s:Button x="10" y="425" label="sendMrg" width="279" id="sendBt" click="sendBt_clickHandler(event)"/>
</s:Application>
 
 
 
c#에서는 stream을 readLine 으로 받는다. 따라서 
as3 에도 string 값을 "  somstring  " + " \n" 으로 줄을 넘겨줘야 c#에서 read 할수 있다.
Yamecoder 야매코더_
tags : AS3, c#, Flex, socket
C# 2010.12.04 00:14
Powerd by Tistory, designed by criuce
rss