2017-02-23 4 views
0

De Casteljau의 알고리즘을 사용하는 것이 베 지어 곡선을 그릴 수있는 최선의 방법이 아니라는 것을 알고 있지만 할당을 위해 구현해야합니다. 다음 방정식 (Drexel의)을 기반으로 알고리즘을 정의하고 있습니다.반복을 위해 중첩 된 for 루프를 사용하는 경우 De Casteljau 알고리즘의 특정 제어점을 어떻게 지정합니까?

컨트롤 포인트를 정의

.

알고리즘을 수행하는 함수를 정의하려고하지만 컨트롤 포인트를 통합 할 위치/방법을 고민하고 있습니다. 제어점은 사용자가 정의합니다. 프로그램과 상호 작용할 때 왼쪽 클릭으로 새로운 제어점이 추가됩니다. 다음과 같이 내 기능은 현재 같습니다

2Dpoint는 헤더 파일에 의해 정의 된 단지 구조
2Dpoint deCast(float t) 
{ 
    2Dpoint tempDC // Temporary value of point passed back to OpenGL draw function 
    tempDC.x = 0; tempDC.y = 0 // Initialize temporary value 

    int r,i; 
    int n = C->B.size(); // C is pointer to B vector, which is where the control points are stored in a 2D vector 

    for (r = 1; r<n, r++) 
    { 
     for (i = 0; i<n-r; i++) 
     { 
     // Calculation of deCast points goes here 
     } 
    } 
} 

C2Dpoint 구조체 B 전화에 저장되어있는 제어점의 위치에 대한 포인터 (즉, i 제어점 벡터의 값은 C -> B[i].xC -> B[i].y에 의해 액세스됩니다. 아래 그림과 같이 t이 내 draw 함수에서 구현 될 때 함수에 제공됩니다. 그 모든 이유 드 당신도 당신의 수학 공식에 표시 Casteljau 알고리즘 작업 (때문에

void draw() 
{ 
    glColor3f(0.0f, 1.0f, 0.0f); 
    glLineWidth(2.0f); 
    glBegin(GL_LINE_STRIP); 
    float DCiter = 0; 
    while (DCiter <= 1.0) 
    { 
     2Dpoint DC = decast(DCiter); 
     glVertex2f(DC.x, DC.y); 
     DCiter = DCiter + 0.01; 
    } 
} 
+0

[this] (http://stackoverflow.com/q/42421988/560648) 당신의 동급생입니까? ;) –

+0

링크를 이용해 주셔서 감사합니다. – cl40

+0

1.'while' 루프 다음에'glEnd()'가 없습니다. 2. 왜 네 중첩 된'for's가 있습니까? 3. 제어점의 사본을 저장하려면 temp가 필요합니다 (변경 될 때). 그렇지 않으면 커브의 첫 번째 점을 계산 한 후 원래의 제어점이 손상됩니다. 그래서'B'의 로컬 복사본을 추가하고'for' 루프를 반복 할 때마다 결과가 하나만 남을 때까지 포인트 카운트를 하나씩 줄이십시오 ('tempDC'가 필요 없습니다) – Spektre

답변

0

당신은, 너무, 당신의 포인트를 함수 deCasteljau을 통과해야 할거야 : 그것은 "다음 지점을 읽고 = 이전 두 점의 가중 합 "). 이 점 사이의 선형 보간법을 할 필요가 있기 때문에, 당신은 의사 코드에서

) = 포인트와 함께 작동해야합니다

deCastestljau (t, points): 
    // the following code is destructive, so remember to be sensible 
    points = shallowCopy(points); 
    // de Casteljau's algorithm in four lines: 
    while points.length > 1: 
    for i=0 to points.length-2: 
     points[i] = (1-t) * points[i] + (t) * points[i+1] 
    points.pop() 
    // and we're done. 
    return points[0] 

끝을 : 당신이 당신의 컨트롤 포인트로 시작, 당신은 선형 보간 패스를 할 따라서 거리 비율이 t 인 모든 점을 "연속 좌표 사이"로 얻을 수 있습니다 (예 : t가 0.25 인 경우 특정 점에서 다음 점까지의 거리의 1/4에서 각 선형 보간을 찾습니다).

이 작업을 수행하면 이전보다 포인트 1이 줄어 듭니다. 그런 다음 다시 한 번, 다시 한 번, 그리고 다시 한번, 한 지점을 남길 때까지하십시오. 그것은 당신의 곡선 점입니다. 이것은 모든 베 지어 커브에서 유효합니다.

또한 Casteljau의 알고리즘은 곡선의 단일 점을 효율적으로 계산하는 방법이기 때문에 곡선을 그리는 것과는 아무런 관련이 없습니다. 전체 곡선. 이것은 완전히 다른 작업입니다. Casteljau의 알고리즘은 그리기 알고리즘을 작동시키는 데 필요한 곡선상의 점을 찾기위한 많은 옵션 중 하나입니다.