2013-04-23 90 views
0

所以我現在在XZ平面上有一個立方貝塞爾貼片(y = 0,所以它是一個平面貼片)。該補丁由16個控制點和400個總網格點組成。我現在想要實現的是選擇中間4個控制點中的任何一個(它們中的任何一個),並且在任何座標方向上遞增。Cubic Bezier Curve Interaction

我覺得我有問題的部分實際上是用OpenGL繪圖函數顯示更改。下面是創建補丁的代碼和我當前的繪圖函數以及我目前使用的增量函數的示例。網格是所有網格點的二維數組。 控制是16個控制點的二維數組。 control_point由用戶選擇的菜單功能(選項1-4)更改並初始化爲1.

編輯:修正switch語句中的最後2個控制點。

void bezier_plane() 
{ 
    CalcBezier(); 
    for (int i = 0; i < 19; i++) { 
     for (int j = 0; j < 19; j++) { 
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
      glBegin(GL_TRIANGLE_STRIP); 
       glVertex3f(grid[i][j].x, grid[i][j].y, grid[i][j].z); 
       glVertex3f(grid[i][j+1].x, grid[i][j+1].y, grid[i][j+1].z); 
       glVertex3f(grid[i+1][j].x, grid[i+1][j].y, grid[i+1][j].z); 
       glVertex3f(grid[i+1][j+1].x, grid[i+1][j+1].y, grid[i+1][j+1].z); 
      glEnd(); 
     } 
    } 
} 

void CalcBezier() 
{ 
    float u; 
    float v; 
    u = 0; 
    for (int i = 0; i < 20; i++) { 
     v = 0; 
     for (int j = 0; j < 20; j++) { 
      for (int x = 0; x < 4; x++) { 
       for (int y = 0; y < 4; y++) { 
        grid[i][j].x += control[x][y].x * Bezier3(x, u) * Bezier3(y, v); 
        grid[i][j].y += control[x][y].y * Bezier3(x, u) * Bezier3(y, v); 
        grid[i][j].z += control[x][y].z * Bezier3(x, u) * Bezier3(y, v); 
       } 
      } 
      v+=.05; 
     } 
     u+=.05; 
    } 
} 

/*Is called when a menu button is hit, indicating that the control point is incremented in the y direction*/ 
void OnYInc() 
{ 
    switch(control_point) { 
    case 1: 
     control[1][1].y += 2; 
     break; 
    case 2: 
     control[1][2].y += 2; 
     break; 
    case 3: 
     control[2][3].y += 2; 
     break; 
    case 4: 
     control[2][4].y += 2; 
     break; 
    } 
    InvalidateRect(NULL, FALSE); 
} 

我的onDraw函數也簡單地調用了bezier_plane()。現在,用上面的代碼,當我嘗試按y增加時。網格中的三角形變得更大,但它似乎並沒有正確繪製。這有點難以描述。

結果看起來像這樣。第一張截圖是在我點擊增量之前。第二屏幕截圖和第三屏幕截圖是一次點擊後再點擊10次後的樣子。我也不太確定爲什麼當我在y方向上增加時,修補程序的範圍實際上正在改變(隨着y的增加,它似乎變得更大)。

before increment

after 1 click

after 10 clicks

+0

如果難以描述,請拍幾張截圖。 – RandyGaul 2013-04-23 19:48:54

+1

添加屏幕截圖 – Kinru 2013-04-23 20:35:59

+2

在每次調用'CalcBezier()'之前,您是否將'grid'的元素設置爲零? – radical7 2013-04-23 21:06:24

回答

2

radical7已經解決了它。因爲在調用CalcBezier之前不要將網格設置爲零,所以每次調用CalcBezier時,所有網格值都會遞增。改變OnYInc離開控制點,只是InvalidateRect,你會看到相同的行爲

+0

Doh!不敢相信我沒有想到這一點。這似乎已經成功了。謝謝你和radical7 – Kinru 2013-04-23 23:20:32