【问题标题】:how can i change the b-spline curves from 4 point to 6?如何将 b 样条曲线从 4 点更改为 6 点?
【发布时间】:2013-12-14 21:41:42
【问题描述】:

我在 C++ 上有一个代码,它是具有 4 个点的 b 样条曲线,如果我想将其更改为 6 个点,我应该在代码中进行哪些更改?

您可以查看代码:

#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;
}

【问题讨论】:

  • 如果您想在两个内部点之间插入这些点,那么您可以使用插值方法简单地获取它们的坐标。如果它位于 2 之外,那么您应该至少再计算一个控制点。此外,我会重新设计代码,使其包含一个接受浮点坐标的 b 样条插值函数。现在我厌倦了提供完整的答案,但我明天试试。
  • 提前非常感谢,我将等待答复,
  • 呃抱歉,我刚刚在我的一个应用程序中意识到我使用的是 Catmull-Rom 样条而不是 B 样条。我认为这是 B 样条。我不认为他们是一样的。:S
  • 没关系的人,那么我希望有人能帮助我,

标签: c++ graphics codeblocks curve bspline


【解决方案1】:

根据您的公式,您似乎正在尝试绘制三次贝塞尔曲线。但这个公式似乎并不完全正确。你可以谷歌“三次贝塞尔曲线”来找到正确的公式。 Wikipedia page 包含任何贝塞尔曲线度数的公式。您可以使用 degree = 5 从那里找到“6 分”公式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2020-04-06
相关资源
最近更新 更多