рдЙрджреНрдШрд╛рдЯрди рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C # рдФрд░ F # рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдкрдардиреАрдп рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдПрдл # рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдПрдл # рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмреЗ рдкрд░ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд▓рд┐рдЦреЗ рдЧрдП рдереЗ - рдЗрд╕рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕, рдЙрддреНрдкрддреНрддрд┐, рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рдореИрдВ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реАрдзреЗ рдореБрджреНрджреЗ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рддреЛ, рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдореИрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг;
- рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рджреГрд╢реНрдп;
- рд╕реА # рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдФрд░ рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рдеред
рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред
рдордВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдПрдл # рднрд╛рд╖рд╛ рдореЗрдВ рдореИрдВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмреЗ рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдВрдЧреЗ рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдордВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рд╕реА
рдПрди + 1 = рд╕реА
рдПрди 2 + рд╕реА
режрдпрджрд┐ рдРрд╕рд╛ рдХреНрд░рдо рджреЛ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ C
1 (1, 1i) рдФрд░ C
2 (-1, -1i) рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ c
0 Mandelbrot рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рдРрд╕реА рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ c
0 рдХрд╛ рд╕реЗрдЯ рд╣реИ, рдЬреЛ рдКрдкрд░ рдорд╛рдирд╛ рдЧрдпрд╛ рдХреНрд░рдо C
1 рдФрд░ C
2 рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд░рд╣рддрд╛ рд╣реИред
рдореИрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рдФрд░ рдПрдл #
F # рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Microsoft.FSharp.Math рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдмрджрд▓реЗ
рдореЗрдВ, FsharpPowerPack рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ (рд▓рд┐рдВрдХ рднреА рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
open Microsoft.FSharp.Math
рдЕрдм рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
let cMax = complex 1.0 1.0 let cMin = complex -1.0 -1.0
рд╣рдо рд╕реАрдзреЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо рд╕реЗрдЯ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
let rec isInMandelbrotSet (z, c, iter, count) = if (cMin < z) && (z < cMax) && (count < iter) then isInMandelbrotSet ( ((z * z) + c), c, iter, (count + 1) ) else count
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп
isInMandelbrotSet
рддрдм рддрдХ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдВрдЦреНрдпрд╛ cMax рдФрд░ cMin рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛред рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо "рд╕реЗрдЯ" рдХреЛ "рд░рдВрдЧ" рджреЗрдВрдЧреЗ)ред
рдкрд░рд┐рдгрд╛рдо рджреГрд╢реНрдп
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдорд╣рд╛рди рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕реЗ рдорд╕реНрддреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдЪреВрдВрдХрд┐ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЛ-рдЖрдпрд╛рдореА рд╡рд┐рдорд╛рди рдкрд░ рдЕрдкрдирд╛ рдкреНрд░рджрд░реНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ C
1 (1, 1i) рдФрд░ C
2 (-1, -1i) рдХреЗ рдмреАрдЪ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд┐рд╕ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдХреЗрдВрджреНрд░ (0, 0) рдкрд░ рд╣реЛрдЧрд╛, рдПрдмреНрд╕рд┐рд╕реНрд╕рд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ -1.0 рдФрд░ 1.0 рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЬрдЯрд┐рд▓ рд╡рд┐рдорд╛рди рд╕реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
let scalingFactor s = s * 1.0 / 200.0 let mapPlane (x, y, s, mx, my) = let fx = ((float x) * scalingFactor s) + mx let fy = ((float y) * scalingFactor s) + my complex fx fy
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди "рдкрд░рд┐рдЪрд┐рдд" рд╡рд┐рдорд╛рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЕрдкрдиреА рдЫрд╡рд┐ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдордПрдХреНрд╕ рдФрд░ рдореЗрд░реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╡рд┐рдорд╛рди рдкрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд┐рдорд╛рди рдХреЗ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде "рдЪрд▓рдирд╛" рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рд╕рдВрдмрдВрдзрд┐рдд рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛) рдореИрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд╛рд▓рд╛ рдХрд░ рджреЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рдореЗрдВ рд░рдВрдЧ рджреЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ "рд░рдВрдЧ" рдлрд╝рдВрдХреНрд╢рди рдХрд░реЗрдВрдЧреЗ:
let colorize c = let r = (4 * c) % 255 let g = (6 * c) % 255 let b = (8 * c) % 255 Color.FromArgb(r,g,b)
рдлрд╝рдВрдХреНрд╢рди isInMandelbrotSet рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдЧрд╛ рдФрд░ рд░рдВрдЧ рдХрд╛ RGB рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЧреБрдгрд╛рдВрдХ рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдВрдЧреЛрдВ рдХреЗ рдПрдХ рдЪрд┐рдХрдиреА рд╕рдВрдХреНрд░рдордг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рд╣рдореЗрдВ System.Drawing рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
open System.Drawing
рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдирдИ рдмрд┐рдЯрдореИрдк рдЫрд╡рд┐ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рдВрдЧ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рддреЛ, рд╣рдорд╛рд░рд╛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
let createImage (s, mx, my, iter) = let image = new Bitmap(400, 400) for x = 0 to image.Width - 1 do for y = 0 to image.Height - 1 do let count = isInMandelbrotSet( Complex.Zero, (mapPlane (x, y, s, mx, my)), iter, 0) if count = iter then image.SetPixel(x,y, Color.Black) else image.SetPixel(x,y, colorize( count ) ) let temp = new Form() in temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)) temp
рдпрд╣рд╛рдБ рд╣рдо System.Windows.Forms рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
open System.Windows.Forms
рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
do Application.Run(createImage (1.5, -1.5, -1.5, 20))
рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╕реНрдХреЗрд▓, рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдореЗрдВ рдСрдлрд╕реЗрдЯ, рд╕рд╛рде рд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрдЧреА, рд╣рдорд╛рд░реА рдЫрд╡рд┐ рдЙрддрдиреА рд╣реА рд╡рд┐рд╕реНрддреГрдд рд╣реЛрдЧреА (рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛)ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рд┐рдП:
рддреЛ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкреВрд░реА рд╕реВрдЪреА:
#light open Microsoft.FSharp.Math open System open System.Drawing open System.Windows.Forms let cMax = complex 1.0 1.0 let cMin = complex -1.0 -1.0 let rec isInMandelbrotSet (z, c, iter, count) = if (cMin < z) && (z < cMax) && (count < iter) then isInMandelbrotSet ( ((z * z) + c), c, iter, (count + 1) ) else count let scalingFactor s = s * 1.0 / 200.0 let offsetX = -1.0 let offsetY = -1.0 let mapPlane (x, y, s, mx, my) = let fx = ((float x) * scalingFactor s) + mx let fy = ((float y) * scalingFactor s) + my complex fx fy let colorize c = let r = (4 * c) % 255 let g = (6 * c) % 255 let b = (8 * c) % 255 Color.FromArgb(r,g,b) let createImage (s, mx, my, iter) = let image = new Bitmap(400, 400) for x = 0 to image.Width - 1 do for y = 0 to image.Height - 1 do let count = isInMandelbrotSet( Complex.Zero, (mapPlane (x, y, s, mx, my)), iter, 0) if count = iter then image.SetPixel(x,y, Color.Black) else image.SetPixel(x,y, colorize( count ) ) let temp = new Form() in temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)) temp do Application.Run(createImage (1.5, -1.5, -1.5, 20))
рдЙрдк-рдпреЛрдЧреЛрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ "рд░рдВрдЧ" рдореЗрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 40 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдФрд░ рдЗрддрдирд╛ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрдЧреНрди рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЖрдирдВрдж рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдЫрд╡рд┐ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ)ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ - рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдЫрд╡рд┐ рдХреЛ рдмрдврд╝рд╛рдирд╛ / рдШрдЯрд╛рдирд╛, рдЕрдзрд┐рдорд╛рдирддрдГ рд╡рд┐рд╡рд░рдг рдмрджрд▓рдирд╛ред
рдмреЗрд╢рдХ, рдЖрдк F # рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ System.Windows.Forms рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдлреЙрд░реНрдо рдмрдирд╛рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдВрдбреЛрдЬ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк (рдФрд░, рд╢рд╛рдпрдж, рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ) рд╣реЛрдЧрд╛! рдареАрдХ рд╣реИ, рддреЛ рдЪрд▓реЛ рдЕрдм рдХрд░рддреЗ рд╣реИрдВред
рд╕реА # рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдФрд░ рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде
рдПрдл # рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП, F # рдХреЛрдб рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЬреЛрдбрд╝реЗрдВ
module Fractal
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЕрдм рдлреЙрд░реНрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рднреАред рдЗрд╕рд▓рд┐рдП, рдЕрдм рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рдо рдмрд╛рд╣рд░ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
let createImage (s, mx, my, iter) = let image = new Bitmap(400, 400) for x = 0 to image.Width - 1 do for y = 0 to image.Height - 1 do let count = isInMandelbrotSet( Complex.Zero, (mapPlane (x, y, s, mx, my)), iter, 0) if count = iter then image.SetPixel(x,y, Color.Black) else image.SetPixel(x,y, colorize( count ) ) image
рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди createImage рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдмрд┐рдЯрдореИрдк рдЫрд╡рд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдбрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдореЗрдВ рдПрдл # рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдмрд╕ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп)ред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рдзрд╛рди рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп (
module Fractal
) рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛, рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреЛ рд╕рдорд╛рдкреНрдд рдЫрд╡рд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
Bitmap image = Fractal.createImage(1.5, -1.5, -1.5, 20);
рдкрд░рд┐рдгрд╛рдореА рдмрд┐рдЯрдореИрдк рдЫрд╡рд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд┐рдХреНрдЪрд░рдмреЙрдХреНрд╕ рддрддреНрд╡ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рддрддреНрд╡ рдЬреЛрдбрд╝рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг "рдЕрдиреБрд░реЛрдз" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкреИрдорд╛рдиреЗ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЪрд┐рддреНрд░ рдмреЙрдХреНрд╕ рдХреЛ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд╣рдо 6 рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВрдЧреЗ: рдЬрд╝реВрдо рдЗрди / рдЬрд╝реВрдо рдЖрдЙрдЯ, рдКрдкрд░ / рдиреАрдЪреЗ, рдмрд╛рдПрдВ / рджрд╛рдПрдВред
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдлреНрд░реИрдХреНрдЯрд▓рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рднрдЧреНрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛: рдкреИрдорд╛рдиреЗ, рдХреЗрдВрджреНрд░ рд╕реЗ рдСрдлрд╕реЗрдЯ, рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрддрд░ред рдХрдХреНрд╖рд╛ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХреА рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛ред
private Bitmap Draw() { int iters = iterations + 2 * steps; return Fractal.createImage(currSc, currMvX, currMvY, iters); }
рдХрдХреНрд╖рд╛ рдХреА рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпрд╛рдВ рднрдЧреНрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреА рдФрд░ рдбреНрд░рд╛ () рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдВрдЧреАред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдиреНрдирд┐рдХрдЯрди рд╡рд┐рдзрд┐ рд▓рдЧ рд╕рдХрддреА рд╣реИ:
public Bitmap ZoomIn() { scale = 0.9 * scale; zoomSteps++; return Draw(); }
рдпрд╣ рдХреЗрд╡рд▓ FractalClass рд╡рд░реНрдЧ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдПред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЖрдкрдХреЛ рдлреНрд░реИрдХреНрдЯрд▓ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд╕рд╛рде, рдЫрд╡рд┐ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддреА рд╣реИ:
рд╕рд┐рд░реНрдл рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдирд╣реАрдВ
рдЙрд╕реА рддрд░рд╣ рдЬрд┐рд╕ рддрд░рд╣ рд╣рдордиреЗ рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдореНрд╕ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдХрдиреЗрдХреНрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╣ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рд╣реЛ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдХреБрдЫ рдФрд░ред
рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА:рдЖрдк рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛!
рдкреБрдирд╢реНрдЪ: рдкрд╛рда рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред