C# 에서 그래픽 작업을 통해 그래프를 직접 저수준으로 그리는 방법 - Whitmem
C# 에서 그래픽 작업을 통해 그래프를 직접 저수준으로 그리는 방법
C# Language
2023-03-06 11:11 게시 a4ad55a2373fa78b55c0

0
0
166
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
개요
이번 장에서는 이전 게시물에서 알아본 그래픽 작업 방법을 통하여 그래프를 그려보고자 합니다. 이 작업을 진행하기 위해서는 C#의 GDI 작업 또는 Graphics 객체를 선언해야 합니다. 자세한 것은 이전 게시물을 참조하세요.
정규화된 데이터 선언
먼저 그래프에 그릴 데이터를 선언해야 합니다. 파형 데이터 든 뭐든 X에 대응되는 Y 값이 존재할 것이고, 그에 대한 데이터는 배열에 담겨 있을 것 입니다. 여기에서는 double[] 배열에 담겨 있다고 가정하고 double[] 배열에 대해서 x 값을 y로 출력하는 방법에 대해서 알아 볼 것 입니다. 특히 이번 절에서는 화면상에 맞춰서 출력하기 위해 데이터를 정규화해야 하며, 그 범위는 0~1로 가정합니다.
난수 데이터
여기서는 난수 데이터를 선언하고 배열에 담습니다.

데이터를 임의로 생성하는 부분
double[] data; public Form1() { InitializeComponent(); Random random = new Random(); int dataSize = 500; data = new double[dataSize]; for(int i=0;i<dataSize; i++) { data[i] = random.NextDouble(); } }
난수 데이터를 생성하기 위해서 Random 클래스를 인스턴스화합니다. 데이터 크기는 500으로, double[] 배열에 할당하기 위하여 new 키워드를 사용합니다. 그런다음 for문을 통해서 data 배열에 순서대로 담습니다.
화면에 그리기
데이터를 화면에 그리기 위해서는 panel의 Paint 이벤트에 그래프 데이터를 순회하면서 그려줘야 합니다. 그러기 위해서 for문을 사용해 데이터 개수만큼 반복하며, 데이터의 x 값, y 값을 가져옵니다. 이때 주의할 점은 선을 순서대로 그리기 때문에 데이터는 x 값으로 정렬되어 있어야 합니다. 여기서는 double[]의 index를 x 값으로 가정 했기에 정렬할 필요는 없습니다.

데이터를 화면에 그리는 방법

특히, for문을 돌아가면서 이전 지점과 이후 지점을 이어주는 작업이 필요한데 각각 lastPoint 변수와 targetPoint변수로 가정합니다. lastPoint 변수는 이전에 마지막으로 그렸던 좌표를 저장하기 위한 임시 변수이고, targetPoint 변수는 지금 for문에 해당하는 index의 위치를 가지고 있는 좌표입니다. 따라서 targetPoint 변수에 현재 for문 index에 대한 (x, y) 좌표를 저장하고, 화면에 lastPoint와 targetPoint를 그린 후, lastPoint에 targetPoint을 저장함으로써 하나의 x 좌표를 그립니다.
배율 조절
특히 data[] 배열은 0~1로 정규화된 데이터이기 때문에, 화면상에 출력하면 0또는 1로만 출력됩니다. 그 이유는 스크린 좌표계인 Graphics 그래픽 작업은 픽셀 단위로 출력하기 때문에, 최소 stride가 1입니다. 따라서 한 칸 간격으로만 출력할 수 있습니다. 하지만 실제 출력하고자 하는 데이터 또한 0~1 사이의 값을 가지고 있기 때문에 화면상에 보일 수 있도록 어느정도 확대 해 주는 작업이 필요합니다. 그러기 위해서는 일정 값을 value에 곱함으로써 그래프 값 (진폭)을 늘릴 수 있습니다.

scale 배율 조절
여기서는 scale 배율을 기본 100으로 지정하고 있습니다. 이렇게 되는 경우 data 값이 1인 값은 y 100 픽셀에 출력, 0인 값은 y 0인 픽셀에 출력됩니다.

그래프 출력 결과
출력 대칭
위 결과 이미지는 완벽한 것 같지만 사실상 그렇지 않습니다. 우리가 그래프를 볼 때에는 위로 올라갈 수록 높은 수치의 데이터를 가집니다. 하지만 상기 그래프는 스크린 좌표계에서 출력된 것이기 때문에 아래로 갈수록 높은 y를 가집니다. 따라서 우리는 y 값을 대칭 해줄 필요가 있습니다.
여기서는 panel의 아래에서 부터 출력 해 주기 위해 panel의 높이를 가져오고, 그 높이에서 value 값을 빼주기로 합니다.

panel1.Height을 사용해 높이에서 빼기
Point targetPoint = new Point(i,panel1.Height - (int)(data*scale));
기본적으로 panel1 내에 존재하는 Height Getter은 panel 의 높이를 가져옵니다. 즉 그래픽이 그릴 수 있는 범위인 흰색 영역의 높이를 가져오며, 그 높이에서 부터 데이터를 뺌으로써 데이터가 제일 높은 값일 때 제일 낮은 좌표 영역에 출력할 수 있도록 합니다.

대칭하여 그린 모습
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.