How to draw a circle segment (pie) in Scene?
Webmaster4o last edited by
I have also been frustrated in the past by the lack of drawing functionality in
scene. It lacks simple functions like drawing a polygon from a list of points. I'd love for
sceneto have all the functionality of
Oscar last edited by Oscar
I think that right now the way to do it is using a PathNode. The old way of doing explicit drawing is not very efficient.
Edit: I meant ShapeNode when I wrote PathNode...
omz last edited by omz
You can either use a
ShapeNodeif you're using the new
sceneAPI, or the
triangle_stripfunction (also new in 2.0) if you're working in "legacy mode".
Olaf last edited by
# coding: utf-8 import math, scene, ui def circle_segment_path(r, angle): '''Path for circle segment (i.e. 'pizza slice') of radius r and angle degrees''' path = ui.Path() path.move_to(0, 0) path.line_to(r, 0) path.add_arc(0, 0, r, 0, -math.radians(angle), False) path.line_to(0, 0) return path def circle_segment_shape(point, r, angle): '''Blue & red shape for circle segment of radius r and angle degrees at point''' return scene.ShapeNode(path=circle_segment_path(r, angle), fill_color='blue', stroke_color='red', position=point) class MyScene (scene.Scene): def setup(self): self.add_child(circle_segment_shape(self.size/2, 200, 45)) if __name__ == '__main__': scene.run(MyScene(), show_fps=True)```
Olaf last edited by
Or if you want more 'pizza':
class MyScene (scene.Scene): def setup(self): for x in xrange(0, int(self.size.w)+50, 50): for y in xrange(0, int(self.size.h)+50, 50): self.add_child(circle_segment_shape((x, y), 50, 45))
I am trying to work out how to use triangle_strip, but I can't get it to work. For now all I want to do is draw a (solid) triangle.
If I try triangle_strip(((0,0),(10,0),(0,10))) I get a "Type error: expected sequence". Same if I close the sequence with a (0,0) tuple.
An example would be very helpful.
Thanks for all thoce nice examples with the new node objects. But for me the classical render loop is a must, because what am actuelly doing is prototyping an animation film that finally will be ported to Python on a Windows machine, most likely with PyGame or just plain PIL. Therefor the node objects are not an option to me, although I really like the concept.
Oscar last edited by
The list of points in your example is not strictly a list, it is a tuple of tuples.
I haven't tried it myself, but does triangle_strip([(0,0),(10,0),(0,10)]) work?
No also the list of tuples as you suggest does not work. Alas.
Olaf last edited by Olaf
Although the documentation states
scene_drawing.triangle_strip(points[, tex_coords, image_name]), it seems tex_coords are mandatory (and of equal length as points).
image_nameis optional. I don't fully comprehend the logic at this time.
scene_drawingcontains a call to
Super! I just added a list of tuples with random values and voilà it works!