Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.66
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
#1

Построение кривой Безье - C++

27.10.2010, 17:28. Просмотров 4319. Ответов 0

Вобщем написал я код для построения, но почему-то оно строит кривую от точки (0,0) до первой точки вектора, а нужно, чтобы от первой точки вектора до последней. Сам не вижу ошибки, может кто заметит-поможет:
(рисование с помощью Opengl, на поля точки vx и vy не обращайте внимания - скучно было, сделал чуток анимации(реализует timer))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <vector>
#include <cmath>
#include <conio.h>
#include <iostream>
#include <Windows.h>
#include <GL/glut.h>
#define MXS 0.2 //max x speed
#define MYS 0.2 //max y speed
#define SIZE (20*rand()/RAND_MAX+2) //num of points
using namespace std;
 
struct point
{
    float x;
    float y;
    float vx;
    float vy;
};
 
vector <point> p;
 
void DrawCurve();
void print();
float GetX(float t);
float GetY(float t);
 
float C(int m, int k)
{
    int v;
    float r=1;
    v=(m-k)<k?m-k:k;
    for(int i=0;i<v;i++) r*=((m-i)/(v-i));
    return r;
}
 
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    DrawCurve();
    glFlush();
}
 
void DrawCurve()
{
    glColor3f(1,1,0);
    glPointSize(5);
    glBegin(GL_POINTS);
    for(int i=0;i<p.size();i++)
        glVertex2f(p.at(i).x,p.at(i).y);
    glEnd();
    glPointSize(1);
    glColor3f(1,1,1);
    glBegin(GL_LINE_STRIP);
    for(float t=0;t<=1;t+=0.005)
        glVertex2f(GetX(t),GetY(t));
    glEnd();
}
 
void print()
{
    cout<<"Size: "<<p.size()<<endl;
    for(int i=0;i<p.size();i++)
    cout<<"x: "<<p.at(i).x<<" y: "<<p.at(i).y<<endl;
}
 
float GetX(float t)
{
    float value=0;
    for(int i=0;i<p.size();value+=C(p.size(),i)*pow((float)t,i)*pow((float)(1-t),(float)(p.size()-i))*p.at(i).x,i++);
    return value;
}
 
float GetY(float t)
{
    float value=0;
    for(int i=0;i<p.size();value+=C(p.size(),i)*pow((float)t,i)*pow((float)(1-t),(float)(p.size()-i))*p.at(i).y,i++);
    return value;
}
 
void timer(int i=0)
{
    for(int i=0;i<p.size();i++)
    {
        p.at(i).x+=p.at(i).vx;
        p.at(i).y+=p.at(i).vy;
        if(p.at(i).x>100) p.at(i).x-=100;
        if(p.at(i).x<0) p.at(i).x+=100;
        if(p.at(i).y>100) p.at(i).y-=100;
        if(p.at(i).y<0) p.at(i).y+=100;
    }
    display();
    glutTimerFunc(50,timer,0);
}
 
int main(int argc, char** argv)
{
    srand(GetTickCount());
    for(int i=0;i<SIZE;i++)
    {
        point tp;
        tp.x=100*rand()/RAND_MAX;
        tp.y=100*rand()/RAND_MAX;
        tp.vx=MXS*rand()/RAND_MAX;
        tp.vy=MYS*rand()/RAND_MAX;
        p.push_back(tp);
    }
    print();
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(600,600);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Curve");
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 100, 0.0, 100);     
    glutDisplayFunc(display);
    timer();
    glutMainLoop();
    return 0;
}
Компилится под 10й студией при наличие Opengl файликов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2010, 17:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Построение кривой Безье (C++):

Построение кривой 2-го порядка - C++
Собственно нужно построить кривую по пяти точкам Общее уравнение кривой......

кривой Безье - C++
написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не...

безье - C++
ормула второй производной кривой безье

Задачка про кривые Безье - C++
Нужны советы (скорее алгоритмические) по одной задаче. Даны опорные точки кривой Безье, начальный и конечный параметры t0 и t1(0&lt;t&lt;1), а...

Кривая Безье с полиномами Берштейна - C++
Доброго времени суток. Захотел рассчитать и нарисовать кривую Безье. Вот ссылка на...

C++, кривые Безье, Алгоритмом de Casteljau - C++
Здравствуйте, В чем собственно состоит проблема: не могу придумать как написать уравнение кривой Безье! (x(t),y(t))\=B(t) по данному набору...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2010, 17:28
Привет! Вот еще темы с ответами:

Алгоритм деформации меша по кривым Безье - C++
Есть задача, которую очень долго не могу преодолеть. Ранее создавал тему, задачу решил, но теперь столкнулся с затыком. Есть рабочий...

как наложить на кривую безье сплайн - C++
Всем доброго времени суток! Тут мне такое вот задание преподаватель дал, основную часть работы я сделал, но вот задание...Надо чтобы на...

кривой вывод =( - C++
в общем она должна делать построчный сдвиг вниз, но какие то косяки с выводом хотя мб чет еще ^^ #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

Кривой код - C++
Задание: Дана последовательность из n символов. Выяснить, встречается ли в данной последовательности группа из трёх стоящих рядом точек. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru