c - 如何用C实现曲线的自适应 segmentation 算法

标签 c opengl glut bezier

我的作业是用openGL/Glut编写一个C程序,通过鼠标单击获得4个点的组(具有3个坐标的点)后,应该使用自适应算法绘制一条贝塞尔曲线。从理论上讲,算法的工作原理很清楚,但我不知道如何将其放入 C 代码中。我的意思是,在类(class)中我们看到 4 个控制点可以具有类似于“梯形”的形状,然后算法计算两个“高度”,然后检查它们是否满足公差。问题是用户可能会点击屏幕上的任何地方,而这些点可能不会有梯形形状……那么,我可以从哪里开始呢?这就是我的全部了

enter image description here

这是我写的cole,每次添加控制点时都会调用它:

if (bezierMode == CASTELJAU_ADAPTIVE) {
    glColor3f (0.0f, 0.8f, 0.4f); /* draw adaptive casteljau curve in green */
    for(i=0; i+3<numCV; i += 3)
        adaptiveDeCasteljau3(CV, i, 0.01);
}


void adaptiveDeCasteljau3(float CV[MAX_CV][3], int position, float tolerance)  {

  float x01 = (CV[position][0] + CV[position+1][0]) / 2;
  float y01 = (CV[position][1] + CV[position+1][1]) / 2;

  float x12 = (CV[position+1][0] + CV[position+2][0]) / 2;
  float y12 = (CV[position+1][1] + CV[position+2][1]) / 2;

  float x23 = (CV[position+2][0] + CV[position+3][0]) / 2;
  float y23 = (CV[position+2][1] + CV[position+3][1]) / 2;

  float x012 = (x01 + x12) / 2;
  float y012 = (y01 + y12) / 2;

  float x123 = (x12 + x23) / 2;
  float y123 = (y12 + y23) / 2;

  float x0123 = (x012 + x123) / 2;
  float y0123 = (y012 + y123) / 2;

  float dx = CV[3][0] - CV[0][0];
  float dy = CV[3][1] - CV[0][1];

  float d2 = fabs(((CV[1][0] - CV[3][0]) * dy - (CV[1][1] - CV[3][1]) * dx));
  float d3 = fabs(((CV[2][0] - CV[3][0]) * dy - (CV[2][1] - CV[3][1]) * dx));

  if((d2 + d3)*(d2 + d3) < tolerance * (dx*dx + dy*dy)) {

      glBegin(GL_LINE_STRIP);
          glVertex2f(x0123, y0123);
      glEnd();

      return;
  }

  float tmpLEFT[4][3];
  float tmpRIGHT[4][3];

  tmpLEFT[0][0] = CV[0][0];
  tmpLEFT[0][1] = CV[0][1];
  tmpLEFT[1][0] = x01;
  tmpLEFT[1][1] = y01;
  tmpLEFT[2][0] = x012;
  tmpLEFT[2][1] = y012;
  tmpLEFT[3][0] = x0123;
  tmpLEFT[3][1] = y0123;

  tmpRIGHT[0][0] = x0123;
  tmpRIGHT[0][1] = y0123;
  tmpRIGHT[1][0] = x123;
  tmpRIGHT[1][1] = y123;
  tmpRIGHT[2][0] = x23;
  tmpRIGHT[2][1] = y23;
  tmpRIGHT[3][0] = CV[3][0];
  tmpRIGHT[3][1] = CV[3][1];

  adaptiveDeCasteljau3(tmpLEFT, 0, tolerance);
  adaptiveDeCasteljau3(tmpRIGHT, 0, tolerance);


}

显然没有绘制任何内容。你有什么想法吗?

最佳答案

开始/结束应该吞没整个循环,而不是在每个孤立的顶点内部!

关于c - 如何用C实现曲线的自适应 segmentation 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868121/

相关文章:

c - 重新排列文件的内容

c++ - QML 下的 OpenGL

c++ - 在 0x1000A456 (glut32.dll) OpenGL 抛出异常

c++ - OpenGL - 透视问题

c - 在excel-vba中使用DLL

c - GCC、ARMboot - 创建没有任何库和任何操作系统的独立应用程序

c - "Freezing"控制台中的输入行并打印在上面的行上?

c++ - 使用 glOrtho 移动相机

c++ - OpenGL 调整纹理/四边形的大小

opengl - 是否可以在 GLUT 中制作没有顶部的窗口?