Graphics not plotted in same plot?

I'm trying to make a sierpinsky triangle recursively, and i can generate all the triangles (via 3 line segments), however when i go to show my list, the graphics print separately. I saw on the documentation there's a graphics_array, which seems useful, but there weren't many examples and my tinkering with it was pretty much useless, especially since the "adjoin" feature is not yet implemented.

Also tried passing the graphics object "some_lines" to get filled by the function, but it doesn't seem like it accesses the reference. Code attached, maybe you can see a way I can plot all the lines within one sum of graphics, as was my initial attempt:

def draw_tri(some_lines, endpts):
some_lines+=line([endpts[0], endpts[1]], color='blue')
some_lines+=line([endpts[0], endpts[2]], color='blue')
some_lines+=line([endpts[1], endpts[2]], color='blue')
return

def get_mid(x,y):
return (x+y)/2

def recurse_SG(some_lines, n, endpts):
#graphics_sum = graphics_array([line([endpts[0], endpts[1]], color='blue')],3, 1)
if(n==1):
#graphics_sum[i]=draw_tri(endpts)
draw_tri(some_lines, endpts)
else:
recurse_SG(some_lines, n-1, [endpts[0], (get_mid(endpts[0][0], endpts[1][0]), get_mid(endpts[0][1], endpts[1][1])), (get_mid(endpts[0][0], endpts[2][0]), get_mid(endpts[0][1], endpts[2][1]))])
recurse_SG(some_lines, n-1, [endpts[1], (get_mid(endpts[1][0], endpts[0][0]), get_mid(endpts[1][1], endpts[0][1])), (get_mid(endpts[1][0], endpts[2][0]), get_mid(endpts[1][1], endpts[2][1]))])
recurse_SG(some_lines, n-1, [endpts[2], (get_mid(endpts[2][0], endpts[0][0]), get_mid(endpts[2][1], endpts[0][1])), (get_mid(endpts[2][0], endpts[1][0]), get_mid(endpts[2][1], endpts[1][1]))])

show(some_lines, axes=false)

edit retag close merge delete

Welcome to Ask Sage! Thank you for your question!

( 2018-04-08 20:11:41 -0500 )edit

In addition to the functions draw_tri, get_mid, recurse_SG, could you provide an example of how you use them?

( 2018-04-08 20:22:23 -0500 )edit
1

Thanks for editing your question, it is much more readable now!

( 2018-04-08 20:37:03 -0500 )edit

Sort by ยป oldest newest most voted

Here are some suggestions with respect to the code in the question.

One suggestion is to draw triangles using polygon instead of line.

This way you don't have to access endpoints[0], endpoints[1], endpoints[2] but you can do all in one go.

sage: pts = [(0,0), (2, 0), (1, 1.732)]
sage: t = polygon(pts, fill=False)
sage: t.show(aspect_ratio=1, axes=False)
Launched png viewer for Graphics object consisting of 1 graphics primitive


Another suggestion would be to separate the computation and the plotting, ie compute the various triangles you will need to plot, storing them in a list, and then just adding plots of these triangle to a graphics object.

You already have a good grasp on how graphics work in Sage. You noticed that f you have several graphics objects, you can just add them with +, as in:

sage: p = plot(x^2)
sage: l = line2d([(-1,-1), (1, 1)], color='green')
sage: c = circle((0,0), 1, color='purple')
sage: p + l + c


Note that if you want an empty graphics object as a starting point, you can get one with Graphics().

So you can do for instance

sage: G = Graphics()
sage: for k in range(10):
....:     G += line2d([(k, 0), (k, 1)], hue=k/10)
sage: G.show(axes=False)


Once you have a function to get all the triangles you need (as a list of triples of points), you could have a different function to plot them:

def plot_gasket(list_of_triangles):
G = Graphics()
for t in list_of_triangles:
G += polygon(t, fill=False)
return G


and then you can show the result!

sage: G.show(aspect_ratio=1, axes=False)

more

Thanks! Very insightful. I hope to become proficient in Sage, soon. I'll have to spend time going through lots of documentation, since I didn't even know about polygons! I appreciate the advice, especially the perspective about splitting up tasks. I imagine then that graphic_arrays aren't terribly useful?

( 2018-04-08 22:09:45 -0500 )edit
1

The graphics_array function is for displaying a collection of graphic objects in a table form.

For example, maybe you plotted the sierpinsky gasket for various starting triangles and you want to show them side by side...

( 2018-04-09 02:33:23 -0500 )edit

Please start posting anonymously - your entry will be published after you log in or create a new account.

Stats

Asked: 2018-04-08 20:08:27 -0500

Seen: 58 times

Last updated: Apr 08 '18