Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 15.12.2012
Сообщений: 6

Кривая Безье

12.01.2013, 18:37. Показов 4458. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне нужна помощь, а именно нужно откорректировать код, чтобы кривая рисовалась из 2 точек, в данном случаи она рисуется из 4. Очень нужно так как это курсовая а код нужно до завтрашнего дня.

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
122
123
124
125
126
#include "stdafx.h"
#include <gl\glut.h>
 
struct point { float x, y; } P[350];
int n = 0, i, j;
bool tP = false;
 
void Draw( );
void Mouse(int button, int state, int x, int y);
void MenuChek(int v);
void CurveBezier( );
void Line( );
 
void main( ) {
//Инициализируем режим отображения окна OpenGL
//GLUT_DOUBLE - окно с двойной буферизацией
//GLUT_RGB - режим RGBA
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(350,350); //устанавливаем размер окна
    glutCreateWindow("Кривая Безье"); //создаем окно с заголовком
    glutDisplayFunc(Draw); //устанавливаем функцию отрисовки
    glutMouseFunc(Mouse); //устанавливаем функцию обработки нажатий мыши
 
//Установить цвет и значение альфа, используемые при очистке буферов цвета 
    glClearColor(1,1,1,1); //цвет фона (RGBA)
    glMatrixMode(GL_PROJECTION); //Определяем стек матриц (матрица проекций)
    glLoadIdentity(); //установить текущую матрицу равной еденичной
 
    glOrtho(0,350,0,350,0,1); //Установить границы объема отсечения
    glColor3f(0,0,0); //Установить текущий цвет (R,G,B)
 
    glutCreateMenu(MenuChek); //Меню вызываемое нажатием ПКМ
    glutAddMenuEntry("Удалить последнюю точку", 0); //Пункт меню
    glutAddMenuEntry("Очистить", 1); //Пункт меню
    glutAttachMenu(GLUT_RIGHT_BUTTON);
 
    glutMainLoop(); //Запуск основного цикла обработки GLUT
}
 
void Draw( ) {
    glClear(GL_COLOR_BUFFER_BIT); //Очистка буфера цвета
    Line( );
    if (n > 3)
        CurveBezier();
    glutSwapBuffers(); //Переключить буферы в режиме двойной буферизации
}
 
void Mouse(int button, int state, int x, int y) {
    if (button == GLUT_LEFT_BUTTON) {
            if (tP && (x > 0 && x < 350)&& (350 > y && y < 700) ) { 
                P[j].x = x; 
                P[j].y = 350-y; 
            } else if (state == GLUT_DOWN && n != 0 && !tP)
                for (i = 0; i <= n; i++)
                    if ((x<P[i].x+30 && x>P[i].x-30) && (320-y<P[i].y && 380-y>P[i].y)) {
                        tP = true; 
                        j = i; 
                        break;
                    }   
            if (state == GLUT_UP) {
                if (!tP) {
                    P[n].x = x; 
                    P[n].y = 350-y; 
                    n++;
                }
                tP = false;
            }
    }
    glutPostRedisplay(); //Обновить текущее окно
}
 
void MenuChek(int v) {
    if (v == 0 && n > 0)
        n--; 
    else if (v == 1)
        n = 0;
    glutPostRedisplay(); //Обновить текущее окно
}
 
void Line ( ) {
    glPointSize(5);
    glColor3f(0,0,0);
 
//Контрольные точки
    glBegin(GL_POINTS);
        for (i = n-1; i >= 0; i--)
            glVertex2f(P[i].x, P[i].y);
    glEnd();
 
//Пунктирные линии
    glLineStipple(2,58360);
    glEnable(GL_LINE_STIPPLE);
    glBegin(GL_LINES);
        for (i = 0; i < n-1; i++) {
            glVertex2f(P[i].x, P[i].y);
            glVertex2f(P[i+1].x, P[i+1].y);
        }
    glEnd();
    glDisable(GL_LINE_STIPPLE);
    glPointSize(1);
}
 
void CurveBezier( ) {
    float px0,px1,px2,px3, py0,py1,py2,py3, xt, yt;
    for(i = 1; i < n-2; i++) {
        px0 = (P[i-1].x + 4*P[i].x + P[i+1].x) / 6.0;
        px1 = (-P[i-1].x + P[i+1].x) / 2.0;
        px2 = (P[i-1].x - 2*P[i].x + P[i+1].x) / 2.0;
        px3 = (-P[i-1].x + 3*P[i].x - 3*P[i+1].x + P[i+2].x) / 6.0;
        
        py0 = (P[i-1].y + 4*P[i].y + P[i+1].y) / 6.0;
        py1 = (-P[i-1].y + P[i+1].y) / 2.0;
        py2 = (P[i-1].y - 2*P[i].y + P[i+1].y) / 2.0;
        py3 = (-P[i-1].y + 3*P[i].y - 3*P[i+1].y + P[i+2].y) / 6.0;
        
        glColor3f(1,0,0);
        glPointSize(2);
        glBegin(GL_POINTS);
            for(float t = 0.0; t <= 1.0; t += 0.001) {
                xt = ((px3*t + px2)*t + px1)*t + px0;
                yt = ((py3*t + py2)*t + py1)*t + py0;
                glVertex3f(xt, yt, 0);
            }
        glEnd();
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2013, 18:37
Ответы с готовыми решениями:

Кривые Безье
Привет... у меня такой вопрос не могу нарисовать спираль в 3d вокруг оси x с помощью кривых Безье может кто - то уже делал такое, подкиньте...

Поверхность Безье
НЕ могу разобраться с поверхностями Безье, нужно построить что-то наподобие трубы, точнее в задаче нужно смоделировать движение змеи на...

Кривые Безье
Имеется задание: С помощью кубических кривых Безье нарисовать первую букву своего имени(Русский или латинский вариант) Вопрос :) Как я...

1
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
23.01.2013, 12:05
Посмотри вот 28 урок с NEHE http://pmg.org.ru/nehe/nehe28.htm.
Это перевод уроков с сайта http://nehe.gamedev.net/ там же можешь взять исходник этого урока. Вполне работоспособен. Сам проверял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2013, 12:05
Помогаю со студенческими работами здесь

Составные кривые Безье
Здравствуйте. Этот код строит каркас по кривым безье. Кривая безье задана 4 точками. Для моей задачи необходимо, допустим есть в...

Отрисовка кривых Безье OpenGL(C++)
Здравствуйте!!! Помогите пожалуйста нубу - необходимо нарисовать кривые Безье, но с инструментарием у меня совсем плохо..Первый день с...

Как нарисовать кривые безье
Хочу отобразить две кривых на одной плоскасти. Первая: { -4.0,-4.0, 0.0 } { -2.0, 4.0, 0.0 } { 2.0,-4.0, 0.0 } { 4.0, 4.0, 0.0...

Нарисовать сердце кривыми Безье
Не знаю как дорисовать вторую половину сердца #include&lt;Windows.h&gt; #include &lt;GL/glut.h&gt; /*Для Linux и Windows*/ #include&lt;vector&gt;...

Залить фигуру, нарисованную с помощью кривых Безье
Здравствуйте. С помощью кривых Безье я нарисовал замкнутую фигуру (цветок). Теперь его нужно залить цветом. #include...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru