Как соединить несколько точек линиями в opengl? - PullRequest
0 голосов
/ 18 января 2019

Я не мог нарисовать несколько линий, чтобы соединить мои точки, когда он зацикливается, он рисует одну линию.

в списке «pos» я сохранил все свои позиции точек, затем я прошел черезсписок, чтобы нарисовать линию от одной точки в списке к следующей, но, кажется, что это происходит, это нарисовать одну линию.

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

import numpy as np
import math as mt

pos_x = []
pos_y = []
pos= []
lol = 8

def point_pos(p, r):
    for i in range(p):
        t = 2 * mt.pi * i / p

        x = r * mt.cos(t)
        pos_x.append(x)

        y = r * mt.sin(t)
        pos_y.append(y)

        glBegin(GL_POINTS)
        glVertex2f(x, y)
        glEnd()

    pos = [[[a, b] for a in pos_x] for b in pos_y]


    for m in range(lol-1):
        glBegin(GL_LINES)
        glColor3f(0.0, 1.0, 0.0)
        glVertex2f(pos[0][m][0], pos[0][m][1])
        for n in range(lol-1):
            glVertex2f(pos[0][m+1][0], pos[0][m+1][1])
        glEnd()

def main():
    pygame.init()
    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

    gluPerspective(90, (display[0]/display[1]), 0.1, 50.0)

    glTranslatef(0.0,0.0, -5)

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    point_pos(lol, 2)
    pygame.display.flip()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        #glRotatef(1, 1, 0, 1)
        pygame.time.wait(10)

main()

Я думаю, что проблема с этими строками кода

for m in range(lol-1):
     glBegin(GL_LINES)
     glColor3f(0.0, 1.0, 0.0)
     glVertex2f(pos[0][m][0], pos[0][m][1])
     for n in range(lol-1):
         glVertex2f(pos[0][m+1][0], pos[0][m+1][1])
     glEnd()

Я ожидаю увидеть все мои точки, соединенные друг с другом линиями.как ортоплекс.

1 Ответ

0 голосов
/ 18 января 2019

Рекомендую создать список точек. Каждый элемент списка представляет собой кортеж с координатами x и y точки:

points = []
for i in range(p):
    t = 2 * mt.pi * i / p

    x = r * mt.cos(t)
    y = r * mt.sin(t)

    points.append((x, y))

или

points = [(r*mt.cos(t), r*mt.sin(t)) for t in [2*mt.pi * i/p for i in range(p)]]

Линии от каждой точки к другой точке можно нарисовать в 2 вложенных цикла. Каждая петля пересекает весь список точек:

glLineWidth(2.0)
glBegin(GL_LINES)
glColor3f(0.0, 1.0, 0.0)
for pt1 in points:
    for pt2 in points:
        glVertex2f(*pt1)
        glVertex2f(*pt2)
glEnd()

Нарисуйте точки сверху линий в одном цикле:

glPointSize(7.0)
glBegin(GL_POINTS)
glColor3f(1.0, 0.0, 0.0)
for pt in points:
    glVertex2f(*pt)
glEnd()

Примечание, glLineWidth укажите ширину растровых линий, а glPointSize укажите диаметр растровых точек.

...