[C#] GDI Point 위치


Development note/C#  2012. 10. 1. 15:23

안녕하세요. 명월입니다.

이번 포스팅에서는 GDI 좌표계에 대해 알아 보겠습니다. 물론 좌표계에 대해서는 C# 뿐만 아니라 윈도우 프로그래밍을 사용하는것은 같은 좌표계를 사용합니다.

 

수학에서는 음수가 없는 좌표 기준(0,0)을 왼쪽 하단으로 계산을 합니다. 그러나 윈도우 에서는 왼쪽 상단이 기준으로 움직입니다. 문론 이 위치는 윈도우 전체에 해당이 됩니다. 즉 모니터 기준으로 가장 왼쪽,상단 픽셀이 (0,0)이 되겠습니다. 역시 설명 보다는 예제가 이해하기 빠르겠습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Blog20121001_0_
{
  class Program : Form
  {
    static void Main(string[] args)
    {
      Application.Run(new Program());
    }
    public Program()
    {
      this.Load += new EventHandler(Program_Load);
    }
    void Program_Load(object sender, EventArgs e)
    {
      this.Location = new Point(0, 0);
    }
  }
}

결과 화면 보면 윈도우 창이 모니터의 왼쪽 상단에서 생성이 됩니다.

두번째 예제 입니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Blog20121001
{
  class FormClass :Form
  {
    static void Main(string[] args)
    {
      Application.Run(new FormClass());
    }
    private float x;
    private float y;
    private float x_;
    private float y_;
    private Timer tm;
    private Graphics g;
    private float angle;

    private float width = 200;
    public FormClass()
    {
      this.Size = new Size(500, 500);
      g = this.CreateGraphics();

      this.x = ClientRectangle.Width / 2;
      this.y = ClientRectangle.Height / 2;

      tm = new Timer();
      tm.Interval = 1;
      tm.Enabled = true;
      tm.Tick += new EventHandler(tm_Tick);
    }
    void tm_Tick(object sender, EventArgs e)
    {
      angle++;
      float radian = (float)(Math.PI / 180) * angle;
      this.x_ = x + (width * (float)Math.Sin(radian));
      this.y_ = y - (width * (float)Math.Cos(radian));

      g.DrawLine(new Pen(Color.Black), x, y, x_, y_);
    }
  }
}

DrawLine 의 (0,0)에서 윈도우 크기 너비,높이 길이의 위치 까지 Line을 그리는 것입니다.

 

위 화면을 보면 x좌표는 수학의 수직선과 비슷하게 왼쪽에서 오른쪽으로 증감형태인데 y축은 아래에서 위로 증가되는 형태가 아닌 위에서 아래로 증가되는 형태입니다.다음은 삼각함수를 이용한 예제입니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Blog20121001
{
  class FormClass :Form
  {
    static void Main(string[] args)
    {
      Application.Run(new FormClass());
    }
    private float x;
    private float y;
    private float x_;
    private float y_;
    private Timer tm;
    private Graphics g;
    private float angle;
    private float width = 200;
    public FormClass()
    {
      this.Size = new Size(500, 500);
      g = this.CreateGraphics();

      this.x = ClientRectangle.Width / 2;
      this.y = ClientRectangle.Height / 2;

      tm = new Timer();
      tm.Interval = 1;
      tm.Enabled = true;
      tm.Tick += new EventHandler(tm_Tick);
    }
    void tm_Tick(object sender, EventArgs e)
    {
      angle++;
      float radian = (float)(Math.PI / 180) * angle;
      this.x_ = x + (width * (float)Math.Sin(radian));
      this.y_ = y - (width * (float)Math.Cos(radian));

      g.DrawLine(new Pen(Color.Black), x, y, x_, y_);
    }
  }
}

위 식은 직접 윈도우 프로그램 하나 만들고 돌려보면 금방 알 수 있는 부분이긴 합니다만, 항상 윈도우 컨트롤 만들 때마다 헤갈리는 부분이기도 합니다. 참고사항으로 포스팅했습니다.

첨부파일 :Blog20121001.zip