如何将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样条曲线。我不认为他们是一样的。好吧,伙计,那么我希望有人能帮我,把这个作为评论。这并不能回答这个问题。