import Ġjava . awt .* Ċ import Ġjava . awt . event .* Ċ import Ġjava . util . concurrent . Fork Join Pool Ċ import Ġjavax . swing . JPanel Ċ import Ġkotlin . math . min Ċ Ċ class ĠView port ( private Ġval Ġconfiguration : ĠConfiguration ) Ġ: ĠJPanel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġraster Ġ= ĠBitmap ( 6 4 , Ġ 6 4 ) ĊĠĠĠ Ġprivate Ġvar Ġtask : ĠGenerator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmouse Down Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġvar Ġmouse Drag Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġvar Ġdragging Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġpaint Component ( g : ĠGraphics ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg Ġas ĠGraphics 2 D ĊĠĠĠĠĠĠĠ Ġraster . draw ( g ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( drag ging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . set Rendering Hint ( Rendering Hints . KEY _ ANTI ALIAS ING , ĠRendering Hints . VALUE _ ANTI ALIAS _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . set Rendering Hint ( Rendering Hints . KEY _ ST RO KE _ CONTROL , ĠRendering Hints . VALUE _ ST RO KE _ PURE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . YELLOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . stroke Ġ= ĠBasic Stroke ( 2 F , ĠBasic Stroke . CAP _ B UT T , ĠBasic Stroke . JOIN _ MIT ER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw Line ( mouse Down . x , Ġmouse Down . y , Ġmouse Drag . x , Ġmouse Drag . y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . stroke Ġ= ĠBasic Stroke ( 2 F , ĠBasic Stroke . CAP _ B UT T , ĠBasic Stroke . JOIN _ MIT ER , Ġ 1 F , Ġfloat ArrayOf ( 2 F ), Ġ 2 F ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw Line ( mouse Down . x , Ġmouse Down . y , Ġmouse Drag . x , Ġmouse Drag . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ< Ġ 1 Ġ|| Ġheight Ġ< Ġ 1 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ!= Ġraster . width Ġ|| Ġheight Ġ!= Ġraster . height ) Ġraster Ġ= ĠBitmap ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġtask ?. kill () ĊĠĠĠĠĠĠĠ ĠFork Join Pool . common Pool (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= ĠGenerator ( configuration , Ġraster , Ġbounds ) Ġ{ Ġrep aint () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFork Join Pool . common Pool (). invoke ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġzoom In ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġconfiguration . point ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġpoint . z Ġ/ Ġmin ( raster . width , Ġraster . height ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpoint . x Ġ+ Ġ( e . x Ġ- Ġraster . width Ġ* Ġ 0 . 2 5 ) Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpoint . y Ġ+ Ġ( e . y Ġ- Ġraster . height Ġ* Ġ 0 . 2 5 ) Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġpoint . z Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġconfiguration . point Ġ= ĠVector 3 ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġrender () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġzoom Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġconfiguration . point ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ 0 . 5 Ġ* Ġpoint . z Ġ/ Ġmin ( raster . width , Ġraster . height ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpoint . x Ġ- Ġraster . width Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpoint . y Ġ- Ġraster . height Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġpoint . z Ġ* Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġconfiguration . point Ġ= ĠVector 3 ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġrender () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfiguration . reset () ĊĠĠĠĠĠĠĠ Ġrender () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreset () ĊĊĠĠĠĠĠĠĠ Ġadd Key Listener ( object Ġ: ĠKey Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġkey Pressed ( e : ĠKeyEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . keyCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ ESCAPE Ġ-> Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ MINUS Ġ-> Ġzoom Out () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġadd Mouse Listener ( object Ġ: ĠMouse Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Entered ( e : ĠMouseEvent ) Ġ= Ġrequest Focus () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Pressed ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Down Ġ= ĠPoint ( e . x , Ġe . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Drag Ġ= ĠPoint ( e . x , Ġe . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Clicked ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . click Count Ġ> Ġ 1 ) Ġzoom In ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Released ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . x Ġ!= Ġmouse Down . x Ġ|| Ġe . y Ġ!= Ġmouse Down . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġconfiguration . point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġpoint . z Ġ/ Ġmin ( raster . width , Ġraster . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpoint . x Ġ+ Ġ( mouse Down . x Ġ- Ġe . x ) Ġ* Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpoint . y Ġ+ Ġ( mouse Down . y Ġ- Ġe . y ) Ġ* Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . point Ġ= ĠVector 3 ( x , Ġy , Ġpoint . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġadd Mouse Motion Listener ( object Ġ: ĠMouse Motion Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Drag ged ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Drag Ġ= ĠPoint ( e . x , Ġe . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġadd Component Listener ( object Ġ: ĠComponent Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcomponent Res ized ( e : ĠComponent Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . component Res ized ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ