Защо Pyglet не може да начертае многоъгълник правилно?

Създавам произволно точки, които да използвам за начертаване на многоъгълник с Pyglet. Но Pyglet не върши работата както трябва през повечето време.

Опитах се да начертая многоъгълник с друг графичен модул и всъщност се получи, но ако Pyglet работеше добре, щеше да улесни работата ми.

Използвам това, за да начертая многоъгълник и точки (за да ви е лесно да видите).

point_list = [18, 61, 59, 149, 328, 204, 305, 284, 3, 197, 25, 107]
ec = int(len(point_list)/2)
batch.add(ec, pyglet.gl.GL_POLYGON, None, ("v2i", point_list), ("c3B", [random.randrange(255)]*(3*ec)))
for i in range(int(len(point_list)/2)):
    p1 = point_list[i*2:2+i*2]
    p2 = point_list[2+i*2:4+i*2]

    if not len(p2):
        p2 = point_list[:2]

    batch.add(ec, pyglet.gl.GL_POINTS, None, ("v2i", point_list), ("c3B", [255]*(3*ec)))

@window.event
def on_draw():
    window.clear()
    batch.draw()
pyglet.app.run()

действителен резултат

Това е резултатът, но трябва да е като зеления многоъгълник, който нарисувах по-долу. грешно и правилно


person Adenzu    schedule 28.07.2019    source източник


Отговори (1)


PyGlet е обвивка на OpenGL. Многоъгълници, които са начертани с Legacy OpenGL Примитивен тип GL_POLYGON трябва да бъде Изпъкнал. Вдлъбнати многоъгълници може да не са начертани правилно.


Използвайте примитивен тип GL_TRIANGLE_FAN и започнете с точката (59, 149). Това ще реши проблема във вашия специален случай:

point_list = [59, 149, 328, 204, 305, 284, 3, 197, 25, 107, 18, 61]
ec = int(len(point_list)/2)
batch.add(ec, pyglet.gl.GL_TRIANGLE_FAN, None, 
    ("v2i", point_list),
    ("c3B", [random.randrange(255)]*(3*ec)))

Това причинява тази триангулация на многоъгълник:


За всеки многоъгълник, който искате да начертаете, трябва да намерите подходяща триангулация на многоъгълник. Триангулацията може да варира и един от примитивен триъгълник типове GL_TRIANGLES, GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN трябва да се използва.

В някои случаи е достатъчно да промените началната точка на полигона и да използвате примитивен тип GL_TRIANGLE_FAN.

напр. списъкът с точки (от съобщението) [488, 485, 375, 73, 61, 48, 70, 257, 119, 260, 418, 327] може да се промени на [375, 73, 61, 48, 70, 257, 119, 260, 418, 327, 488, 485]:

въведете описание на изображението тук


За по-общ подход трябва да приложите алгоритъм за многоъгълна триангулация като Теорема за две уши, но OpenGL не върши работата вместо вас.

person Rabbid76    schedule 28.07.2019
comment
Работи за този точен point_list, но с друг не работи, защо е така? Например: [488, 485, 375, 73, 61, 48, 70, 257, 119, 260, 418, 327] - person Adenzu; 28.07.2019
comment
@Adenzu Зависи от многоъгълника и триангулацията на многоъгълника. Триангулацията зависи от типа примитивен триъгълник. Дори ако използвате GL_POLYGON, тогава многоъгълникът е триангулиран, но точната триангулация не е посочена и зависи от графичния хардуер и драйвера. - person Rabbid76; 28.07.2019
comment
Последно нещо. Случайно да познавате графична библиотека или модул за Python, който може да рисува полигони с този вид списъци, както искам, дори ако числата са произволни? Като да можеш да начертаеш правилно както първия, така и втория списък. - person Adenzu; 28.07.2019