/** Ċ Ġ* Ġhttps :// g enu ary 2 0 2 1 . github . io / pro mp ts Ċ Ġ* ĠJan . 1 Ċ Ġ* Ġ// ĠTR IP LE ĠN EST ED ĠLOOP Ċ Ġ* Ċ Ġ* ĠReferences : Ċ Ġ* Ġhttps :// en . wikipedia . org / wiki / S pherical _ coordinate _ system Ċ Ġ*/ Ċ package Ġsketch . test Ċ Ċ import Ġorg . open rnd r . application Ċ import Ġorg . open rnd r . color . Color RGB a Ċ import Ġorg . open rnd r . draw . Buffer Mult is ample Ċ import Ġorg . open rnd r . draw . Transform Target Ċ import Ġorg . open rnd r . draw . is olated With Target Ċ import Ġorg . open rnd r . draw . render Target Ċ import Ġorg . open rnd r . extras . color . presets . ANTI QUE _ WHITE Ċ import Ġorg . open rnd r . extras . color . presets . BLUE _ STE EL Ċ import Ġorg . open rnd r . extras . color . presets . FO REST _ GREEN Ċ import Ġorg . open rnd r . extras . color . presets . OR ANGE _ RED Ċ import Ġorg . open rnd r . math . Matrix 4 4 Ċ import Ġorg . open rnd r . math . Vector 2 Ċ import Ġorg . open rnd r . math . Vector 3 Ċ import Ġorg . open rnd r . math . map Ċ import Ġorg . open rnd r . math . transforms . look At Ċ import Ġorg . open rnd r . math . transforms . project Ċ import Ġorg . open rnd r . math . transforms . scale Ċ import Ġorg . open rnd r . shape . Segment Ċ import Ġutil . timestamp Ċ import Ġjava . io . File Ċ import Ġjava . lang . Math . to Radians Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ Ċ fun Ġmain () Ġ= Ġapplication Ġ{ ĊĠ Ġconfigure Ġ{ ĊĠĠĠ Ġwidth Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġheight Ġ= Ġ 1 0 0 0 ĊĠ Ġ} ĊĊĠ Ġprogram Ġ{ ĊĠĠĠ Ġval Ġscale Ġ= Ġ 3 . 0 ĊĠĠĠ Ġval Ġw Ġ= Ġwidth Ġ* Ġscale ĊĠĠĠ Ġval Ġh Ġ= Ġheight Ġ* Ġscale ĊĠĠĠ Ġval Ġcenter Ġ= ĠVector 2 ( w Ġ/ Ġ 2 . 0 , Ġh Ġ/ Ġ 2 . 0 ) ĊĠĠĠ Ġval Ġprog Name Ġ= Ġthis . name . if Blank Ġ{ Ġthis . window . title . if Blank Ġ{ Ġ" my - amaz ing - drawing " Ġ} Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġis Ġout Ġhi - res Ġrender Ġtarget Ġwhich Ġwe Ġdraw Ġto , Ġbefore Ġscaling Ġit Ġfor Ġthe Ġscreen Ġ" preview " ĊĠĠĠ Ġval Ġrt Ġ= Ġrender Target ( w . toInt (), Ġh . toInt (), Ġmultis ample Ġ= ĠBuffer Mult is ample . Disabled ) Ġ{ Ġ// Ġmultis ample Ġrequires Ġsome Ġweird Ġcopying Ġto Ġanother Ġcolor Ġbuffer ĊĠĠĠĠĠ Ġcolor Buffer () ĊĠĠĠĠĠ Ġdepth Buffer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproject 3 D ( vec : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠ Ġval Ġzoom Ġ= Ġ 1 . 0 ĊĠĠĠĠĠ Ġ// ĠCamera Ġis Ġbasically Ġat Ġthe Ġtop Ġcorner Ġof Ġthe Ġ" unit Ġcube " Ġdefined Ġby Ġthe Ġbounds Ġof Ġthe Ġimage . ĊĠĠĠĠĠ Ġ// Ġassuming , Ġof Ġcourse , Ġthat Ġthe Ġz - axis Ġis Ġas Ġt all Ġas Ġthe Ġaverage Ġof Ġwidth Ġand Ġheight ĊĠĠĠĠĠ Ġval Ġcamera Ġ= ĠVector 3 ( ĊĠĠĠĠĠĠĠ Ġw Ġ* Ġzoom , ĊĠĠĠĠĠĠĠ Ġh Ġ* Ġzoom , ĊĠĠĠĠĠĠĠ Ġ( w Ġ+ Ġh ) Ġ* Ġ 0 . 5 Ġ* Ġzoom ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġprojection Ġ= Ġlook At ( camera , ĠVector 3 . ZERO , Ġup Ġ= ĠVector 3 . UNIT _ Z ) ĊĠĠĠĠĠ Ġreturn Ġproject ( vec , Ġprojection , ĠMatrix 4 4 . scale ( Vector 3 ( 1 . 0 Ġ/ Ġcamera . x , Ġ 1 . 0 Ġ/ Ġcamera . y , Ġ 1 . 0 Ġ/ Ġcamera . z )), Ġwidth , Ġheight ) ĊĊĠĠĠĠĠ Ġ// ĠThis Ġworks Ġperfectly Ġgood ! ĠIt 's Ġjust Ġa Ġdifferent Ġcamera Ġangle . ĊĠĠĠĠĠ Ġ// ĠBasic ally , Ġit Ġis Ġlooking Ġstraight Ġdown Ġalong Ġthe Ġz - axis Ġonto Ġthe Ġx / y Ġplane . ĊĠĠĠĠĠ Ġ// ĠThe Ġbounds Ġof Ġthe Ġprojection Ġare Ġpretty Ġobvious Ġbut Ġbasically Ġx Ġrange Ġis Ġ[ left , right ], Ġand Ġy Ġrange Ġis Ġ[ bottom , top ] ĊĠĠĠĠĠ Ġ// Ġval Ġprojection Ġ= Ġor tho ( left = w *- 0 . 5 , Ġright = w * 0 . 5 , Ġbottom = h *- 0 . 5 , Ġtop = h * 0 . 5 , Ġz Near = 0 . 0 , Ġz Far =( w Ġ+ Ġh ) Ġ* Ġ 0 . 5 ) ĊĠĠĠĠĠ Ġ// Ġreturn Ġproject ( vec , Ġprojection , ĠMatrix 4 4 . IDENTITY , Ġwidth , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġextend Ġ{ ĊĠĠĠĠĠ Ġval Ġsegments Ġ= Ġmutable ListOf < List < Segment >>() ĊĠĠĠĠĠ Ġvar Ġtemp Segments Ġ= Ġmutable ListOf < Segment >() ĊĠĠĠĠĠ Ġval Ġtheta Start Degrees Ġ= Ġ- 1 8 0 ĊĊĠĠĠĠĠ Ġfor Ġ( percent Ġin Ġ 1 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġmap ( 1 . 0 , Ġ 1 0 0 . 0 , Ġ 1 0 0 0 . 0 , Ġ 2 0 0 0 . 0 , Ġpercent . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġphi Ġ= Ġmap ( 1 . 0 , Ġ 1 0 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 Ġ* ĠPI , Ġpercent . toDouble ()) ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= ĠVector 3 ( ĊĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġsin ( to Radians ( theta Start Degrees . toDouble ())) Ġ* Ġcos ( phi ), ĊĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġsin ( to Radians ( theta Start Degrees . toDouble ())) Ġ* Ġsin ( phi ), ĊĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġcos ( to Radians ( theta Start Degrees . toDouble ())) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( theta Degrees Ġin Ġtheta Start Degrees .. ( theta Start Degrees Ġ* Ġ- 1 ) Ġstep Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtheta Ġ= Ġto Radians ( theta Degrees . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠVector 3 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġsin ( theta ) Ġ* Ġcos ( phi ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġsin ( theta ) Ġ* Ġsin ( phi ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ* Ġcos ( theta ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Ġ= ĠSegment ( project 3 D ( cursor ). xy , Ġproject 3 D ( end ). xy ) ĊĠĠĠĠĠĠĠĠĠ Ġtemp Segments . add ( segment ) ĊĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġend ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsegments . add ( temp Segments ) ĊĠĠĠĠĠĠĠ Ġtemp Segments Ġ= Ġmutable ListOf () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠRender Ġto Ġthe Ġrender Ġtarget , Ġsave Ġfile , Ġthen Ġscale Ġand Ġdraw Ġto Ġscreen ĊĠĠĠĠĠ Ġdrawer . is olated With Target ( rt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġgood Ġfor Ġ 2 D Ġbut Ġbad Ġfor Ġ 3 D Ġ... ĠI Ġguess ? ĊĠĠĠĠĠĠĠ Ġ// Ġdrawer . orth o ( rt ) ĊĠĠĠĠĠĠĠ Ġdrawer . clear ( Color RGB a . ANTI QUE _ WHITE ) ĊĠĠĠĠĠĠĠ Ġdrawer . stroke Weight Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġdrawer . stroke Ġ= ĠColor RGB a . BLACK ĊĠĠĠĠĠĠĠ Ġdrawer . fill Ġ= ĠColor RGB a . BLACK ĊĠĠĠĠĠĠĠ Ġsegments . forEach Ġ{ Ġdrawer . segments ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠJust Ġsome Ġgood Ġol ' Ġaxes Ġfor Ġtracking Ġwhere Ġwe Ġare Ġin Ġspace ĊĠĠĠĠĠĠĠ Ġdrawer . stroke Weight Ġ= Ġ 6 . 0 ĊĠĠĠĠĠĠĠ Ġdrawer . stroke Ġ= ĠColor RGB a . FO REST _ GREEN ĊĠĠĠĠĠĠĠ Ġdrawer . segment ( Segment ( project 3 D ( Vector 3 . ZERO ). xy , Ġproject 3 D ( Vector 3 . UNIT _ X Ġ* Ġ 3 0 0 0 . 0 ). xy )) ĊĊĠĠĠĠĠĠĠ Ġdrawer . stroke Ġ= ĠColor RGB a . OR ANGE _ RED ĊĠĠĠĠĠĠĠ Ġdrawer . segment ( Segment ( project 3 D ( Vector 3 . ZERO ). xy , Ġproject 3 D ( Vector 3 . UNIT _ Y Ġ* Ġ 3 0 0 0 . 0 ). xy )) ĊĊĠĠĠĠĠĠĠ Ġdrawer . stroke Ġ= ĠColor RGB a . BLUE _ STE EL ĊĠĠĠĠĠĠĠ Ġdrawer . segment ( Segment ( project 3 D ( Vector 3 . ZERO ). xy , Ġproject 3 D ( Vector 3 . UNIT _ Z Ġ* Ġ 3 0 0 0 . 0 ). xy )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdrawer . scale ( width . toDouble () Ġ/ Ġrt . width , ĠTransform Target . MODEL ) ĊĠĠĠĠĠ Ġdrawer . image ( rt . color Buffer ( 0 )) ĊĊĠĠĠĠĠ Ġ// ĠChange Ġto Ġ` true ` Ġto Ġcapture Ġscreenshot ĊĠĠĠĠĠ Ġif Ġ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget File Ġ= ĠFile (" screenshots /$ prog Name /${ timestamp ()}. png ") ĊĠĠĠĠĠĠĠ Ġtarget File . parent File ?. let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrt . color Buffer ( 0 ). save ToFile ( target File , Ġasync Ġ= Ġfalse ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ