smalltalk: mandelbrot + literal-array mutability fix
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
36
lib/smalltalk/tests/programs/mandelbrot.st
Normal file
36
lib/smalltalk/tests/programs/mandelbrot.st
Normal file
@@ -0,0 +1,36 @@
|
||||
"Mandelbrot — escape-time iteration of z := z² + c starting at z₀ = 0.
|
||||
Returns the number of iterations before |z|² exceeds 4, capped at
|
||||
maxIter. Classic-corpus program for the Smalltalk-on-SX runtime."
|
||||
|
||||
Object subclass: #Mandelbrot
|
||||
instanceVariableNames: ''!
|
||||
|
||||
!Mandelbrot methodsFor: 'iteration'!
|
||||
escapeAt: cx and: cy maxIter: maxIter
|
||||
| zx zy zx2 zy2 i |
|
||||
zx := 0. zy := 0.
|
||||
zx2 := 0. zy2 := 0.
|
||||
i := 0.
|
||||
[(zx2 + zy2 < 4) and: [i < maxIter]] whileTrue: [
|
||||
zy := (zx * zy * 2) + cy.
|
||||
zx := zx2 - zy2 + cx.
|
||||
zx2 := zx * zx.
|
||||
zy2 := zy * zy.
|
||||
i := i + 1].
|
||||
^ i!
|
||||
|
||||
inside: cx and: cy maxIter: maxIter
|
||||
^ (self escapeAt: cx and: cy maxIter: maxIter) >= maxIter! !
|
||||
|
||||
!Mandelbrot methodsFor: 'grid'!
|
||||
countInsideRangeX: x0 to: x1 stepX: dx rangeY: y0 to: y1 stepY: dy maxIter: maxIter
|
||||
| x y count |
|
||||
count := 0.
|
||||
y := y0.
|
||||
[y <= y1] whileTrue: [
|
||||
x := x0.
|
||||
[x <= x1] whileTrue: [
|
||||
(self inside: x and: y maxIter: maxIter) ifTrue: [count := count + 1].
|
||||
x := x + dx].
|
||||
y := y + dy].
|
||||
^ count! !
|
||||
Reference in New Issue
Block a user