Jump to content

Julia set: Difference between revisions

no edit summary
m (→‎{{header|REXX}}: added a comment in the output section.)
No edit summary
Line 712:
bitmap.show()</lang>
 
=={{header|Racket}}==
[[File:JuliaSet_racket.png|250px|thumb|right]]
<lang racket>
;; Based on Mandelbrot code (GPL) from:
;; https://github.com/hebr3/Mandelbrot-Set-Racket/blob/master/Mandelbrot.v6.rkt
;; Julia set algoithm (and coloring) from:
;; http://lodev.org/cgtutor/juliamandelbrot.html
;; HSV code (GPL) based on:
;; https://github.com/takikawa/pict-utils/blob/master/pict-utils/hsv.rkt
 
#lang racket
 
;; Required to generate image
(require picturing-programs)
 
;; CONSTANTS - NUMBERS
(define DEPTH 300)
(define WIDTH 800)
(define HEIGHT 600)
 
;; Structures
(struct posn [x y] #:transparent)
 
;; CONSTANTS - GRAPHIC
(define BACKGROUND (rectangle WIDTH HEIGHT 'solid 'grey))
(define jcnst (posn -0.7 0.27015))
 
;; PROCEDURES
;; make an RGB color from HSV values
(define (make-color/hsv hue saturation value)
(define chroma (* saturation value))
(define hue* (/ (remainder* hue (* 2 pi)) (/ pi 3)))
(define X (* chroma (- 1 (abs (- (remainder* hue* 2) 1)))))
(define-values (r1 g1 b1)
(cond [(and (<= 0 hue*) (< hue* 1)) (values chroma X 0)]
[(and (<= 1 hue*) (< hue* 2)) (values X chroma 0)]
[(and (<= 2 hue*) (< hue* 3)) (values 0 chroma X)]
[(and (<= 3 hue*) (< hue* 4)) (values 0 X chroma)]
[(and (<= 4 hue*) (< hue* 5)) (values X 0 chroma)]
[(and (<= 5 hue*) (< hue* 6)) (values chroma 0 X)]))
(define m (- value chroma))
(apply make-color (map (λ (x) (exact-round (* 255 (+ x m))))
(list r1 g1 b1))))
 
;; general remainder
(define (remainder* n1 n2)
(define num-divides (/ n1 n2))
(- n1 (* (floor num-divides) n2)))
 
;; Posn -> Number
;; Returns the magnitude of the posn
(define (posn-mag pt)
(let ([pt-x (posn-x pt)]
[pt-y (posn-y pt)])
(sqrt (+ (* pt-x pt-x)
(* pt-y pt-y)))))
 
;; Posn Posn -> Posn
;; Posn addition
(define (posn+ pt1 pt2)
(let ([pt1-x (posn-x pt1)]
[pt1-y (posn-y pt1)]
[pt2-x (posn-x pt2)]
[pt2-y (posn-y pt2)])
(posn (+ pt1-x pt2-x)
(+ pt1-y pt2-y))))
 
;; Posn Posn -> Posn
;; Posn multiplication
(define (posn* pt1 pt2)
(let ([x1 (posn-x pt1)]
[y1 (posn-y pt1)]
[x2 (posn-x pt2)]
[y2 (posn-y pt2)])
(posn (- (* x1 x2) (* y1 y2))
(+ (* x1 y2) (* x2 y1)))))
 
;; Posn -> Posn
;; Posn square
(define (posn-sqr pt)
(posn* pt pt))
 
;; Posn -> Number
;; Returns the julia set escape number for a given complex number
;; given in rectangular coordinates.
(define (julia-set-number start)
(define (iter result count)
(cond [(> (posn-mag result) 2) (sub1 count)]
[(> count DEPTH) DEPTH]
[else (iter (posn+ jcnst (posn-sqr result))
(add1 count))]))
(iter start 1))
 
;; Number -> Number
;; Returns the scaled location of a point
(define (scaled-x x)
(/ (* 1.5 (- x (/ WIDTH 2))) (* 0.5 WIDTH)))
(define (scaled-y y)
(/ (- y (/ HEIGHT 2)) (* 0.5 HEIGHT)))
 
;; Generates image
(define M-Image
(map-image
(λ (x y c)
(let* ([ref (julia-set-number (posn (scaled-x x) (scaled-y y)))])
(cond [(= ref DEPTH) (name->color 'black)]
[else (make-color/hsv (* 2 (* pi (/ ref DEPTH))) 1 1)]) ))
BACKGROUND))
 
M-Image ;show image if using drracket
 
(save-image M-Image "julias.png")
</lang>
 
=={{header|REXX}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.