Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't Pyglet draw a polygon correctly?

I'm randomly creating points to use to draw a polygon with Pyglet. But Pyglet doesn't do the job right most of the time.

Well I tried drawing a polygon with another graphic module and actually it worked but if Pyglet was working alright it would make my job easier.

I use this to draw polygon and points (to make it easy for you see).

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()

actual result

This is the result but it should be like the green colored polygon I drew below. wrong and correct

like image 285
Adenzu Avatar asked Dec 20 '25 03:12

Adenzu


1 Answers

PyGlet is a OpenGL wrapper. Polygones which are drawn with the Legacy OpenGL Primitive type GL_POLYGON have to be Convex. Concave polygons might not be drawn correctly.


Use the primitive type GL_TRIANGLE_FAN and start with the point (59, 149). This will solve the issue in your special case:

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)))

This causes this Polygon triangulation:


For any polygon you want to draw you've to find a proper Polygon triangulation. The triangulation can vary and one of the Triangle primitive types GL_TRIANGLES, GL_TRIANGLE_STRIP or GL_TRIANGLE_FAN has to be used.

In some cases it is sufficient to change the start point of the polygon and to use the primitive type GL_TRIANGLE_FAN.

e.g. the point list (from the commnet) [488, 485, 375, 73, 61, 48, 70, 257, 119, 260, 418, 327] can be change to [375, 73, 61, 48, 70, 257, 119, 260, 418, 327, 488, 485]:

enter image description here


For a more general approach you've to implement Polygon triangulation algorithm like the Two ears theorem, but OpenGL doesn't do the job for you.

like image 143
Rabbid76 Avatar answered Dec 21 '25 16:12

Rabbid76



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!