I couldn’t resist trying it with some other regular polygons. Here’s how the pentagon worked out
I think, given more time, that those white blotches would be pentagons. The 50k iterations just didn’t get the job done. I had to up the ante to 5,000,000 iterations – 42 minutes on my machine (Triangle Fractal took 42 seconds). If I could (was willing to) get rid of the randomness, I’m sure it could be done much faster. But then it would lose its charm. Here’s the code
Sub SheetPolygon()
Dim CurrX As Double
Dim CurrY As Double
Dim Vertices(1 To 5, 1 To 2) As Double
Dim NextVert As Long
Dim i As Long
Dim wsh As Worksheet
Dim lMaxVert As Long
Dim lStart As Long
Dim c1 As Double, c2 As Double, s1 As Double, s2 As Double
Const XOFF As Long = 128
Const YOFF As Long = 128
Const PI = 3.14159265358979
Warning: don‘t run this code unless you have some time
lStart = Timer
c1 = Cos(2 * PI / 5)
c2 = Cos(PI / 5)
s1 = Sin(2 * PI / 5)
s2 = Sin(4 * PI / 5)
Vertices(1, 1) = XOFF + 0
Vertices(1, 2) = YOFF – 127
Vertices(2, 1) = XOFF + (s1 * XOFF)
Vertices(2, 2) = YOFF – (c1 * YOFF)
Vertices(3, 1) = XOFF + (s2 * XOFF)
Vertices(3, 2) = YOFF + (c2 * YOFF)
Vertices(4, 1) = XOFF – (s2 * XOFF)
Vertices(4, 2) = YOFF + (c2 * YOFF)
Vertices(5, 1) = XOFF – (s1 * XOFF)
Vertices(5, 2) = YOFF – (c1 * YOFF)
Set wsh = ThisWorkbook.Worksheets.Add
wsh.Cells.RowHeight = 1.5
wsh.Cells.ColumnWidth = 0.17
lMaxVert = UBound(Vertices, 1)
NextVert = lMaxVert
CurrX = Vertices(NextVert, 1)
CurrY = Vertices(NextVert, 2)
‘loop ten thousand times
For i = 1 To 5000000
NextVert = Int(lMaxVert * Rnd + 1) ‘pick a random vertex
GetNewPoint CurrX, CurrY, Vertices(NextVert, 1), Vertices(NextVert, 2)
PlacePointWsh CLng(CurrX), CLng(CurrY), wsh
Next i
Debug.Print Timer – lStart
End Sub
Dim CurrX As Double
Dim CurrY As Double
Dim Vertices(1 To 5, 1 To 2) As Double
Dim NextVert As Long
Dim i As Long
Dim wsh As Worksheet
Dim lMaxVert As Long
Dim lStart As Long
Dim c1 As Double, c2 As Double, s1 As Double, s2 As Double
Const XOFF As Long = 128
Const YOFF As Long = 128
Const PI = 3.14159265358979
Warning: don‘t run this code unless you have some time
lStart = Timer
c1 = Cos(2 * PI / 5)
c2 = Cos(PI / 5)
s1 = Sin(2 * PI / 5)
s2 = Sin(4 * PI / 5)
Vertices(1, 1) = XOFF + 0
Vertices(1, 2) = YOFF – 127
Vertices(2, 1) = XOFF + (s1 * XOFF)
Vertices(2, 2) = YOFF – (c1 * YOFF)
Vertices(3, 1) = XOFF + (s2 * XOFF)
Vertices(3, 2) = YOFF + (c2 * YOFF)
Vertices(4, 1) = XOFF – (s2 * XOFF)
Vertices(4, 2) = YOFF + (c2 * YOFF)
Vertices(5, 1) = XOFF – (s1 * XOFF)
Vertices(5, 2) = YOFF – (c1 * YOFF)
Set wsh = ThisWorkbook.Worksheets.Add
wsh.Cells.RowHeight = 1.5
wsh.Cells.ColumnWidth = 0.17
lMaxVert = UBound(Vertices, 1)
NextVert = lMaxVert
CurrX = Vertices(NextVert, 1)
CurrY = Vertices(NextVert, 2)
‘loop ten thousand times
For i = 1 To 5000000
NextVert = Int(lMaxVert * Rnd + 1) ‘pick a random vertex
GetNewPoint CurrX, CurrY, Vertices(NextVert, 1), Vertices(NextVert, 2)
PlacePointWsh CLng(CurrX), CLng(CurrY), wsh
Next i
Debug.Print Timer – lStart
End Sub
You’ll need to get GetNewPoint and PlacePointWsh from Triangle Fractal. I got the vertices from MathWorld.
I have been playing with Fractals for many years and was recently given a challenge at a meeting where I had stated “Why don’t we do that in Excel? You can do everything in Excel”.
“You Can’t make Mandelbrots without using code” came the response.
So 1 Hr later here is Excel_Madlbrot.xls with a graphics output and no VBA code.
http://www.ianeva.info/Excel_Mandelbrot/Excel_Mandelbrot.html
Hui…
Hui,
That is amazing! I’m going to waste hours on figuring out how you did it.
Rob
Wow Hui!
I am totally blown away by that.
If I had a spare day or two, I might have looked into how you did it, but then again, I sometimes think that knowing why a sunset happens actually takes something away from the experience so perhaps I’ll just remain in awe.
Alan.
The views expressed are my own, and not those of my employer or anyone else associated with me.
My current valid email address is:
6f7chu602@sneakemail.com
This is valid as is. It is not munged, or altered at all.
It will be valid for AT LEAST one month from the date of this post.
If you are trying to contact me after that time,
it MAY still be valid, but may also have been
deactivated due to spam. If so, and you want
to contact me by email, try searching for a
more recent post by me to find my current
email address.
Alan –
Here’s how it works, but you have to promise not to tell anyone.
It’s magic!
– Jon
Sub Tapis()
‘Autor?
ActiveSheet.Unprotect
Randomize
couleur = Int(28 * Rnd + 3)
For Each fou In Range(“Table”)
If fou.Value 0 And fou.Value Mod 2 = 0 Then fou.Interior.ColorIndex = couleur
Next fou
Randomize
couleur = Int(28 * Rnd + 3)
For Each la In Range(“Table1?)
If la.Value 0 And la.Value Mod 2 = 1 Then la.Interior.ColorIndex = couleur
Next la
ActiveSheet.Protect
End Sub
Sub efface()
ActiveSheet.Unprotect
Range(“Table”).Interior.ColorIndex = xlNone
Range(“Table1?).Interior.ColorIndex = xlNone
ActiveSheet.Protect
End Sub