[GDI+] Matrix 객체 사용해보기...
나에게 행렬이란? 계산방법이나 결과값을 구하는건 알겠는데... 그래픽에 막상 적용해놓고도 이게 뭔가... 싶은것?
역시 수학 기초가 딸리면 멍때리는건 시간문제얌 ㅡ.,ㅡ;;;
얼마전 훈스에 올라온 행렬 구하는 객체가 있는가에 대해 검색좀 해보니 Matrix란게 있었는데...
또 마침 별그리는것... 선 이동시하는것등... 갑자기 또 관심종목이 ㅡ.,ㅡ;;;
오늘 저녁엔 Matrix를 가지고 놀아보자 해서 별그리는데 써보기로 했다.
그럼 이 Matrix는 뭐하는 놈인고 하니 MSDN 에 보니 이 놈이 좌표변환 하는데 쓰이는 놈이었다.
3D 구현때보다는 머 나름 편했다. 3D는 아직도 이해 불가..( 절두체 ㅡ.,ㅡ;; )
2D로 별을 그린다고 했을때
private void DrawStar(Graphics g, double r, PointF p)
{
PointF[] ps = new PointF[6];
double RadianTheta = 0d;
int cnt = 0;
for (double i = 0; i <= 720d; i += 144d)
{
RadianTheta = (angle + i) * Math.PI / 180d;
ps[cnt] = new PointF(p.X + (float)(r * 1d * Math.Cos(RadianTheta)),
p.Y + (float)(r * 1d * Math.Sin(RadianTheta)));
cnt++;
}
g.DrawLines(Pens.Red, ps);
g.DrawEllipse(Pens.Blue, p.X - 5, p.Y - 5, 10, 10);
}
말할것도 없이 이거답... angle은 회전각인데.. 별을 빙글~빙글~ 돌려봤다..
이게 오히려 나에겐 이해하기 쉽다...
private void DrawStar(PaintEventArgs e)
{
PointF[] starPointFs = new PointF[6];
int cnt = 0;
double theta = 0f;
for (double i = 0; i <= 720d; i += 144d)
{
theta =( i - 5f) * Math.PI / 180d;
starPointFs[cnt] = new PointF((float)Math.Cos(theta), (float)Math.Sin(theta));
cnt++;
}
e.Graphics.DrawLines(Pens.Red, starPointFs);
//Matrix를 이용한 좌표변환 그리기...
Matrix mx = new Matrix(1f, 0f, 0f, 1f, this.Width/2, this.Height/2);
mx.Scale(100f, 100f);
mx.Rotate((float)angle);
mx.TransformPoints(starPointFs);
e.Graphics.DrawLines(Pens.Black, starPointFs);
}
Matrix의 기본 파라미터값( Sx , Rx, Ry, Sy, Dx, Dy ) 임.
Rx, 나 Ry를 값을 주면 왜곡되는데... 왜그런지 모르겠넹... 쩝.
매트릭스로 구현한 소스이다.
기초 메트릭스를 생성하고 여기에 크기변환, 회전값을 주고
별의 각 점좌표를 주고 변환 한다!
그리고 그려주면 별이 그려진다.
소스상에 i - 5f 는 두개의 별을 동시에 그리면 위상이 같아서 겹치므로 위상차를 주었다.
간단하게나마 매트릭스를 그려보았다.
음 어따 써먹쥐????????????????????????????? 이걸 왜했을까?
# 실제 이미지는 타이머로 빙글 빙글 돌리고 있다....
'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글
글꼴 폰트 관련 MSDN 링크 (0) | 2010.08.10 |
---|---|
소수 구하기 소스... (0) | 2010.08.06 |
IFormattable (0) | 2010.07.15 |
트리노드 검색해서 확장하기... (0) | 2010.03.17 |
목록 로테이션??? (0) | 2010.03.16 |