рдЖрдЬ рд╣рдо рд▓реВрд▓рд░ рдирд╛рдордХ рдЬреВрд▓рд┐рдпрд╛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдкреИрдХреЗрдЬ рджреЗрдЦреЗрдВрдЧреЗред рдпрд╣ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддреВрдлрд╛рди рдХреЗ рд╕рд╛рде рддрд╛рд░реНрдХрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред
рдЪреЗрддрд╛рд╡рдиреА! рд╕рд╛рдЗрдХреЗрдбреЗрд▓рд┐рдХ рдЕрдВрдбреЛрдВ рдФрд░ рдЪрд╛рд░-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ 8.5 рдПрдордмреА рдХреЗ рд╣рд▓реНрдХреЗ рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдЬреАрдЖрдИрдПрдл рдХреЗ рддрд╣рдд, рдЬрд┐рд╕рдХреЗ рджреЗрдЦрдиреЗ рд╕реЗ рдорди рдХреЗ рд╣рд▓реНрдХреЗ рдмрд╛рджрд▓ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ!
рд╕реНрдерд╛рдкрдирд╛
https://julialang.org - рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рд╡рд┐рддрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдлрд┐рд░, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрдорд╛рдВрдб рдХреЛ рдЙрд╕рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
using Pkg Pkg.add("Colors") Pkg.add("ColorSchemes") Pkg.add("Luxor")
рдпрд╣ рд░рдВрдЧ рдФрд░ рд▓рдХреНрд╕рд░ рдХреЗ рд╕рд╛рде рдЙрдиреНрдирдд рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред
рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдореЗрдВ рджреЛрдиреЛрдВ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреА рд╣реИрдВ, рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдирдП рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдХрдИ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреА рддрд░рд╣, рд▓рдХреНрд╕рд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЬреВрд▓рд┐рдпрд╛-рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдЧреЛрд▓реЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, ImageMagick.jl рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рд╣реЗрдЬрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореВрд▓ рдкреГрд╖реНрда рдкрд░ рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ рдЧрдпрд╛ - рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд╣ рд╕рд╛рдЗрд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ рджреЛ рд╡рд┐рдВрдбреЛрдЬ 7 рдкрд░ рдХрд╛рд╣рд┐рд░рд╛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЙрдареАред рдореИрдВ рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдЫрд┐рдкрд╛рдКрдВрдЧрд╛:
рдПрдХ рдирд░реНрддрдХреА рдХреЗ рд╕рд╛рде рдиреГрддреНрдп- рд╣рдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ
]add Gtk
- рдЧреБрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ - рдЗрд╕рдХреЗ рдмрд╛рдж, gtk + -bundle_3.6.4-20130513_win64 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
- рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди, рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдЗрдЯрдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди gtk рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ , рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрдкрдиреА рдорд╢реАрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ - рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ C: \ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ User.julia \ package рдореЗрдВ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ WinRPM \ Y9QdZ \ deps \ usr \ x86_64-w64-mingw32 \ sys-root \ mingw (рдЖрдкрдХрд╛ рдкрде рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
- рднрд╛рдЧреЛ рдЬреВрд▓рд┐рдпрд╛ рдФрд░ рдбреНрд░рд╛рдЗрд╡
]build Gtk
рдФрд░ ]build Gtk
using Gtk
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдФрд░, рдирд┐рд╖реНрдард╛ рдХреЗ рд▓рд┐рдП, Luxor рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг: ]build Luxor
- рд╣рдо рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
using Luxor
рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдкрдирд╛ рдорд╛рдорд▓рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ
рдЕрдЧрд░ рдЖрдк рдПрдиреАрдореЗрд╢рди рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рд▓рдХреНрд╕рд░ рдкреИрдХреЗрдЬ ffmpeg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдореМрдЬреВрдж рд╣реЛред ffmpeg рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдУрдкрди-рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ ( рд╣рдм рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рднреНрд░рдордг рд╣реИ)ред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рдкрд╛рде рдореЗрдВ рдХреНрд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
рдХрдВрдкреНрдпреВрдЯрд░ / рд╕рд┐рд╕реНрдЯрдо рдЧреБрдг / рдЙрдиреНрдирдд рд╕рд┐рд╕реНрдЯрдо рдкреИрд░рд╛рдореАрдЯрд░ / рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ / рдкрде (рдмрдирд╛рдПрдБ рдирд╣реАрдВ рддреЛ) рдФрд░ рдЕрдкрдиреЗ ffmpeg.exe рдкрд░ рдкрде рдЬреЛрдбрд╝реЗрдВ
рдЙрджрд╛рд╣рд░рдг C: \ Program Files \ ffmpeg-4.1.3-win64-static \ bin
рдпрджрд┐ рдкрде рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рди рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВред
рдЕрдм рдпрджрд┐ рдЖрдк рдХрдорд╛рдВрдб рдХрдВрд╕реЛрд▓ ( cmd ) рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде ffmpeg
рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдЬреВрд▓рд┐рдпрд╛ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред
рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛
рдЪрд▓реЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЧрдбреНрдвреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдЬрдм рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИред рдпрд╣реА рд╣реИ, рдЬрдм REPL рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬреВрд▓рд┐рдпрд╛ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрдк рдЬреБрдкрд┐рдЯрд░ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрд┐рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдиреЛрдЯрдмреБрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЬрдорд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрд▓рдЧ рдЬрдЧрд╣ рдореЗрдВ рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рдЖрджрдд рд╣реЛрдЧреА:
using Luxor cd("C:\\Users\\User\\Desktop\\mycop")
рдкрд╣рд▓реА рдбреНрд░рд╛рдЗрдВрдЧ рдмрдирд╛рдПрдВ
Drawing(220, 220, "hw.png") origin() background("white") sethue("black") text("Hello world") circle(Point(0, 0), 100, :stroke) finish() preview()

Drawing()
рдкреАрдПрдирдЬреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рдмрдирд╛рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо 'рд▓рдХреНрд╕рд░-рдбреНрд░рд╛рдЗрдВрдЧ.рдкрд┐рдВрдЧ' рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХрд╛рд░ 800x800 рд╣реИ, рд╕рднреА рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдкреАрдПрдирдЬреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЖрдк рдЧреИрд░-рдкреВрд░реНрдгрд╛рдВрдХ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдкреЗрдкрд░ рдЖрдХрд╛рд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ("рдП 0) "," рдП 1 "," рдП 2 "," рдП 3 "," рдП 4 "...)
finish()
- рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ preview()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рд╣рд░реА рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЬреНрдпреВрдкрд┐рдЯрд░ (IJulia) рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдиреЛрдЯрдкреИрдб рдореЗрдВ PNG рдпрд╛ SVG рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЬреВрдиреЛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдкреИрдирд▓ рдореЗрдВ PNG рдпрд╛ SVG рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЗрдВ, рдЖрдкрдХреЗ рдУрдПрд╕ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдХрд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@png begin text("Hello world") circle(Point(0, 0), 100, :stroke) end
рд╡реЗрдХреНрдЯрд░ рдлреЙрд░реНрдореЗрдЯ рдХреЗ рд▓рд┐рдП EPS, SVG, PDF, рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдЕрдВрдбрд╛

рдпрд╣ рдПрдХ рдЕрдВрдбрд╛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдЯрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЯреЗрдВрдЧрд░рдо рдмрд╛рд╣рд░ рдЖ рдЬрд╛рдПрдЧрд╛

рдЪрд▓реЛ рд╕рд░реНрдХрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
@png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) end 200 200 "egg0"

рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: setdash("dot")
- рдбреЙрдЯреНрд╕, sethue("gray30")
рд╕рд╛рде рдбреНрд░рд╛ рдХрд░реЗрдВ - рд▓рд╛рдЗрди рдХрд╛ рд░рдВрдЧ: рдЫреЛрдЯрд╛, рдЧрд╣рд░рд╛, 100 sethue("gray30")
рдХреЗ рдХрд░реАрдмред рдмрд┐рдВрджреБ рд╡рд░реНрдЧ рд╣рдорд╛рд░реЗ рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдХреЗрдВрджреНрд░ (0,0) рдХреЛ O
рдЕрдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ O
рджреЛ рдордВрдбрд▓рд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВ:
@png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) label("A", :NW, A) label("O", :N, O) label("B", :NE, B) circle.([A, O, B], 2, :fill) circle.([A, B], 2radius, :stroke) end 600 400 "egg2"

рдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБрдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ intersectionlinecircle()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд┐рдВрджреБ рдпрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд░реЗрдЦрд╛ рд╕рд░реНрдХрд▓ рдХреЛ рдХрд╛рдЯрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕рд░реНрдХрд▓ O рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреАрдВрдЪреА рдЧрдИ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд░реЗрдЦрд╛ рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИред рд╕рдорд░реВрдкрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдХреЗрд╡рд▓ рд╕рд░реНрдХрд▓ A рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) label("A", :NW, A) label("O", :N, O) label("B", :NE, B) circle.([A, O, B], 2, :fill) circle.([A, B], 2radius, :stroke)

рдКрдкрд░реА рд╕рд░реНрдХрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЪреМрд░рд╛рд╣реЗ рдХреЛ OD рдкрд╛рддреЗ рд╣реИрдВ
рдХреЛрдб @png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) label("A", :NW, A) label("O", :N, O) label("B", :NE, B) circle.([A, O, B], 2, :fill) circle.([A, B], 2radius, :stroke)

рдЕрдзреАрдирд╕реНрде рд╕рд░реНрдХрд▓ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рджреЛ рдмрдбрд╝реЗ рд╕рд░реНрдХрд▓ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
рдХреЛрдб @png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) label("A", :NW, A) label("O", :N, O) label("B", :NE, B) circle.([A, O, B], 2, :fill) circle.([A, B], 2radius, :stroke)

рдЕрдВрдбрд╛ рддреИрдпрд╛рд░ рд╣реИ! рдпрд╣ рдЖрд░реНрдХ 2 arc2r()
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪрд╛рд░ рдЖрд░реНрдХ рд╕реЗ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
рдХреЛрдб @png begin radius=80 setdash("dot") sethue("gray30") A, B = [Point(x, 0) for x in [-radius, radius]] line(A, B, :stroke) circle(O, radius, :stroke) label("A", :NW, A) label("O", :N, O) label("B", :NE, B) circle.([A, O, B], 2, :fill) circle.([A, B], 2radius, :stroke)

рдФрд░ рдЕрдм, рдареАрдХ рд╕реЗ рд▓рд┐рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдПрдВрдЧреЗ
рд╕рдорд╛рд░реЛрд╣ function egg(radius, action=:none) A, B = [Point(x, 0) for x in [-radius, radius]] nints, C, D = intersectionlinecircle(Point(0, -2radius), Point(0, 2radius), A, 2radius) flag, C1 = intersectionlinecircle(C, D, O, radius) nints, I3, I4 = intersectionlinecircle(A, C1, A, 2radius) nints, I1, I2 = intersectionlinecircle(B, C1, B, 2radius) if distance(C1, I1) < distance(C1, I2) ip1 = I1 else ip1 = I2 end if distance(C1, I3) < distance(C1, I4) ip2 = I3 else ip2 = I4 end newpath() arc2r(B, A, ip1, :path) arc2r(C1, ip1, ip2, :path) arc2r(A, ip2, B, :path) arc2r(O, B, A, :path) closepath() do_action(action) end
рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░рдВрдЧреЛрдВ, рдкрд░рдд рдкреЗрдВрдЯрд┐рдВрдЧ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
@png begin setopacity(0.7) for ╬╕ in range(0, step=╧А/6, length=12) @layer begin rotate(╬╕) translate(100, 50)


рд╕реНрдЯреНрд░реЛрдХ рдФрд░ рдлрд┐рд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдЕрдВрдбреЗ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рдФрд░ рдЫрд╡рд┐) рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВред рдЕрдВрдбрд╛ () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рд░рдЪрдирд╛ рдХреЛ рдмрд╣реБрднреБрдЬ (рдЕрдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА) рдореЗрдВ рдмрджрд▓рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рдирд┐рдореНрди рдХреЛрдб рдПрдХ рдЕрдВрдбрд╛рдгреБ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдмрд╣реБрднреБрдЬ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдмрд╣реБрднреБрдЬ рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдХреЛ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
@png begin egg(160, :path) pgon = first(pathtopoly()) pc = polycentroid(pgon) circle(pc, 5, :fill) for pt in 1:2:length(pgon) pgon[pt] = between(pc, pgon[pt], 0.5) end poly(pgon, :stroke) end 350 500 "polyegg"

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрд┐рдВрджреБ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣рд╛рдВ рдЖрдВрддрд░рд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХреА рдЕрд╕рдорд╛рди рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЬреНрдпрд╛рдорд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ, setlinejoin("round")
рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдареАрдХ рд╣реИ, рдЕрдм рдЪрд▓реЛ рдПрдХ рдореМрдЬреВрджрд╛ рдмрд╣реБрднреБрдЬ рдХреЗ рдмрд╛рд╣рд░ рдпрд╛ рдЕрдВрджрд░ рдПрдХ рдмрд╣реБрднреБрдЬ рд╕рдореЛрдЪреНрдЪ рдмрдирд╛рдиреЗ рдХреА offsetpoly()
ред
@png begin egg(80, :path) pgon = first(pathtopoly()) pc = polycentroid(pgon) for pt in 1:2:length(pgon) pgon[pt] = between(pc, pgon[pt], 0.9) end for i in 30:-3:-8 randomhue() op = offsetpoly(pgon, i) poly(op, :stroke, close=true) end end 350 500 "polyeggs"

рдПрдХ рдмрд╣реБрднреБрдЬ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреА рдирд┐рдпрдорд┐рддрддрд╛ рдореЗрдВ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрди, рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдирдореВрдиреЛрдВ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрд╛рддрд╛рд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдИ рдЬрд╛рддреА рд╣реИред
рдПрдиреАрдореЗрд╢рди
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдлреНрд░реЗрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдВрдбреЗ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
рдХреЛрдб using Colors demo = Movie(400, 400, "test") function backdrop(scene, framenumber) background("black") end function frame(scene, framenumber) setopacity(0.7) ╬╕ = framenumber * ╧А/6 @layer begin rotate(╬╕) translate(100, 50) egg(50, :path) setline(10) randomhue() fillpreserve() randomhue() strokepath() end end
рдПрдирд┐рдореЗрд╢рди рдХреЛ рд╕рд╛рдзрд╛рд░рдг рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
animate(demo, [ Scene(demo, backdrop, 0:12), Scene(demo, frame, 0:12, easingfunction=easeinoutcubic, optarg="made with Julia") ], framerate=10, tempdirectory="C:\\Users\\User\\Desktop\\mycop", creategif=true)
рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ ffmpeg рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ
run(`ffmpeg -f image2 -i $(tempdirectory)/%10d.png -vf palettegen -y $(seq.stitle)-palette.png`) run(`ffmpeg -framerate 30 -f image2 -i $(tempdirectory)/%10d.png -i $(seq.stitle)-palette.png -lavfi paletteuse -y /tmp/$(seq.stitle).gif`)
рдЕрд░реНрдерд╛рддреН, рдЪрд┐рддреНрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рдлрд╝реНрд░реЗрдореЛрдВ рд╕реЗ рдПрдХ рдЬреАрдЖрдИрдПрдл рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

Pentahor
рд╡рд╣ рдПрдХ рдкрд╛рдБрдЪ рдХреЛрд░ рд╣реИ - рд╕рд╣реА рдЪрд╛рд░ рдЖрдпрд╛рдореА рд╕рд┐рдВрдкреНрд▓реЗрдХреНрд╕ред рджреЛ-рдЖрдпрд╛рдореА рдЫрд╡рд┐рдпреЛрдВ рдкрд░ 4-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдХрдХреНрд╖рд╛ 4-рдЖрдпрд╛рдореА рдмрд┐рдВрджреБ struct Point4D <: AbstractArray{Float64, 1} x::Float64 y::Float64 z::Float64 w::Float64 end Point4D(a::Array{Float64, 1}) = Point4D(a...) Base.size(pt::Point4D) = (4, ) Base.getindex(pt::Point4D, i) = [pt.x, pt.y, pt.z, pt.w][i] struct Point3D <: AbstractArray{Float64, 1} x::Float64 y::Float64 z::Float64 end Base.size(pt::Point3D) = (3, )
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдИ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ AbstractArray рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ )
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдХрд┐ 4 рдбреА рдмрд┐рдВрджреБ рдХреЛ 2 рдбреА рдмрд┐рдВрджреБ рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: 3 рдбреА рдмрд┐рдВрджреБ рдХреЛ 2 рдбреА рдмрд┐рдВрджреБ рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреНред рд╣рдо рд╕рдорддрд▓ рд╕рддрд╣ рдкрд░ 3D рдЖрдХреГрддрд┐ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреА рд╕рддрд╣реЛрдВ рдореЗрдВ рд╕рдорд╛рди X рдФрд░ Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрдирдХреЗ Z рдорд╛рдиреЛрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдб @png begin fontface("Menlo") fontsize(8) setblend(blend( boxtopcenter(BoundingBox()), boxmiddlecenter(BoundingBox()), "skyblue", "white")) box(boxtopleft(BoundingBox()), boxmiddleright(BoundingBox()), :fill) setblend(blend( boxmiddlecenter(BoundingBox()), boxbottomcenter(BoundingBox()), "grey95", "grey45" )) box(boxmiddleleft(BoundingBox()), boxbottomright(BoundingBox()), :fill) sethue("black") setline(2) bx1 = box(O, 250, 250, vertices=true) poly(bx1, :stroke, close=true) label.(["-1 1 1", "-1 -1 1", "1 -1 1", "1 1 1"], slope.(O, bx1), bx1) setline(1) bx2 = box(O, 150, 150, vertices=true) poly(bx2, :stroke, close=true) label.(["-1 1 0", "-1 -1 0", "1 -1 0", "1 1 0"], slope.(O, bx2), bx2, offset=-45) map((x, y) -> line(x, y, :stroke), bx1, bx2) end 400 400 "cube.png"

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдПрдХ рдШрди рдХреЛ 3 рдбреА рд╕реЗ 2 рдбреА рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдкрд╣рд▓реЗ рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рддреАрд╕рд░реЗ рдореВрд▓реНрдп рд╕реЗ рдЧреБрдгрд╛ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ const K = 4.0 function convert(Point, pt3::Point3D) k = 1/(K - pt3.z) return Point(pt3.x * k, pt3.y * k) end @png begin cube = Point3D[ Point3D(-1, -1, 1), Point3D(-1, 1, 1), Point3D( 1, -1, 1), Point3D( 1, 1, 1), Point3D(-1, -1, -1), Point3D(-1, 1, -1), Point3D( 1, -1, -1), Point3D( 1, 1, -1), ] circle.(convert.(Point, cube) * 300, 5, :fill) end 220 220 "points"

рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЪрд▓реЛ 4D рдЕрдВрдХ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЪрд╛рд░-рдЖрдпрд╛рдореА рдмрд┐рдВрджреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рджреЛ-рдЖрдпрд╛рдореА рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рджреЛ рдмрд╛рд░ рдореИрдк рдХрд░рддрд╛ рд╣реИред
function convert(Point3D, pt4::Point4D) k = 1/(K - pt4.w) return Point3D(pt4.x * k, pt4.y * k, pt4.z * k) end function flatten(shape4) return map(pt3 -> convert(Point, pt3), map(pt4 -> convert(Point3D, pt4), shape4)) end
рдЕрдЧрд▓рд╛, рдХреЛрдиреЗ рдФрд░ рдЪреЗрд╣рд░реЗ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рд░рдВрдЧ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
Tyk! const n = -1/тИЪ5 const pentachoron = [Point4D(vertex...) for vertex in [ [ 1.0, 1.0, 1.0, n], [ 1.0, -1.0, -1.0, n], [-1.0, 1.0, -1.0, n], [-1.0, -1.0, 1.0, n], [ 0.0, 0.0, 0.0, n + тИЪ5]]]; const pentachoronfaces = [ [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]]; @png begin setopacity(0.2) pentachoron2D = flatten(pentachoron) for (n, face) in enumerate(pentachoronfaces) randomhue() poly(1500 * pentachoron2D[face], :fillpreserve, close=true) sethue("black") strokepath() end end 300 250 "5ceil"

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдорд╢реАрди рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдЧрдгрд┐рддреАрдп рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рднреА рдУрдкрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рдШреВрдордирд╛, рдУрдкрдирдЧреНрд▓рд╛рд╕ рдореЗрдВ рдЪрд╛рдпрджрд╛рдиреА рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдирд╛ - рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рддрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╡рд┐рдорд╛рди рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЧреЗ, рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЕрдзрд┐рдХ рдЙрдард╛рдУ function XY(╬╕) [cos(╬╕) -sin(╬╕) 0 0; sin(╬╕) cos(╬╕) 0 0; 0 0 1 0; 0 0 0 1] end function XW(╬╕) [cos(╬╕) 0 0 -sin(╬╕); 0 1 0 0; 0 0 1 0; sin(╬╕) 0 0 cos(╬╕)] end function XZ(╬╕) [cos(╬╕) 0 -sin(╬╕) 0; 0 1 0 0; sin(╬╕) 0 cos(╬╕) 0; 0 0 0 1] end function YZ(╬╕) [1 0 0 0; 0 cos(╬╕) -sin(╬╕) 0; 0 sin(╬╕) cos(╬╕) 0; 0 0 0 1] end function YW(╬╕) [1 0 0 0; 0 cos(╬╕) 0 -sin(╬╕); 0 0 1 0; 0 sin(╬╕) 0 cos(╬╕)] end function ZW(╬╕) [1 0 0 0; 0 1 0 0; 0 0 cos(╬╕) -sin(╬╕); 0 0 sin(╬╕) cos(╬╕)]; end function rotate4(A, matrixfunction) return map(A) do pt4 Point4D(matrixfunction * pt4) end end
рдЖрдорддреМрд░ рдкрд░ рдЖрдк рдПрдХ рдЖрдпрд╛рдореА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рд╕рдорддрд▓ рдкрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВред 3 рдбреА рдЕрдВрдХ рдПрдХ 2 рдбреА рд▓рд╛рдЗрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдВ (рдЕрдХреНрд╕рд░ рдпрд╣ рдПрдХреНрд╕рд╡рд╛рдИрдЬреЗрдб рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ 3 рдбреА рд╡рд┐рдорд╛рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ 4D рдЕрдВрдХ рдШреВрдорддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЙрди рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ рдЬреЛ рджреЛ рдЕрдХреНрд╖реЛрдВ X, Y, Z рдФрд░ W рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд╛рд░-рдЖрдпрд╛рдореА рдШреБрдорд╛рд╡ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред XY рд╡рд┐рдорд╛рди рдЖрдорддреМрд░ рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рд╕рддрд╣ рдХрд╛ рд╡рд┐рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк XY рдкреНрд▓реЗрди рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ XZ рдкреНрд▓реЗрди рдЖрдкрдХреА рдЯреЗрдмрд▓ рдпрд╛ рдлрд░реНрд╢ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реИ, рдФрд░ YZ рдкреНрд▓реЗрди рдЖрдкрдХреА рдЯреЗрдмрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рджрд╛рдИрдВ рдпрд╛ рдмрд╛рдИрдВ рдУрд░ рдХреА рджреАрд╡рд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди XW, YW рдФрд░ ZW рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣ рдЪрд╛рд░-рдЖрдпрд╛рдореА рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рд░рд╣рд╕реНрдп рд╣реИ: рд╣рдо рдЗрди рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦ рдХрд░ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд░реВрдк рдЙрдирдХреЗ рдФрд░ рдЙрдирдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдлрд╝реНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рд╕реАрд╡реЗ рдХрд░рддреЗ рд╣реИрдВ:
рд╕реНрдкреЙрдЗрд▓рд░ using ColorSchemes function frame(scene, framenumber, scalefactor=1000) background("white")

рдЦреИрд░, рдФрд░ рджреВрд╕рд░рд╛ рдХреЛрдг:
рдХреЛрдб function frame(scene, framenumber, scalefactor=1000) background("antiquewhite") setlinejoin("bevel") setline(1.0) setopacity(0.2) eased_n = scene.easingfunction(framenumber, 0, 1, scene.framerange.stop) pentachoron2D = flatten( rotate4( pentachoron, XZ(eased_n * 2╧А) * YW(eased_n * 2╧А))) for (n, face) in enumerate(pentachoronfaces) sethue(get(ColorSchemes.diverging_rainbow_bgymr_45_85_c67_n256, n/length(pentachoronfaces))) poly(scalefactor * pentachoron2D[face], :fillpreserve, close=true) sethue("black") strokepath() end end makemovie(500, 500, "pentachoron-xz-yw.gif", scalefactor=2000)

рдПрдХ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЪрд╛рд░-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБ, рдЯреЗрд╕рд░реИрдХреНрдЯ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ , рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╣реИред
рдЯреЙрдк рдФрд░ рдЪреЗрд╣рд░реЗ const tesseract = [Point4D(vertex...) for vertex in [ [-1, -1, -1, 1], [ 1, -1, -1, 1], [ 1, 1, -1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [ 1, -1, 1, 1], [ 1, 1, 1, 1], [-1, 1, 1, 1], [-1, -1, -1, -1], [ 1, -1, -1, -1], [ 1, 1, -1, -1], [-1, 1, -1, -1], [-1, -1, 1, -1], [ 1, -1, 1, -1], [ 1, 1, 1, -1], [-1, 1, 1, -1]]] const tesseractfaces = [ [1, 2, 3, 4], [1, 2, 10, 9], [1, 4, 8, 5], [1, 5, 6, 2], [1, 9, 12, 4], [2, 3, 11, 10], [2, 3, 7, 6], [3, 4, 8, 7], [5, 6, 14, 13], [5, 6, 7, 8], [5, 8, 16, 13], [6, 7, 15, 14], [7, 8, 16, 15], [9, 10, 11, 12], [9, 10, 14, 13], [9, 13, 16, 12], [10, 11, 15, 14], [13, 14, 15, 16]];
рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдПрдВ function frame(scene, framenumber, scalefactor=1000) background("black") setlinejoin("bevel") setline(10.0) setopacity(0.7) eased_n = scene.easingfunction(framenumber, 0, 1, scene.framerange.stop) tesseract2D = flatten( rotate4( tesseract, XZ(eased_n * 2╧А) * YW(eased_n * 2╧А))) for (n, face) in enumerate(tesseractfaces) sethue([Luxor.lighter_blue, Luxor.lighter_green, Luxor.lighter_purple, Luxor.lighter_red][mod1(n, 4)]...) poly(scalefactor * tesseract2D[face], :fillpreserve, close=true) sethue([Luxor.darker_blue, Luxor.darker_green, Luxor.darker_purple, Luxor.darker_red][mod1(n, 4)]...) strokepath() end end makemovie(500, 500, "tesseract-xz-yw.gif", scalefactor=1000)

рд╣реЛрдорд╡рд░реНрдХ: рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╢реАрд░реНрд╖ рд╕рдВрдЦреНрдпрд╛ ( рдХреНрд░рдорд╢рдГ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди ) рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рд╕рднреА рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛; рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдирдпрд╛ "рд╡рд╛рд╣!" рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреГрд╖реНрда рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЦреИрд░, рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЪреЗрд╣рд░реЗ рдФрд░ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн
