2013-12-14 7 views
0

У меня есть код на C++ это б-сплайн кривой, которая имеет 4 очка, если я хочу изменить его на 6 пункт, что должен я изменить в коде?Как я могу изменить кривые b-сплайна с 4-х точек до 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; 
} 

пожалуйста, кто-нибудь помочь мне с этим :) спасибо в заранее.

+0

Если вы хотите, чтобы вставить эти точки между 2 внутренними точками, то вы можете просто получить их COORDS с помощью метода интерполяции. Если он лежит за пределами 2, вы должны рассчитать минимальную еще одну контрольную точку. Кроме того, я бы пересмотрел код, чтобы он содержал функцию интерполяции b-сплайна, которая принимает плавающие точки. Теперь я устал, чтобы дать полный ответ, но я пробую это завтра. –

+0

спасибо заранее ,, Я буду ждать для ответа ,, – user3103141

+0

Ухм жаль, что я только что понял, в одном из моего приложения я использовал Катмулла Rom сплайны не B-сплайны. Я это был B-сплайн. Я не думаю, что они same.:S –

ответ

0

Из вашей формулы, это выглядит, как вы пытаетесь нарисовать кубическую кривую Безье. Но формула выглядит не совсем корректно. Вы можете использовать «кубическую кривую Безье», чтобы найти правильную формулу. Wikipedia page содержит формулу для любой степени кривой Безье. Вы можете найти «6-точек» формулу оттуда, используя степень = 5.

+0

Включите это как комментарий. Это не дает ответа на вопрос. – 4dgaurav

+0

http://scratchapixel.com/lessons/3d-basic-lessons/lesson-11-rendering-the-teapot-bezier-surfaces/b-zier-curve/ – user18490

 Смежные вопросы

  • Нет связанных вопросов^_^