Skip to content

Instantly share code, notes, and snippets.

@matux
Created February 26, 2019 14:05
Show Gist options
  • Save matux/fc6419bcec31745712b49b1ea35bd43a to your computer and use it in GitHub Desktop.
Save matux/fc6419bcec31745712b49b1ea35bd43a to your computer and use it in GitHub Desktop.
Mandelbrot fractal
import func Darwin.sin
import func Darwin.cos
import Swift
public typealias β„€ = Int
public typealias ℝ = Double
public typealias β„‚ = Complex
public func ρmap(_ ρ: β„€) -> String {
switch ρ {
case 41... : return " "
case 7... : return "."
case 5... : return "+"
case 3... : return "*"
case _ : return "#"
}
}
extension BinaryFloatingPoint {
func signum() -> Self {
return Self(signOf: self, magnitudeOf: self == 0 || isNaN ? 0 : 1)
}
public var abs: Self {
return self * signum()
}
}
public struct Complex {
public var β„œ: ℝ
public var β„‘: ℝ
public var abs: ℝ { return β„œ * β„œ + β„‘ * β„‘ }
public init() { (β„œ, β„‘) = (0, 0) }
public init(r: ℝ, i: ℝ) { (β„œ, β„‘) = (r, i) }
public init(x: ℝ, ΞΈ: ℝ) { (β„œ, β„‘) = (x * cos(ΞΈ), x * sin(ΞΈ)) }
public static func + (lhs: β„‚, rhs: β„‚) -> β„‚ {
return β„‚(r: lhs.β„œ + rhs.β„œ, i: lhs.β„‘ + rhs.β„‘)
}
public static func * (lhs: β„‚, rhs: β„‚) -> β„‚ {
return β„‚(r: lhs.β„œ * rhs.β„œ - lhs.β„‘ * rhs.β„‘,
i: lhs.β„œ * rhs.β„‘ + lhs.β„‘ * rhs.β„œ)
}
}
import Swift
func print(fractal Ζ’c: (_ c: β„‚) -> β„€, x: (ℝ, ℝ), y: (ℝ, ℝ)) {
var Ξ”: (ℝ, ℝ) = ((x.1 - x.0) / 40, (y.1 - y.0) / 80)
for x in stride(from: x.0, to: x.1, by: Ξ”.0) {
for y in stride(from: y.0, to: y.1, by: Ξ”.1) {
let ρ = ρmap(Ζ’c(β„‚(r: y, i: x)))
print(ρ, terminator: "")
}
print()
}
}
/// 𝑓𝑐(zβ‚™β‚Šβ‚) = 𝑧²+𝑐, zβ‚€=0
func mandelbrot(_ c: β„‚) -> β„€ {
var (it, z) = (0, β„‚())
while (it < 200 && z.abs < 4.0) {
z = z * z + c
it += 1
}
return it
}
/// 𝑓𝑐(zβ‚™β‚Šβ‚) = (▏𝑅𝑒(𝑧ₙ)β”‚+π‘–β”‚πΌπ‘š(𝑧ₙ)β–•)Β²+𝑐, zβ‚€=0
func burningShip(_ c: β„‚) -> β„€ {
var (it, z) = (0, β„‚())
while (it < 200 && z.abs < 4.0) {
let zβ‚™ = β„‚(r: z.β„œ.abs, i: z.β„‘.abs)
z = zβ‚™ * zβ‚™ + c
it += 1
}
return it
}
print(fractal: mandelbrot, x: (-1.35, 1.40), y: (-2.00, 1.05))
print(" Β· mandelbrot Β·\n")
print(fractal: burningShip, x: (-2.00, 1.20), y: (-2.10, 1.20))
print(" Β· burning ship Β·\n")
// #################################################################################
// ##############################********************###############################
// ########################********************************#########################
// ####################***************************+++**********#####################
// #################****************************++...+++**********##################
// ##############*****************************++++......+************###############
// ############******************************++++.......+++************#############
// ##########******************************+++++.... ...++++************###########
// ########******************************+++++.... ..++++++**********##########
// #######****************************+++++....... .....++++++**********########
// ######*************************+++++....... . .. ............++*********#######
// #####*********************+++++++++... .. . ... ..++*********######
// ####******************++++++++++++..... ..++**********#####
// ###***************++++++++++++++... . ...+++**********####
// ##**************+++................. ....+***********###
// ##***********+++++................. .++***********###
// #**********++++++..... ..... ..++***********###
// #*********++++++...... . ..++************##
// #*******+++++....... ..+++************##
// #++++............ ...+++************##
// #++++............ ...+++************##
// #******+++++........ ..+++************##
// #********++++++..... . ..++************##
// #**********++++++..... .... .++************##
// #************+++++................. ..++***********###
// ##*************++++................. . ..+***********###
// ###***************+.+++++++++++..... ....++**********####
// ###******************+++++++++++++..... ...+++*********#####
// ####*********************++++++++++.... .. ..++*********######
// #####*************************+++++........ . . . .......+*********#######
// #######***************************+++.......... .....+++++++*********########
// ########*****************************++++++.... ...++++++**********#########
// ##########*****************************+++++..... ....++++***********###########
// ###########******************************+++++........+++***********#############
// #############******************************++++.. ...++***********###############
// ################****************************+++...+++***********#################
// ###################***************************+.+++**********####################
// #######################**********************************########################
// ############################************************#############################
// #################################################################################
// Β· mandelbrot Β·
// #################################################################################
// #################################################################################
// #################################################################################
// #####################################################################*****#######
// ################################################################*******+...+*####
// #############################################################**********+...****##
// ###########################################################************. .+****##
// #########################################################***********++....+.****#
// ######################################################************+++......++***#
// ##############################*******************###************..... .....+++++#
// ########################*******+++*******************+ .+++++ . . ........+*#
// ####################**********+.. .+++*******+.+++**+. .....+.+**#
// #################**********++++...+...++ .. . . .+ ...+++++.***#
// ##############***********++..... . ... . ...++++++****##
// ############*************....... . . ...+++********##
// ##########***************. .. ...+++*********##
// #########***************++. .. . . ...+++*********###
// #######*****************. ... ...+++**********###
// ######*****************+. ...+++**********####
// #####****************+++ . .....++***********####
// #####**********++..... . ....+++***********####
// ####*********+++.. . ....+++***********#####
// ####********++++. ....+++***********#####
// ###*******++++. ...++++***********#####
// ###**++*+..+... ...+++************#####
// ### ...+++************#####
// ###*********+++++++++......... ...... ..++************#####
// ####****************++++++.................... .++***********######
// #####********************++++++++++++++++........ .+***********######
// ########****************************+++++++++....... ++***********######
// ###########*******************************++++++...... ..++**********#######
// ###############*******************************+++++.........++++*********########
// ####################****************************++++++++++++++**********#########
// ##########################*************************+++++++++***********##########
// ################################**************************************###########
// ####################################********************************#############
// ########################################***************************##############
// ###########################################**********************################
// #############################################*****************###################
// ################################################***********######################
// Β· burning ship Β·
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment