통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이 
· LiveSeminar  · LiveConference
데브피아 C# 포럼 마을에 오신 것을 환영합니다.
  마을등급 C#   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 남정현 주민 12271 since 2006-12-28
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
[마을 게시판]
구인/구직 게시판
건의 / 운영 제안
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리
 일정관리

 질문&답변
 베이지 곡선 그리는 알고리즘??  | WinForm Program 2005-11-04 오전 10:27:13
이승환 (leeakura)  이승환님께 메시지 보내기이승환님을 내 주소록에 추가합니다.이승환님의 개인게시판 가기 번호: 55108  / 읽음:795

 베이지 곡선을 그리는 알고리즘을 알고 싶습니다.

 

어떤 식으로 해야 그려야 할지 참 막막 합니다 ㅜ.ㅜ

 

그림그리는 프로그램을 만드는데 다른건 다 했는데 거기서 막혀 있습니다.

 

ㅜ.ㅜ 따로 그려주는 클래스라던지.. 제공해 주는 함수가 있는지 조차도 모릅니다.

 

어떻게 그려야 할지 도움을 부탁드립니다.

 

오늘도 좋은 하루 되십시요~

이 글에 답변 등록하기
 [답변]using System.Drawing.Graphics; 2005-11-04 오전 10:43:37
신동호 (aronze)  신동호님께 메시지 보내기신동호님을 내 주소록에 추가합니다.신동호님의 개인게시판 가기 번호: 55112  

  System.Drawing.Graphics 에 있는 DrawBezier, DrawBeziers 를 이용하세요.

(System.Drawing 참조추가 하셔야 합니다.)

 

다음은 MSDN 예제입니다.

 

public void DrawBezierFloat(PaintEventArgs e)

{

// Create pen.

Pen blackPen = new Pen(Color.Black, 3);

// Create coordinates of points for curve.

float startX = 100.0F;

float startY = 100.0F;

float controlX1 = 200.0F;

float controlY1 =  10.0F;

float controlX2 = 350.0F;

float controlY2 =  50.0F;

float endX = 500.0F;

float endY = 100.0F;

// Draw arc to screen.

e.Graphics.DrawBezier(blackPen, startX, startY,

controlX1, controlY1,

controlX2, controlY2,

endX, endY);

}

=============================================================================

 

다음은 제가 사용했던 소스의 일부입니다. 참고가 될까하여..

 

System.Drawing.Image     img = null;

System.Drawing.Graphics dc   = null;

 

try

{

    if (!System.IO.File.Exists(src)) throw new Exception(src + " 파일을 찾을 수 없습니다.");

                

    img = System.Drawing.Image.FromFile(src);

    dc  = Graphics.FromImage(img);

    dc.DrawBeziers(new Pen(color, brushSize), points);   

}

catch (Exception ex)

{

    ...

}

 

 

 

 

허접소스라 민망하네요..

ㅡ_ㅡ;; 아 마따. 주의 사항으로 베이지어 곡선을 만들때 들어가는 point 의 개수는 3n+1 개 이어야만 합니다.

 

강제 사항이에요. 워낙 그런 알고리즘이랍니다. - _-;;(MSDN 참조) 여담이지만 3n+1 개 포인트가 안될 경우

그냥 마지막 포인트 복사해서 몇개 추가해주면 돌아갑니다.;;

 

물론 아~주 안좋은 방법입니다.

 

 

 

이 글에 답변 등록하기
 [답변]Graphic 클래스에 있군요. 2005-11-04 오전 10:48:24
김정록 (neorock)  김정록님께 메시지 보내기김정록님을 내 주소록에 추가합니다.김정록님의 개인게시판 가기 번호: 55113  

베이지어 곡선 알고리즘은 그래픽처리에서 많이 쓰는 것이라 함수로 되어 있군요.

 

예전에는 알고리즘데로 구현도 해 봤었는데 함수가 있으니 굳이 그럴 필요는 없겠군요.

 

 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDrawingGraphicsClassDrawBezierTopic.asp

 

 

DrawCurve의 cardinal spline 도 참고하시면 될 듯 하네요..

 

이 글에 답변 등록하기
 [답변]Bezier 곡선을 그리는 알고리즘. 2005-11-04 오후 3:58:20
방경운 (kwbang81)  방경운님께 메시지 보내기방경운님을 내 주소록에 추가합니다.방경운님의 개인게시판 가기 번호: 55123  

 Bezier 곡선을 그리는 알고리즘으로 가장 일반적인 방법은 linear interpolation 을 곡선의 차수 만큼

수행하여 곡선상의 점을 구하는 방법입니다.(de casteljau algorithm 이라고 합니다.)

 

위 답변들을 보니... Graphics에서 제공하는 Bezier곡선은 3차 Beizer 곡선인 것 같군요.

간단히 말씀드리면 조정점(Control Point) 4개를 가지고는 3차 Bezier 곡선을 만들 수 있습니다.

 

자세히 설명 드리면...

조정점 4개 (a,b,c,d)를 이용하여 3차 Bezier곡선을 구하면 (  Using de casteljau algorithm )

 

step 1)

점 a, 점 b를 u : (1-u) 내분(linear interpolation)하는 새로운 점 e 를 구하고

점 b, 점 c를 u : (1-u) 내분(linear interpolation)하는 새로운 점 f 를 구하고

점 c, 점 d를 u : (1-u) 내분(linear interpolation)하는 새로운 점 g 를 구하고

 

주어진 4개의 조정점에 대해서 각각 linear interpolation 한번씩 수행 것 이죠.

 

step 2)

구해진 점 e, 점 f 를 u : (1-u) 내분(linear interpolation)하는 새로운 점 h 를 구하고

구해진 점 f, 점 g 를 u : (1-u) 내분(linear interpolation)하는 새로운 점 i 를 구하고

 

step 1)에서 구해진 3개의 점에 대해서 각각 linear interpolation 한번씩 수행 것 이죠.

 

step 3)

step 2)에서 구해진 점 h, 점 i 를  u : (1-u) 내분(linear interpolation)하는 새로운 점 j 를 구하면

그 점이 바로 조정점 a,b,c,d 로 이루어진 3차 Bezier 곡선 상의 점이 됩니다.(de casteljau algorithm)

 

따라서 우리는 u를 0 부터 1까지 증가시켜가면  조정점 a,b,c,d에 대해 linear interpolation을 3번하면

3차 Bezier 곡선을 가시화 할 수 있습니다. ( 첫번째 방법) 직접 연습장에 그려 보시면 이해가 빠르실 것 입니다.

u가 0 일때를 계산해보면 점 a를 구할 수 있고, u가 1일때를 계산해 보면 점 d를 구할 수 있습니다.

 

 

또 다른 방법은 위 step 을 정리해보면 즉, 점 j 는 조정점 a,b,c,d와 u에 관한 3차식으로 이루어진 다는 것을 알 수 있습니다.

r(u) = (1-u)^3 *점a+3(1-u)^2u *점b+3(1-u)u^2 *점c + u^3 *점d 가 나옵니다. 이 r(u)에 u를 0 부터 1까지 대입하면

3차 Bezier 곡선 상의 점이 나오게 됩니다. (두번째 방법)

 

 

두 방법 중 Beizer 곡선을 가시화 할때 많이 쓰이는 방법은 첫번째 방법(de casteljau algorithm)입니다.

 

 

위 답변들 중 조정점의 개수가 3n+1 개(n은 곡선의 개수)이여하 하는 이유도 첫번째 방법으로 알 수 있습니다. 조정점 4개가 하나의

3차 Bezier 곡선을 만들기 때문이죠.

 

 

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2010-서울강남-00026호
서울시 강남구 논현동 87-2 미래빌딩 5층 / TEL. 02_6719_6200 / FAX. 02-6499-1910 / 대표: 홍영준
Copyright ⓒ (주) 데브피아. All rights reserved.