2014년 12월 27일 토요일

Visual C# (2) Random number를 이용하여 원을 그리고 picture Box에 image 띄우기

 안녕하세요? 이번 포스팅에서는 지난 포스팅에서 좀 더 발전 시켜 Random number를 이용하여 원을 그리고 그려진 원을 picture box에 올리는 프로그램 입니다.

 우선 작성한 전체 소스는 다음과 같습니다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Circle_Draw_in_picturebox
{
    public partial class Form1 : Form
    {

        public Graphics g; //그림을 그리기 위한 도구인 Graphics 객체 생성
        public double pPi = Math.PI;    // Pi 값을 pPi에 할당.

        Bitmap canvas = new Bitmap(300,300); // 그림이 그려질 객체 생성. 여기서는 300 x 300 pixel로 생성
        Random rnd = new Random(); // Random number를 사용하기 위한 구문. 
        // method 내부가 아닌 class field 영역에서 선언했다는 점을 주목.
        // 이는 Random number의 확률 분포가 더 넓게 퍼지게 하기 위해 중요한 사항.
        // 더 자세한 사항은 다른 사이트 참조.

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            g = Graphics.FromImage(canvas);  //Graphics 객체에 그림이 그려질 canvas 할당
            g.FillRectangle(Brushes.Black, 0, 0, canvas.Width, canvas.Height); //canvas 배경을 Black으로 설정.

            //원을 그리기 위한 변수 설정
            double x0, y0;  //Center of the Circle
            double x1, y1;  //A point that Circle will be drawn.
            double R;       //Radius of circle
            double rad;     //Radian for drawing circle.
            double drad;    //Infinitesimal of radian 
            drad = pPi / 180 * 0.001;

            //원의 중심좌표와 반지름의 값을 Random number로 생성
            x0 = rnd.Next(10, 300); //10과 300 사이의 Random number 생성
            y0 = rnd.Next(10, 300);
            R = rnd.Next(10, 125); //10과 125 사이의 Random number 생성

            for (rad = 0; rad <= 2 * pPi; rad = rad + drad)
            {
                x1 = Math.Round(x0 + R * Math.Cos(rad), 0);
                y1 = Math.Round(y0 + R * Math.Sin(rad), 0);
                g.DrawLine(Pens.LightGoldenrodYellow, new Point((int)x0, (int)y0), new Point((int)x1, (int)y1));
            }

            // Drawn pictures are throw to the pictureBox1
            pictureBox1.Image = canvas;

            //x0, y0, R values are displayed in textBox1.
            textBox1.Text  = "x0 = " + Convert.ToString(x0);
            textBox1.Text += System.Environment.NewLine + "y0 = " + Convert.ToString(y0);
            textBox1.Text += System.Environment.NewLine + "R  = " + Convert.ToString(R);
            
        }
    }
}



결과는 다음과 같습니다.

보시는 것 처럼 Random number를 이용하여 원을 그리고 발생한 그 값 역시 textbox에 출력이 되도록 하였습니다.

그럼 이제 하나씩 자세히 뜯어 보도록 하겠습니다. 각각의 중요한 사항들은 주석에 적어 놓긴 했지만 다시한번 점검!!!


(1) 생성한 그림을 pictureBox에 띄우기.

아직 Image, Bitmap, Graphics 등등 각각의 라이브러리에 대해 개념 정립이 잘 되진 않았지만 주워들은 바에 의하면


  • Bitmap ==> 실제 픽셀을 가진 실체화된 객체를 생성하게 해주는 라이브러리.
  • Image ==> 추상적인 개념의 라이브러리로 Bitmap과 Graphics를 연결해주는 역할? 더 공부가 필요.
  • Graphics ==> 이미지 객체에 그림을 그려주는 도구로써의 역할을 하는 라이브러리.
  • 그래서 결국 그 절차는 다음과 같습니다.


   public Graphics g; //그림을 그리기 위한 도구인 Graphics 객체 생성

   Bitmap canvas = new Bitmap(Width,Height); // 그림이 그려질 객체 생성. 본 소스에서는 300 x 300 pixel로 생성

...

     g = Graphics.FromImage(canvas); //Graphics 객체에 그림이 그려질 canvas 객체 할당.
     g.FillRectangle(Brushes.Black, 0, 0, canvas.Width, canvas.Height); //
...
     g.DrawLine(Pens.LightGoldenrodYellow, new Point((int)x0, (int)y0), new Point((int)x1, (int)y1));
...
      pictureBox1.Image = canvas; //그려진 그림이(canvas) pictureBox에 출력될 수 있도록 할당.



Bitmap과 Graphics 객체를 각자 생성해주고, Bitmap 객체에 Graphics를 이용하여 원하는 그림을 그려넣어준 후, pictureBox에 Bitmap 객체(여기서는 canvas)를 할당해 줌.



(2) Random number creator (난수 생성)

 난수 생성 방법은 다음과 같습니다.
using System;
Random rnd = new Random(); // Random number를 사용하기 위한 구문
...
       //난수를 생성하여 변수에 대입.
       x0 = rnd.Next(10, 300);
       y0 = rnd.Next(10, 300);
       R = rnd.Next(10, 125);

Random 객체이름 = new Random(); 이와 같은 방법으로 선언 후
변수 = 객체이름.Next(범위); 의 방법으로 난수 생성 후 대입.

난수 생성에 대한 내용도 깊이 파자면 한도 끝도 없는 것 같지만... OTL

for loop 구문 등 반복적으로 난수를 사용해야 하는 경우에는 class field 단위에서 선언 후 method 안에서 개별적으로 사용해 주는 것이 좋다고 합니다.

자세한 내용은 아래 사이트 참조
http://topnanis.tistory.com/226



(3) textBox 사용하기

using System;
    //x0, y0, R values are displayed in textBox1.
     textBox1.Text  = "x0 = " + Convert.ToString(x0);
     textBox1.Text += System.Environment.NewLine + "y0 = " + Convert.ToString(y0);
     textBox1.Text += System.Environment.NewLine + "R  = " + Convert.ToString(R);



  • textBox1.Text = 문자열; 의 형태로 사용 가능합니다.
  • 내가 단순히 표시하고자 하는 문자는 따옴표" "를 사용하여 입력 
  • textBox1.Text += 문자열; 로 사용하는 이유는 +를 사용하지 않으면 기존의 내용이 삭제 되고 계속 refresh 됨. +를 해줌으로써 그 다음에 연결해서 출력됨.
  • System.Environment.NewLine을 넣어 주는 것은 [enter]를 쳐주는 것과 같은 기능. "\r\n"의 방법으로도 같은 효과를 발생시킴.
  • 여기서 중요!! 만약 프로그램 내부에서 사용한 변수를 출력하고 싶으면??  ==> Convert.ToString(변수)의 방법으로 출력을 해주어야 합니다. 왜냐하면 모니터 상에서 글자를 출력하기 위해서는 프로그램 내부에서 사용하던 숫자들을 (이들 숫자들은 0과1로 조합된 그야말로 순수한 숫자) 사람이 인식 가능한 [문자열]로 출력해 주기 위해서는 데이터형의 전환이 필요한데 이 기능을 해주는 것이 ToString 입니다.
  • 이외에도 문자열을 숫자로 바꿔주는 기능들도 있으니 더 찾아 보면 좋을 것 같네요. 

댓글 없음:

댓글 쓰기