아.. 귀찮다. ㅡㅡ;

필요한 클래스는 세가지.

MarshalByRefObject를 상속하는 Class. 이 놈이 Server에서도 쓰이고 Client에서도 쓰인다.
RemoteObject : MarshalByRefObject

Server클래스에서는 아래 두 줄만 추가해주면 된다.

ChannelServices.RegisterChannel(new TcpChan());
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "TESTUri", WellKnownObjectMode.Singleton);

Client측에서는 아래 두 줄만 추가해주면 된다.

ChannelServices.RegisterChannel(new TcpChannel());
RemoteObject _rmtObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://127.0.0.1:9999/TESTUri");


더 이상의 설명은 귀찮다. ㅡㅡ;
필요하면 아래 코드 다운받아 쓰시도록ㅎㅎ

물론 위의 방법은
Single Call, Singleton, Client Activated Object 중 Singleton이며

Code와 Configuration 방법 중 Code에 해당한다.

더 궁금한 사항이 있다면 아래의 글을 참조바란다. 아주 쥑이게 정리 잘 해놨다.

http://hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=469&Key=&Value=

더보기



신고
Posted by ParkPill 박필





오토마타.

얼마전 string pad 한글 지원을 위해 찾아본 오토마타.

알고리즘과 같은 어떤 개념 같았는데 영 공부하기가 귀찮아서
 
아래 유니코드 한글 코드표를 보고 알고리즘을 만들어 버렸다.


LibHangul 이라는 오픈 소스도 찾았으나 사용법을 배우기 귀찮아서

역시 그냥 만들어 버렸다.


혹, 만들기가 더 귀찮거나 남이 만든거 공부해서 사용하는게 편한 사람은

받아가셔요~


그리고 역시 내가 나중에 쓸 수도 있기에 백업삼아 올려놓는다 ㅋㅋ

수고요~



- 유니코드 자모값의 코드표 : http://www.unicode.org/charts/PDF/U1100.pdf
- 유니코드 완성형 한글 코드표 : http://www.unicode.org/charts/PDF/UAC00.pdf


 

신고
Posted by ParkPill 박필

Graphics g = Graphics.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle);

뭐 다른 설명 필요하신 분? ㅋㅋ

C# 에서 CreateGraphics() 이 WPF에 없습니다! 그래서 혹시나 필요하신 분들은 요놈을 쓰시면 됩니다.

어지간하면 Blend에서 다 가능하지만 또 고집스러운 사람들(나... ㅋㅋ)이 있기에 올려봅니다. ㅋㅋ

신고
Posted by ParkPill 박필
영어 공부해서 어따 쓰랴. 아래의 주소에 있는 글을 번역해서 올려본다.
출처 : http://www.wpftutorial.net/IntroductionTo3D.html

WPF 3D 소개

 

3D 그래픽 기초

 3D 그래픽의 개념은 사물에 대한 세 개의 관점 즉 3차원을 가진다는 것이다. 우리의 화면이 단 2개의 차원만을 가지고 있기 때문에 우리는 사물의 단면을 가지는 camara를 정의해야 한다. 아래의 사진은 사물을 평면에 투사한 것이다. 이 투사도는 3D 엔진에 의해 비트맵으로 렌더링된 것이다. 이 엔진은 3차원의 공간에 존재하는 모든 에 의해 계산된 모든 픽셀의 색을 결정한다.

 사물의 모든 면은 물질(Material) Brush를 가진다. 물질은 특정 각도에서 얼마만큼의 빛을 반사할 것인지 그리고 Brush는 색을 결정한다. Brush는 단색일 수도 또는 Gradient일수도 혹은 Texture라고 불리는 Image일 수도 있다.

 

삼각형의 세계

 

 3D 그래픽의 세계에서는 모든 사물은 삼각형의 집합으로 이루어진다. 하지만 왜 굳이 삼각형일까? 그 이유는 삼각형이 2D의 화면에 나타내기에 가장 균일한 기하학적 구조이기 때문이다. 렌더링 엔진은 한 장면에서 빛과의 각도와 물질을 바탕으로 각각의 삼각형의 색을 계산할 수 있다. 만일 우리가 세상을 사각형으로 표현한다면 그 점들은 평면일 수가 없다. 또한 모든 표면들은 표현하거나 계산하기에 훨씬 더 복잡할 것이다.

 

3D로 만들어진 사물의 표면을 우리는  Mesh(덩어리)라고 부른다. Mesh는 수만은 3차원 점들을 이루어져 있다. 이 점들을 우리는 Vertices(점들)이라고 부른다. Vertices삼각형들을 정의하는 어떤 감싸는 패턴에 의해서 합쳐져 있다. 모든 삼각형들은 앞면과 뒷면이 구분되어져 있고 오직 앞면만이 렌더링된다. 앞면은 점들을 감싸는 순서에 의해 정의되어진다. WPF는 반 시계방향의 감싸는 패턴을 가지고 있다. 오른손의 법칙이라는 걸 기억하는가? 주먹을 쥐고 엄지를 들면 엄지를 제외한 나머지 손가락들은 엄지를 기준으로 반 시계방향을 만들어낸다. 엄지는 윗면을 나타내고 나머지 손가락들은 반 시계방향을 이루는 것이다.(, 엄지가 나타내는 방향이 앞면인 것이다)

 


오른손 좌표 시스템
 
 WPF는 오른손 좌표 시스템을 사용한다. 아래의 그림처럼 오른손을 만들었을 때 손가락들이 가리키는 방향이 양의 방향이 된다.


 3D 화면의 구성요소

-         Viewport 3D

Viewport 2D 3D 사이에 문을 열어주는 Control이다.

-         Camera

모든 3D화면 정확히 하나의 camara를 가진다. Camera Position(위치) LookDirection(보는방향) 그리고 UpDirection(위쪽 방향)을 가진다. WPF는 원근법과 직각투영법을 지원한다.

-         3D Models

3D model은 화면상의 사물을 의미한다. 이 기하학적 사물은 mesh meterial을 가지는데, 그 중 meterial은 그 자체로써 brush를 가지며 빛을 분산시키거나 반사시키거나 혹은 발산시킬 수도 있다

-         Lights

빛이 없으면 우리는 아무것도 볼 수가 없다. 그래서 우리는 사물들을 비추기 위해

장면당 최소한 하나의 빛을 갖추어야 한다. WPF는 여러 가지의 빛을 지원한다.

l       AmbientLight

l       DirectionalLight

l       PointLight

l       SpotLight

 

Hello 3D-world : A simple cube

 아래의 예제는 정육면체를 형성하는 12개의 삼각형으로 8개의 점이 이어진 기초적인 정육면체 cube를 어떻게 만드는지를 보여준다.


<Viewport3D>
   <Viewport3D.Camera>
      <PerspectiveCamera Position="-40,40,40" LookDirection="40,-40,-40 " 
                         UpDirection="0,0,1" />
   </Viewport3D.Camera>
   <ModelVisual3D>
      <ModelVisual3D.Content>
         <Model3DGroup>
            <DirectionalLight Color="White" Direction="-1,-1,-3" />
               <GeometryModel3D>
                  <GeometryModel3D.Geometry>
                     <MeshGeometry3D Positions="0,0,0 10,0,0 10,10,0 0,10,0 0,0,10 
                        10,0,10 10,10,10 0,10,10"
                        TriangleIndices="0 1 3 1 2 3  0 4 3 4 7 3  4 6 7 4 5 6 
                                         0 4 1 1 4 5  1 2 6 6 5 1  2 3 7 7 6 2"/>
                  </GeometryModel3D.Geometry>
                  <GeometryModel3D.Material>
                     <DiffuseMaterial Brush="Red"/>
                  </GeometryModel3D.Material>
               </GeometryModel3D>
            </Model3DGroup>
         </ModelVisual3D.Content>
      </ModelVisual3D> </Viewport3D>
신고
Posted by ParkPill 박필
TAG 3D, c#, csharp, cube, WPF, 강좌

투명하게! 맑게! 자신있게!!!

자~ Bitmap을 투명하게 해보자.

왜?

이쁘니까 ㅡㅡ;

아래와 같다!!

 
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bmp);
g.Clear(pictureBox1.BackColor); //잔상제거
ImageAttributes att = new ImageAttributes();
att.SetColorKey(Color.FromArgb(0, 0, 0), Color.FromArgb(30, 30, 30));   //색상 영역.
g.DrawImage(_animation.OnDrawOnBmp(), _destPoints,
                     new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height), GraphicsUnit.Pixel, att);
pictureBox1.CreateGraphics().DrawImage(bmp, new Point(0, 0));

혹! 필요한 사람은 다운받아 쓰셔용~ ㅋㅋ

신고
Posted by ParkPill 박필


 어떤 클래스의 인스턴스를 하나로 여러 곳에서 접속하고 같은 데이타를 받아야 할 때가 있다.

흔히 뒤에 Manager라는 이름이 붙은 클래스이다.

리소스를 관리하여 여기저기에 데이터를 뿌려주거나 수집하는 역할을 하는 클래스의 인스턴스!

고놈이 리소스를 나눠주는데 있어서 Thread간의 충돌 없이 원활이 일을 수행할 수 있도록

도와주는 것이 바로 이 Singleton이라는 놈이다!

딱히 싱글톤이라는 클래스가 있는건 아니고 말하자면 일종의 '개념'이다.

그럼 아래를 보자.

 
public sealed class Singleton
{
    static Singleton instance=null;
    static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance==null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

출처 : http://www.yoda.arachsys.com/csharp/singleton.html

위와 같이 생성자를 만들 수 있도록 만들어 주고.

부를 때는

 Singleton.instance.메소드();

 Singleton.instance.리소스 = 리소스;

이런 식으로 부르면 된다.


신고
Posted by ParkPill 박필


간혹 쓰래드 안에서 혹은! 동적으로 만들어진 컨트롤이 다른 윈도우 컨트롤의 모양(레이아웃)을 건드리려 한다면!!

다음과 같은 에러가 발생한다. 

 System.UnauthorizedAccessException: Invalid cross-thread access

혹은

Cross-thread operation not valid: blah blah blah :p

그럴땐 어찌하는냐!! 

Delegate를 써야한다.

윈도우 컨트롤에게 InvokeRequired라는 걸로 이렇게 물어본다.

"내가 니 몸뚱이 색깔 좀 바꿀려는데 좀 기다릴까?"

그러면 InvokeRequired가  true/false로 대답해 줄 것이다. ㅋㅋ

허나 질문에 주의하라! true면 기다리라는 것이므로 Delegate로 하나 더 날려준다.

그리고 false가 나오면 바꾸면 된다.

InvokeRequired는 바꾸려는 컨트롤의 것을 사용해야한다. 

아래의 경우 패널을 바꾸기 위해 사용한 것. 그러므로 InvokeRequired는 패널에게 물어본다. 

코드는 아래와 같다.

        private Command PopupInvoke(Popup popup, ScreenPanel pnl)
        {
            if (pnl.InvokeRequired)
            {
                InvokeDelegate<Popup, ScreenPanel> id = new InvokeDelegate<Popup, ScreenPanel>(PopupInvoke);
                pnl.Invoke(id, new object[]{popup, pnl});
            }
            else
            {
                popup.Size = pnl.Size;
                pnl.Location = new Point(0, 0);
                pnl.Parent = popup.pnlPopup;

                popup.ShowDialog();
            }
            return null;
        }

신고
Posted by ParkPill 박필

 혹여서 초초초초초초보 C# 코더께서 혹여나 Bitmap 에다 코드로 그린 그림을 돌리고 돌리고 돌리고 싶을 경우!

뭐, 검색하면 여기저기 널리고 널렸지만 아래와 같이 딱 하나의 함수면 됩니다.

C++에서와 같이 Graphics 에다가 Matrix를 적용시키면 되는데, Matrix 돌리는 방법이 C#에서는 더럽게 쉽지요.

(new Matrix).Rotatet(각도, 회전점);

요렇게 해주시고,

(Graphics).Transform = 여기 에다가 넣어주시면 됩니다 ㅋㅋ

_mat = new Matrix();
_mat.RotateAt(_angleForEntire, new PointF(0, 0));
_mat.RotateAt(_angleForPart, new PointF(pnlCanvas.Width / 2, pnlCanvas.Height / 2));
Graphics g = pnlCanvas.CreateGraphics();
g.Transform = _mat;
g.Clear(pnlCanvas.BackColor);
g.DrawImage(_bmp, new Point(pnlCanvas.Width / 2 - _bmp.Width / 2, pnlCanvas.Height / 2 - _bmp.Height / 2));

이 방법 말고도 sin, cos 이것저것 계산해서 적용시켜도 되지만 귀찮고 또 귀찮으니 그냥 이걸로 합니다 ㅋㅋ

그리고 제가 일하면서 꾀나 여러번 돌리고 돌리고 돌려서 그리는 것을 50ms 단위로 반복하는 짓거리를 해보았지만

그다지 많은 CPU를 잡아먹지 않는 것으로 나타났습니다.

뭐, 쓸만하단 얘기지요 ㅋㅋ

그럼 수고하시고, 혹여.. 혹!여 위의 코드가 잘 이해가 안가시는 분들은;;;

다운받아가셔요 ㅋㅋ 뭔가 열심히 돌아갑니다 ㅋㅋ

신고
Posted by ParkPill 박필