omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How to draw a circle segment (pie) in Scene?

    Pythonista
    5
    16
    10266
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Oscar
      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...

      1 Reply Last reply Reply Quote 1
      • omz
        omz last edited by omz

        You can either use a ShapeNode if you're using the new scene API, or the triangle_strip function (also new in 2.0) if you're working in "legacy mode".

        1 Reply Last reply Reply Quote 1
        • Olaf
          Olaf last edited by

          Example:

          # 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)```
          1 Reply Last reply Reply Quote 0
          • Olaf
            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))
            
            1 Reply Last reply Reply Quote 0
            • upwart
              upwart last edited by

              @omz
              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.

              1 Reply Last reply Reply Quote 0
              • upwart
                upwart last edited by

                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.

                1 Reply Last reply Reply Quote 0
                • Oscar
                  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?

                  1 Reply Last reply Reply Quote 0
                  • upwart
                    upwart last edited by

                    @Oscar
                    No also the list of tuples as you suggest does not work. Alas.

                    1 Reply Last reply Reply Quote 0
                    • Olaf
                      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_name is optional. I don't fully comprehend the logic at this time.
                      scene_drawing contains a call to triangle_strip in image_quad.

                      1 Reply Last reply Reply Quote 0
                      • upwart
                        upwart last edited by

                        @Olaf
                        Super! I just added a list of tuples with random values and voilà it works!
                        Thanks.

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post
                        Powered by NodeBB Forums | Contributors