Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将b样条曲线从4点更改为6点? 我有一个C++代码,如果我想把它变成6点,B样条曲线有4点,我应该在代码中改变什么?< /P>_C++_Graphics_Codeblocks_Curve_Bspline - Fatal编程技术网

如何将b样条曲线从4点更改为6点? 我有一个C++代码,如果我想把它变成6点,B样条曲线有4点,我应该在代码中改变什么?< /P>

如何将b样条曲线从4点更改为6点? 我有一个C++代码,如果我想把它变成6点,B样条曲线有4点,我应该在代码中改变什么?< /P>,c++,graphics,codeblocks,curve,bspline,C++,Graphics,Codeblocks,Curve,Bspline,您可以检查代码: #include "graphics.h" #include <math.h> int main(void) { int gd, gm, page = 0; gd = VGA; gm = VGAMED; initgraph(&gd, &gm, ""); point2d pontok[4] = { 100, 100, 150, 200, 170, 130, 240, 270 }; //pon

您可以检查代码:

#include "graphics.h"
#include <math.h>

int main(void) {
  int gd, gm, page = 0;
  gd = VGA;
  gm = VGAMED;
  initgraph(&gd, &gm, "");
  point2d pontok[4] = { 100, 100, 150, 200, 170, 130, 240, 270 }; //pontok means points

  int ap;
  for (;;) {
    setactivepage(page);
    cleardevice();
    for (int i = 0; i < 4; i++)
      circle(integer(pontok[i].x), integer(pontok[i].y), 3);

    double t = 0;

    moveto((1.0 / 6) * (pontok[0].x * pow(1 - t, 3) +
                        pontok[1].x * (3 * t * t * t - 6 * t * t + 4) +
                        pontok[2].x * (-3 * t * t * t + 3 * t * t + 3 * t + 1) +
                        pontok[3].x * t * t * t),
           (1.0 / 6) * (pontok[0].y * pow(1 - t, 3) +
                        pontok[1].y * (3 * t * t * t - 6 * t * t + 4) +
                        pontok[2].y * (-3 * t * t * t + 3 * t * t + 3 * t + 1) +
                        pontok[3].y * t * t * t));

    for (t = 0; t <= 1; t += 0.01)
      lineto(
          (1.0 / 6) * (pontok[0].x * pow(1 - t, 3) +
                       pontok[1].x * (3 * t * t * t - 6 * t * t + 4) +
                       pontok[2].x * (-3 * t * t * t + 3 * t * t + 3 * t + 1) +
                       pontok[3].x * t * t * t),
          (1.0 / 6) * (pontok[0].y * pow(1 - t, 3) +
                       pontok[1].y * (3 * t * t * t - 6 * t * t + 4) +
                       pontok[2].y * (-3 * t * t * t + 3 * t * t + 3 * t + 1) +
                       pontok[3].y * t * t * t));

    /* Egerkezeles */ //Egerkezeles means mouse event handling
    if (!balgomb)
      ap = getactivepoint((point2d *)pontok, 4, 5);
    if (ap >= 0 && balgomb) { //balgomb means left mouse button
      pontok[ap].x = egerx;   //eger means mouse
      pontok[ap].y = egery;
    }
    /* Egerkezeles vege */

    setvisualpage(page);
    page = 1 - page;
    if (kbhit())
      break;
  }
  getch();
  closegraph();
  return 0;
}
#包括“graphics.h”
#包括
内部主(空){
int-gd,gm,page=0;
gd=VGA;
gm=VGAMED;
initgraph(&gd,&gm,“”);
point2d pontok[4]={100100150200170130240270};//pontok表示点
int ap;
对于(;;){
setactivepage(第页);
cleardevice();
对于(int i=0;i<4;i++)
圆(整数(pontok[i].x),整数(pontok[i].y),3);
双t=0;
moveto((1.0/6)*(pontok[0].x*pow(1-t,3)+
pontok[1].x*(3*t*t*t-6*t*t+4)+
庞托克[2].x*(-3*t*t*t+3*t*t+3*t+1)+
pontok[3].x*t*t*t),
(1.0/6)*(pontok[0].y*pow(1-t,3)+
庞托克[1].y*(3*t*t*t-6*t*t+4)+
庞托克[2].y*(-3*t*t*t+3*t*t+3*t+1)+
庞托克[3].y*t*t*t);
对于(t=0;t=0&&balgomb){//balgomb表示鼠标左键
pontok[ap].x=egerx;//eger表示鼠标
庞托克[ap].y=egery;
}
/*埃克泽勒蔬菜*/
setvisualpage(第页);
页码=1-页码;
if(kbhit())
打破
}
getch();
closegraph();
返回0;
}

根据您的公式,看起来您正试图绘制一条三次贝塞尔曲线。但这个公式似乎并不完全正确。你可以用谷歌搜索“三次贝塞尔曲线”来找到正确的公式。包含任意阶贝塞尔曲线的公式。通过使用度=5,您可以从中找到“6点”公式

如果要在两个内部点之间插入这些点,只需使用插值方法获得它们的坐标即可。如果它位于2之外,则应至少计算一个控制点。此外,我将重新设计代码,使其包含接受浮点坐标的b样条插值函数。现在我很想提供一个完整的答案,但我明天会尝试。提前感谢你,我将等待答案,嗯,很抱歉,我刚刚在我的一个应用程序中意识到我使用的是Catmull Rom样条曲线而不是B样条曲线。我认为是B样条曲线。我不认为他们是一样的。好吧,伙计,那么我希望有人能帮我,把这个作为评论。这并不能回答这个问题。