top | item 3951255

Recursive Drawing

694 points| nreece | 14 years ago |recursivedrawing.com | reply

83 comments

order
[+] jedahan|14 years ago|reply
Do yourself a favor, and watch Toby Schachman (the author) explaining his ITP thesis. This is just one expression of a larger vision for alternative programming which he describes very succinctly. These two videos include him and the slides: http://itp.nyu.edu/thesis/spring2012_archives/thesis-Heching... http://itp.nyu.edu/thesis/spring2012_archives/thesis-Heching...

More angles and other great videos available at http://itp.nyu.edu/shows/thesis2012/archives/

[+] msg|14 years ago|reply
This is so cool!

I started drawing without watching the video and didn't get it. Thank goodness I didn't give up there.

Recipe for fun:

Make a very thin rectangle by dragging in a square, and holding down shift to resize it. You can basically get a line.

Drag the line onto itself. You now have a spirograph.

I would think these are actually not that big or complicated to store. Each drawing is a list of {pointer, x, y, theta} for each. You might be able to "export to text" pretty easily. Want to see a friend's drawing (and incidentally, entire drawing toolbox)? Import the text.

Edit: came back to add that I left morphing (size, length/width ratios) out of the data structure. Incidentally, maybe morphing is why triangle isn't a primitive. What relation should you set up for a self referencing triangle? Maybe if you label the vertices.

You might be able to handle the self-referencing without any extra members in the text representation. You just have to handle a special case of child pointer == self.

I didn't read the code yet, but it's fun to think about.

[+] ynniv|14 years ago|reply
It would be quite nice if the page popped an alert before leaving. OSX/Chrome has the irritating "feature" whereby dragging two fingers loses all of your data. err... navigates backwards. Looking to disable this, but asking before navigating would be an improvement.
[+] wdewind|14 years ago|reply
Under System Preferences -> Trackpad -> More Gestures set the swipe gesture to 3 fingers only
[+] pacaro|14 years ago|reply
This is non-responsive for me at the moment, how does this compare to http://www.contextfreeart.org/ ?

Is it a visual interface to define the rule system, rather than the programming language approach? If so does it escape the same traps that other visual languages fall into?

[+] apgwoz|14 years ago|reply
I work with the original author of CFDG, who described this exact idea to me just last week. My jaw about hit the floor when I saw this. Though, it's possible that he knows the author of this.
[+] mrmaddog|14 years ago|reply
This is really cool, and playing with it made me smile. I wish it had two things:

1) A way to delete objects that you placed by accident. (perhaps there is a way to do this which I couldn't find). I keep going back a page and losing everything because I press the delete button.

2) A way to label layers, with generated descriptions of what the layer is. i.e. Here is a new layer called a "heart". A heart is two circles and one square. A "valentines day picture" is two hearts. Likewise, a "tree" is a rectangle, with another a rotated "tree" touching one end of the rectangle. I can imagine this being a great way to explain programming concepts in a visual way, and giving people the vocabulary to talk about them.

As for my artistic abilities... http://cl.ly/251m2k0z1Z0z142r3S42

[+] jacktoole1|14 years ago|reply
Right click on the shape, and you can choose to delete it.
[+] megamark16|14 years ago|reply
Right clicking on a shape brings up a Delete Shape option.
[+] eck|14 years ago|reply
Old trick. Go search for [postscript snowflake] sometime. Great fun for drawing psychedelic images and/or crashing network printers. (It turns out that .ps is actually an archaic programming language and not just a page description language.)
[+] RodgerTheGreat|14 years ago|reply
It's not even really that archaic- concatenative languages just never hit mainstream among programmers. PostScript has built-in datatypes for dictionaries and lists, first-class procedures, closure-like mechanisms, clean, uniform syntax... refreshingly modern for something designed in 1982. I wrote a Forth compiler and VM in PostScript a while back: https://github.com/JohnEarnest/Four.Ps/blob/master/four.ps
[+] kika|14 years ago|reply
PS is basically Forth
[+] zupa|14 years ago|reply
I think you are onto creating a graphical programming language.

You implemented: -variables (shapes in left windows) -objects (collection of variables, the left column, pass by reference) -addition (drag in the middle) -unset (delete) -while(1) loop -multiplication (resize)

I don't know yet where rotation fits into the picture. Maybe its just that "primitive types" in a graphical programming language would be more complex, they could be described with -shape -size -orientation -position

I think I have a use-case for you. Maybe we could talk about it thalter at zupa hu

Congrats, fascinating!

[+] roryokane|14 years ago|reply
Textual instructions (if you don't want to watch the demo video):

The left column is the shapes library. The center area is the canvas/workspace. The right area is an outline view of the shapes in the canvas.

To add a shape to the canvas, drag your mouse from the shape in the shape library to the workspace.

To move a shape, drag inside it, when the whole shape is highlighted red.

To resize and rotate a shape, drag the edge of it, when it is outlined red.

To delete a shape on the canvas, right-click it and choose Delete Shape. (You currently cannot delete shapes directly from the outline, nor can you delete shapes from the shape library.)

To resize a shape non-uniformly or add skew, hold shift while dragging its outline. You can use this to make line segments and rhombuses, among other things.

Click the + button in the left column to start editing a new shape.

Remember that you can add any shape to the canvas by dragging it from the shape library. This also applies to shapes you create yourself.

Click on any shape in the shape library (except for the starting circle and square) to edit it in the canvas.

You can see the thumbnail of what's in the canvas in the current shape in the shape library. You can also see the shapes your shape is composed of in the outline. Everything is updated live.

To pan across the canvas, drag outside of any shape, in the white area. To zoom into or out from the canvas, scroll with the mouse wheel while pointing inside the canvas.

You can drag even the shape you are currently editing from the shape library into the canvas. That is what makes this recursive drawing rather than merely nested drawing. You will see the current shape repeated relative to itself. (You might call the shape inside itself a "recursive shape instance".)

You can move, rotate, and resize a recursive shape instance to change its repetition pattern. For instance, if you resize the recursive shape instance to be smaller, you will see a line of recursive shapes shrinking forever. If you edit one of the repetitions of a shape, it will edit the whole pattern.

You can go back and edit a sub-shape, and every shape including that shape will update live.

If you don't know what to draw, try drawing one of these: any kind of fractal tree (https://www.google.com/search?q=fractal+tree&tbm=isch...), Koch snowflake (http://en.wikipedia.org/wiki/Koch_snowflake), Sierpinski triangle (http://en.wikipedia.org/wiki/Sierpinski_triangle), Sierpinski carpet (http://en.wikipedia.org/wiki/Sierpinski_carpet), or any other fractal (http://en.wikipedia.org/wiki/List_of_fractals).

[+] lloeki|14 years ago|reply
After trying my hand on some Sierpinski carpet and pseudo-dragon curve, I was experimenting with some texture stuff, my hand slipped, and now I don't have the foggiest idea how I did this[0] (it took ~10 minutes to completely render)

I found the demo trees a bit lacking, so I made some with more recursiveness and better fitting near the joints[1]. Fibonacci rarely looked so cool[2].

Second order recursion can give you some interesting stuff[4]. At some point I was successful in drawing a galaxy but things went whacky

I could see myself readily using this to generate artwork or material texture in some game.

This thing desperately needs some more love[3] than shown in the video. I'm dying to export data, be able to remove elements from left and right sidebars, have more basic shapes (triangle?), a persistent shape library (html5 local storage?), and some form of snapping to grid/angles/ratio/edge.

[0] http://imgur.com/a/EneFC#0 [1] http://imgur.com/a/EneFC#1 [2] http://imgur.com/a/EneFC#2 [3] http://imgur.com/a/EneFC#3 [4] http://imgur.com/a/ZUlOZ#1

[+] modeless|14 years ago|reply
Wow, the Sierpinski triangle was difficult to achieve without any precision snapping tools.
[+] jstanley|14 years ago|reply
This is unbelievably cool. The demo video is worth watching, for anyone who doesn't get it.
[+] gegenschall|14 years ago|reply
This might actually be cool, but if you do not watch the video (read: RTFM) you will most likely think something like "This is an april's fool, right?" and immediately close the window. At least that's what happened to me until I saw the comments in here. Anyways, watching the video was fun. Doing it myself is rather boring. :-/
[+] spatten|14 years ago|reply
That's pretty fun!

One thing I'd like to see is holding down Ctrl (or something) allowing resizing while doing something like snap-to-grid. I.e. avoid rotation and allow you to change the aspect ratio.

I think this would be useful for making rectangles.

[+] lambdapilgrim|14 years ago|reply
Absolutely the best thing I have seen in a long time! Great tool to illustrate recursion to anyone and also to surprise yourself.
[+] Kopion|14 years ago|reply
Does anybody have any insights into how this was developed? Does the author care to chime in?
[+] DivisibleByZero|14 years ago|reply
Can't seem to figure out how to draw Sierpinski's triangle. The hello world of fractals.
[+] throwaway15289|14 years ago|reply
Draw a triangle and put 4 shrunk copies of itself in the triangle (center one flipped)?

http://imgur.com/m0Okt see components on rhs.

Edit: Oh sorry, was confused about which one Sierpinski's was. Can fix it by omitting middle triangle: http://imgur.com/MVmPh

[+] prezjordan|14 years ago|reply
I can't even imagine how you managed to develop this. Seriously awesome.