'프로그래밍'에 해당되는 글 19건

  1. 2013.04.01 베지어 곡선(bezier curve)
프로그래밍/수학2013. 4. 1. 15:28

 

 

컴퓨터 그래픽에서 임의의 형태의 곡선을 표현하기 위해 수학적으로 만든 곡선. 최초의 제어점(control point)인 시작점과 최후의 제어점인 끝점 그리고 그 사이에 위치하는 내부 제어점의 이동에 의해 다양한 자유 곡선을 얻는 방법이다. 이 때 곡선은 제어점 위를 통과하는 것은 아니다. 시작점에서 시작한 곡선은 인접한 제어점 방향으로 진행하는데, 그 옆에 있는 제어점의 영향을 받아 첫 제어점 위를 지나가지 않고, 그 다음의 제어점 방향에 영향을 받아 곡선이 작성된다. 이는 각 제어점의 좌표를 매개로 하는 매개 함수식을 통해 만들어지는 것이다.

프랑스의 수학자 베지어(Bezier P.)가 만들었고, 다항식 곡선의 하나로 아우트라인 글자, 곡선 도형, 포스트스크립트 등 글자 데이터와 도형을 그릴 때의 자유 곡선으로 이 베지어 곡선이 사용되고 있다. 시작점과 끝점을 포함한 제어점의 개수가 많을 수록 복잡한 곡선을 만들 수 있는데, 계산에 시간이 걸리므로 제어점이 너무 많은 것은 사용할 수 없다. 포스트스크립트는 제어점이 4개인 3차 베지어 곡선이 사용되며, 트루타이프는 2차 베지어 곡선이 사용되고 있다. 3차 베지어 곡선의 경우 곡선 구간은 두 개의 양 끝점 P0, P3과 두 개의 중간 제어점 P1, P2로 그림의 예와 같이 그 모양이 결정되며, 이 좌표들로부터 정의되는 3차 베지어 수학 공식은 다음과 같다.

 < 출처 : http://terms.naver.com/entry.nhn?cid=418&docId=784451&mobile&categoryId=418  >

 

c++ 로 구현한 베지어 함수

inline void Bezier_Evaluate
(
 LTVector& out,
 const LTVector& p1,
 const LTVector& p2,
 const LTVector& p3,
 const LTVector& p4,
 float t
)
{
 float oneMinusT[3];
 float tSquared;

 oneMinusT[0] = 1.0f - t;
 oneMinusT[1] = oneMinusT[0] * oneMinusT[0];
 oneMinusT[2] = oneMinusT[1] * oneMinusT[0];

 tSquared = t * t;

 out = p1 * oneMinusT[2] +
  p2 * (3.0f * t * oneMinusT[1]) +
  p3 * (3.0f * tSquared * oneMinusT[0]) +
  p4 * (tSquared * t);
}

inline void Bezier_Evaluate_CP3
(
 LTVector& out,
 const LTVector& p1,
 const LTVector& p2,
 const LTVector& p3,
 float t
)
{
 float oneMinusT[2];
 float tSquared;

 oneMinusT[0] = 1.0f - t;
 oneMinusT[1] = oneMinusT[0] * oneMinusT[0];

 tSquared = t * t;

 out = p1 * oneMinusT[1] +
  p2 * (2.0f * t * oneMinusT[0]) +
  p3 * tSquared;
}

inline void Bezier_Evaluate_CP2
(
 LTVector& out,
 const LTVector& p1,
 const LTVector& p2,
 float t
)
{
 float oneMinusT;

 oneMinusT = 1.0f - t;

 out = p1 * oneMinusT +
  p2 * t;
}



Posted by GaePein