top | item 23591590

Show HN: Random Roads

144 points| edwardc | 5 years ago |random-roads--edwardcunningh2.repl.co | reply

50 comments

order
[+] justinpombrio|5 years ago|reply
This reminds me of the beautiful "substrate" screen saver: http://www.complexification.net/gallery/machines/substrate/
[+] californical|5 years ago|reply
I just got it -- thanks for sharing this! Could watch it for hours...

If anyone else wants to download the screensaver, you can get it for linux/osx/ios/android: https://www.jwz.org/xscreensaver/ . Most in the collection aren't great (unless you're in an early-2000s aesthetic mood), but I just installed the substrate one :)

[+] kqr|5 years ago|reply
That is absolutely stunning. My favourite part of flying!
[+] carapace|5 years ago|reply
Ach! this reminds me of an artist who worked mostly with Processing ( https://processing.org ) and either did this or something very like it (and a bunch of other stuff.)
[+] cdaringe|5 years ago|reply
Brilliant. Anyone know of an impl ready to roll for macos?
[+] winrid|5 years ago|reply
Reminds me of the Wave Function Collapse algorithm, although doesn't look to be that.

https://github.com/mxgmn/WaveFunctionCollapse

What algorithm is this using? Got a GitHub link?

[+] shobith|5 years ago|reply
It seems to be available in browser, see script.js it's not minified.
[+] jk563|5 years ago|reply
Being able to see the random seed used in the console and use it in the hash is a nice touch. I found a few large ones and one with a single path between two points (1592751582695)
[+] Phithagoras|5 years ago|reply
Would be cool to see a blog post explaining the simulation!
[+] Kiro|5 years ago|reply
I feel I'm missing something when people ask what algorithm this is using. I'm imagining it as a bunch of Math.random and If statements. In fact, I don't think I've ever googled for a specific algorithm or implemented one. Am I doing programming wrong?
[+] djmips|5 years ago|reply
Looked at the code. You were right! It was random and some rules. Almost like an algorithm.
[+] cinntaile|5 years ago|reply
It looks like an auto-generated PCB to me. Cool stuff.
[+] dusted|5 years ago|reply
Wonderful little thing :) I was instantly reminded of substrate, but the way this ends, each "run" looks like a minimalistic artwork.

This would be great on A4 sized e-ink paper, mounted in a nice frame and refreshing a few times a day.

[+] edwardc|5 years ago|reply
Thanks for the feedback. Yes, I have been imagining the same thing too!

Just need to track down a e-ink display for this sort of fun project. Anyone know of any good ones that would make this easy?

[+] Cynddl|5 years ago|reply
Thanks for sharing! Really like the minimal design and the animations. Could you explain how you did this simulation?
[+] edwardc|5 years ago|reply
Thanks for the feedback - the minimal look is pleasing to my eye too!

I wrote a brief description in this comment: https://news.ycombinator.com/item?id=23592538

Initially I had envisaged something a bit cleverer, but for an art project keeping it simple seemed to do the trick.

[+] dfxt8|5 years ago|reply
Hey, good work! What algorithm did you use?
[+] edwardc|5 years ago|reply
Thanks! You can see the code here: https://repl.it/@EdwardCunningh2/Random-Roads

It's not especially clever:

1. I define a set of possible moves (eg. straight ahead, left turn, junction, etc). One possible move is a dead-end, which looks a bit like a house in my interpretation.

2. Each move is assigned a relative weight (eg. continuing straight ahead 10x more likely than turning left).

3. Each iteration, for each of the roads under construction, a random move is selected. Some moves are impossible (based on other roads already drawn on the map) and so it will ensure not to select one that would result in a collision. At worst, it will terminate the road with a dead-end.

4. Repeat forever, until every road has terminated in a dead-end.

Most of the script itself is dealing with the rendering logic. To avoid collisions I maintain a 2D array of all visited points.

[+] nostoc|5 years ago|reply
Interesting.

this one seems to show the boundaries of the display plane : https://random-roads--edwardcunningh2.repl.co/#1592753917190

[+] edwardc|5 years ago|reply
Good one! Yes, you've hit the bottom there.

It is artificially limited to a 1001 x 1001 grid - just to stop it from growing forever (which could get quite slow on lower end devices). In practice I rarely encounter maps that go that far.

[+] abdulhaq|5 years ago|reply
Some people see this and say 'how did you do it?'. Others say to themselves, 'how would I do it?'. I'm in the second category...
[+] jackdh|5 years ago|reply
Alot of other people probably say 'Why did you do it?'
[+] kuroguro|5 years ago|reply
Had a weird bug where the whole page was flickering while it was drawing. A reload fixed it. On latest FF/Win. Not sure what the cause was.
[+] kleer001|5 years ago|reply
I would love to see this combined with L-systems O_O
[+] gb|5 years ago|reply
Really nice. I tried something like this many years ago in Flash, but the results this can produce are far more impressive!
[+] kevsim|5 years ago|reply
Seems to use the same approach used to design the road system in Boston :)
[+] A4ET8a8uTh0|5 years ago|reply
Oddly mesmerising. What did you use to do it?
[+] edwardc|5 years ago|reply
Thanks. It's plain JavaScript, rendering with an HTML canvas.

I did investigate JS 2D graphics libraries but decided in the end that this was sufficiently simple to not warrant one. It was harder than I expected to get the drag & zoom to work!