Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.11.2020
Сообщений: 86

Кривые в OpenGL

28.11.2022, 14:19. Показов 2487. Ответов 7

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как достроить на графике окружность сверху , в задании было указано, что нужно построить график по вариантам, но не указано как строить кривые. Мой код для построения звезды:
Python
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
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
 
 
 
def build_projection():
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(10, 10, 10, 10., 10., 0., 0., 1., 0.)
    glMatrixMode(GL_PROJECTION)
    glOrtho(-10, 10, -10, 10, 1, 30)
    glViewport(0, 0, 500, 500)
 
 
def set_lighting():
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLight(GL_LIGHT0, GL_POSITION, (10, 10, -10, 0))
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
    glEnable(GL_COLOR_MATERIAL)
 
def draw_square():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    build_projection()
    set_lighting()
 
    glLineWidth(4)
    glBegin(GL_LINE_STRIP)
    glColor3d(79, 77, 16)
    glVertex3d(5, 3, 0)
    glVertex3d(8, 7, 0)
    glVertex3d(4, 12, 0)
    glVertex3d(8, 12, 0)
    glVertex3d(11, 16, 0)
    glVertex3d(14, 12, 0)
    glVertex3d(18, 12, 0) ##########################################
    glVertex3d(14, 7, 0)
    glVertex3d(17, 3, 0)
    glVertex3d(11, 6, 0)
    glVertex3d(5, 3, 0)
    glEnd()
 
 
    glutSwapBuffers()
 
 
 
 
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(800, 800)
glutInitWindowPosition(50, 50)
glutCreateWindow("Dimasik")
glutDisplayFunc(draw_square)
glutMainLoop()
Миниатюры
Кривые в OpenGL  
Изображения
 
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2022, 14:19
Ответы с готовыми решениями:

Кривые в OpenGL SE 1.0
Помогите, пожалуйста, мне очень нужна ваша помощь. Как в Android с помощью OpenGL ES 1.0 сделать движение картинки по траектории,...

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: ...

Какая значительная разница между OpenGL ES 2.0 и OpenGL 3.3 при использовании в Qt
Привет всем! У меня видеокарта имеет поддержку 3.1 версию OpenGL, обновить хочу её с помощью установщика драйвера. У меня такой вопрос:...

7
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
28.11.2022, 18:01

Не по теме:

8Observer8, твой клиент!


2
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
28.11.2022, 18:34
Лучший ответ Сообщение было отмечено 8Observer8 как решение

Решение

Python
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
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import math
 
def build_projection():
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(10, 10, 10, 10., 10., 0., 0., 1., 0.)
    glMatrixMode(GL_PROJECTION)
    glOrtho(-10, 10, -10, 10, 1, 30)
    glViewport(0, 0, 500, 500)
 
 
def set_lighting():
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLight(GL_LIGHT0, GL_POSITION, (10, 10, -10, 0))
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
    glEnable(GL_COLOR_MATERIAL)
 
def draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    build_projection()
    set_lighting()
 
    glLineWidth(4)
    glBegin(GL_LINE_STRIP)
    
    glColor3d(79, 77, 16)
    x0,y0=10,10
    r0=3
    r=(r0*math.cos(math.pi/5)/math.cos(2*math.pi/5), r0)
    phi=2*math.pi/20
    for i in range(11):
        x=(r[i%2]*math.cos(phi)+x0)
        y=(r[i%2]*math.sin(phi)+y0)
        phi+=2*math.pi/10
        glVertex3d(x, y, 0)
    glEnd()
    
    glLineWidth(4)
    glBegin(GL_LINE_STRIP)
   
    glColor3d(79, 77, 16)
    
    phi=math.pi/10
    while phi<9*math.pi/10:
        x=(r[0]*math.cos(phi)+x0)
        y=(r[0]*math.sin(phi)+y0) 
        phi+=0.01
        glVertex3d(x, y, 0)
    glEnd()
    glutSwapBuffers()
 
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(800, 800)
glutInitWindowPosition(50, 50)
glutCreateWindow("Dimasik")
glutDisplayFunc(draw)
glutMainLoop()
3
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
28.11.2022, 19:07
Нарисуйте окружность белого цвета методом GL_TRIANGLE_FAN. Поверх неё нарисуйте другую окружность меньшего радиуса чёрного цвета. Получится белое кольцо. Отсеките нижнюю часть кольца прямоугольником чёрного цвета. Попробуйте сами, а я попозже скину свой вариант тоже на Python и GLUT.

Кстати, я недавно как раз звезду посчитал и нарисовал на WebGL и JavaScript:

Название: 204323586-38ac8994-2e7d-4b83-8dac-3030c450c651.png
Просмотров: 207

Размер: 2.2 Кб

Главное, рассчитать координаты этой точки:

Название: 204320444-43084d48-aaee-49e2-a2c9-2e5f64afd42c.png
Просмотров: 207

Размер: 11.7 Кб

Я не всё сам посчитал, подглядел формулы в статье: https://mathalino.com/reviewer... inted-star

Сначала нарисовал один четырёхугольник, а потом прокрутил его с шагом https://www.cyberforum.ru/cgi-bin/latex.cgi?2 \pi / 5

Название: 204325359-766d8fb4-fc09-4d45-9dac-724f60ab6a75.png
Просмотров: 205

Размер: 1.3 Кб
3
0 / 0 / 0
Регистрация: 17.11.2020
Сообщений: 86
30.11.2022, 09:31  [ТС]
Большое спасибо)
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
03.12.2022, 00:39
Можно рисовать разные кривые с помощью библиотеки beziers (https://pypi.org/project/beziers/). В том числе часть кольца, но с частью кольца пока не разбирался. Просто скину пример, чтобы он не потерялся. Наверняка кому-нибудь потом пригодится. Я позже попробую нарисовать часть кольца с помощь этой готовой библиотеки для кривых Безье. Уверен, что это возможно, я находил картинки, например, в этой теме: How to create circle with Bézier curves?

В этом примере для окна я использую SDL2 вместо GLUT.

pip install PySDL2 PyOpenGL beziers


main.py

Python
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
from beziers.cubicbezier import CubicBezier
from beziers.point import Point
from OpenGL.GL import *
from sdl2 import *
 
window = None
maxFPS = 20
 
def fatalError(message):
    print(message)
    if window:
        SDL_DestroyWindow(window)
    SDL_Quit()
    exit(-1)
 
def main():
    if SDL_Init(SDL_INIT_VIDEO) < 0:
        fatalError(SDL_GetError())
 
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4)
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1)
 
    window = SDL_CreateWindow(
        b"Beziers, OpenGL1, SDL2, Python",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        400, 400, SDL_WINDOW_OPENGL)
    if not window:
        fatalError(SDL_GetError())
 
    context = SDL_GL_CreateContext(window)
    if not context:
        fatalError("Failed to create the SDL_GL context")
 
    glClearColor(0.2, 0.2, 0.2, 1.0)
 
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, 250, 0, 250, 1, -1)
 
    cubicBezier = CubicBezier(
        Point(120, 160), Point(35, 200), Point(220, 260), Point(220, 40)
    )
 
    event = SDL_Event()
    running = True
    while running:
        while SDL_PollEvent(ctypes.byref(event)) != 0:
            if event.type == SDL_QUIT:
                running = False
        startTicks = SDL_GetTicks()
 
        glClear(GL_COLOR_BUFFER_BIT)
 
        glColor3f(0.5, 1, 0.7)
        glLineWidth(3)
 
        glBegin(GL_LINES)
        for i in range(100):
            start = cubicBezier.pointAtTime(i / 100)
            end = cubicBezier.pointAtTime((i + 1) / 100)
            glVertex2f(start.x, start.y)
            glVertex2f(end.x, end.y)
        glEnd()
 
        SDL_GL_SwapWindow(window)
 
        # Limit the FPS to the max FPS
        frameTicks = SDL_GetTicks() - startTicks
        if 1000.0 / maxFPS > frameTicks:
            SDL_Delay(int(1000.0 / maxFPS - frameTicks))
 
    SDL_GL_DeleteContext(context)
    SDL_DestroyWindow(window)
    SDL_Quit()
 
main()
Миниатюры
0
13.10.2025, 23:24
 Комментарий администратора 
Сообщения с примерами на C++ вынесены в отдельную тему.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
14.10.2025, 01:39
Пример выше использует PySDL2, а сейчас актуален PySDL3. Я переписал пример на PySDL3. Поменял цвета на белый фон и черную кривую, как в задании из первого сообщения темы.

Code
1
pip install PySDL3 PyOpenGL beziers
main.py

Python
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
import os
 
from beziers.cubicbezier import CubicBezier
from beziers.point import Point
from OpenGL.GL import *
 
os.environ["SDL_MAIN_USE_CALLBACKS"] = "1"
os.environ["SDL_RENDER_DRIVER"] = "opengl"
 
import sdl3
 
glContext = None
window = None
 
cubicBezier = None
 
@sdl3.SDL_AppInit_func
def SDL_AppInit(appstate, argc, argv):
    global glContext
    global window
    global cubicBezier
 
    if not sdl3.SDL_Init(sdl3.SDL_INIT_VIDEO):
        sdl3.SDL_Log("Couldn't initialize SDL: %s".encode() % sdl3.SDL_GetError())
        return sdl3.SDL_APP_FAILURE
 
    sdl3.SDL_GL_SetAttribute(sdl3.SDL_GL_MULTISAMPLEBUFFERS, 1) # Enable MULTISAMPLE
    sdl3.SDL_GL_SetAttribute(sdl3.SDL_GL_MULTISAMPLESAMPLES, 2) # Can be 2, 4, 8 or 16
 
    windowTitle = "OpenGL v1 PySDL3".encode()
    window = sdl3.SDL_CreateWindow(windowTitle, 268, 268, sdl3.SDL_WINDOW_OPENGL)
    if not window:
        sdl3.SDL_Log("Couldn't create a window: %s".encode() % sdl3.SDL_GetError())
        return sdl3.SDL_APP_FAILURE
 
    # Create an OpenGL context
    glContext = sdl3.SDL_GL_CreateContext(window)
    if not glContext:
        sdl3.SDL_Log("Couldn't create a glContext: %s".encode() % sdl3.SDL_GetError())
        return sdl3.SDL_APP_FAILURE
 
    sdl3.SDL_GL_SetSwapInterval(1) # Turn on vertical sync
 
    glClearColor(1, 1, 1, 1)
 
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, 250, 0, 250, 1, -1)
 
    cubicBezier = CubicBezier(
        Point(120, 160), Point(35, 200), Point(220, 260), Point(220, 40)
    )
 
    return sdl3.SDL_APP_CONTINUE
 
@sdl3.SDL_AppEvent_func
def SDL_AppEvent(appstate, event):
    if sdl3.SDL_DEREFERENCE(event).type == sdl3.SDL_EVENT_QUIT:
        return sdl3.SDL_APP_SUCCESS
 
    return sdl3.SDL_APP_CONTINUE
 
@sdl3.SDL_AppIterate_func
def SDL_AppIterate(appstate):
 
    glClear(GL_COLOR_BUFFER_BIT)
 
    glColor3f(0, 0, 0)
    glLineWidth(3)
 
    glBegin(GL_LINES)
    for i in range(100):
        start = cubicBezier.pointAtTime(i / 100)
        end = cubicBezier.pointAtTime((i + 1) / 100)
        glVertex2f(start.x, start.y)
        glVertex2f(end.x, end.y)
    glEnd()
 
    sdl3.SDL_GL_SwapWindow(window)
    return sdl3.SDL_APP_CONTINUE
 
@sdl3.SDL_AppQuit_func
def SDL_AppQuit(appstate, result):
    sdl3.SDL_GL_DestroyContext(glContext)
    # SDL will clean up the window/renderer for us
Название: 09ed459c814342bf2d5308fb63479627d8949c80.png
Просмотров: 83

Размер: 1.9 Кб

Эту программу легко переписать на C++, особенно с помощью ChatGPT или DeepSeek. На Python легче программировать, делать прототипы, отлаживать, а окончательную версию можно переписать на C++, чтобы получить небольшое по весу приложение по сравнению с PyInstaller с быстрой сборкой и быстрой работой. Если использовать шейдерный OpenGL, то можно собирать в WASM и потом в APK с помощью Cordova. Можно нативно в APK. Собрал пример выше в EXE. Приложение имеет вес 2.64 MB. EXE весит 252 KB. SDL3.dll весит 2.4 MB:

Название: 6f7d70fcf6562cce63b9e11208096ef049fc6c95.png
Просмотров: 83

Размер: 2.5 Кб

Исходники на C++ находятся в этом сообщении.

Пример Безье на JavaScript и WebGL 1.0
Вложения
Тип файла: zip bezier-opengl1-pysdl3-python.zip (1.3 Кб, 0 просмотров)
Тип файла: zip bezier-opengl1-sdl3-cpp-exe.zip (1.08 Мб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2025, 01:39
Помогаю со студенческими работами здесь

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL?
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без опен джел имеется вместо него? Тоесть понятно, что в сборке...

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение.
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на видео карту.В разделе программы Repot мне посыпалось куча...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю для скачивания вторую переведенную главу...

Ошибки при подключение opengl, немного не связанные с opengl
#include &lt;windows.h&gt; #include &quot;stdafx.h&quot; #include &lt;gl/gl.h&gt; #include &lt;gl/glu.h&gt; #include &lt;stdio.h&gt; //#include &quot;TXLib.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru