Bezier Curve 베지어 곡선 구현
베지어 곡선
typedef struct { float x, y; } point;
CurvePoint.x = ControlPoints[0].x * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ ControlPoints[1].x * 3.0 * t * (1.0 - t) * (1.0 - t)
+ ControlPoints[2].x * 3.0 * t * t * (1.0 -t )
+ ControlPoints[3].x * t * t * t;
CurvePoint.y = ControlPoints[0].y * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ ControlPoints[1].y * 3.0 * t * (1.0 - t) * (1.0 - t)
+ ControlPoints[2].y * 3.0 * t * t * (1.0 - t)
+ ControlPoints[3].y * t * t * t;
point 구조체 배열을 제어점 ControlPoints로 부터 얻어낸 곡선의 점들로 채우는 함수가 필요하며, 이함수의 호출에는 충분한 메모리가 할당되어야한다.
메모리가 부족하면 정상적으로 출력이 되지 않는다.
ex)ControlPoints = (point *)malloc(sizeof(point)*n);
n은 점의 개수로 생각하면된다. 500정도면 어느정도 봐줄만한 곡선이 그려진다.
ControlPoints[0]은 시작점 (P0), ControlPoints[1]은 첫번째 제어점 (P1)
ControlPoints[2]는 두번째 제어점 (P2), ControlPoints[3]은 끝점 (P3)
t는 매개변수로, 0 ≤ t ≤ 1 사이값을 갖는다. 0 ≤ i < n, delta = 1.0/n, t = i * delta
곡선의 모양은 제어점을 변경하여 조절할수 있으며, 베지어 곡선은 어떠한 경우에든지
항상 블록다각형(Convex Hull)내에 위치하게 된다. 시작점(P0),과 끝점(P3)에서의 기울기는
각각 직선P0P1과 직선P2P3의 기울기와 같다.
typedef struct { float x, y; } point;
CurvePoint.x = ControlPoints[0].x * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ ControlPoints[1].x * 3.0 * t * (1.0 - t) * (1.0 - t)
+ ControlPoints[2].x * 3.0 * t * t * (1.0 -t )
+ ControlPoints[3].x * t * t * t;
CurvePoint.y = ControlPoints[0].y * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ ControlPoints[1].y * 3.0 * t * (1.0 - t) * (1.0 - t)
+ ControlPoints[2].y * 3.0 * t * t * (1.0 - t)
+ ControlPoints[3].y * t * t * t;
point 구조체 배열을 제어점 ControlPoints로 부터 얻어낸 곡선의 점들로 채우는 함수가 필요하며, 이함수의 호출에는 충분한 메모리가 할당되어야한다.
메모리가 부족하면 정상적으로 출력이 되지 않는다.
ex)ControlPoints = (point *)malloc(sizeof(point)*n);
n은 점의 개수로 생각하면된다. 500정도면 어느정도 봐줄만한 곡선이 그려진다.
ControlPoints[0]은 시작점 (P0), ControlPoints[1]은 첫번째 제어점 (P1)
ControlPoints[2]는 두번째 제어점 (P2), ControlPoints[3]은 끝점 (P3)
t는 매개변수로, 0 ≤ t ≤ 1 사이값을 갖는다. 0 ≤ i < n, delta = 1.0/n, t = i * delta
곡선의 모양은 제어점을 변경하여 조절할수 있으며, 베지어 곡선은 어떠한 경우에든지
항상 블록다각형(Convex Hull)내에 위치하게 된다. 시작점(P0),과 끝점(P3)에서의 기울기는
각각 직선P0P1과 직선P2P3의 기울기와 같다.
Comments
Post a Comment
좋은하루되세요. ^^