package Ġnet . fw itz . math . plot . b if ur c Ċ Ċ import Ġnet . fw itz . math . plot . renderer . Image Renderer Panel Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . awt . geom . Point 2 D Ċ import Ġjava . util . stream . Double Stream Ċ import Ġjavax . swing . KeyStroke Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠLog istic Map Panel ( ĊĠĠĠ Ġmin r : ĠDouble , ĊĠĠĠ Ġminx n : ĠDouble , ĊĠĠĠ Ġmax r : ĠDouble , ĊĠĠĠ Ġmax xn : ĠDouble , ĊĠĠĠ Ġval Ġcompute Fn : Ġ( Double ) Ġ-> ĠDouble Array ? Ċ ) Ġ: ĠImage Renderer Panel < Log istic Map Renderer >() Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid ( var arg Ġvalues : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Stream . of (* values ). all Match Ġ{ Ġd : ĠDouble Ġ-> Ġd . is Finite () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset Bounds ( min r , Ġminx n , Ġmax r , Ġmax xn ) ĊĠĠĠĠĠĠĠ Ġadd Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġmin r Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġmax r Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġminx n Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġmax xn Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Renderer ( width : ĠInt , Ġheight : ĠInt ): ĠLog istic Map Renderer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLog istic Map Renderer ( this , Ġwidth , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Map Ġ= Ġinput Map ĊĠĠĠĠĠĠĠ Ġkey Map . put ( KeyStroke . getKey Stroke (' q '), Ġ" quit ") ĊĠĠĠĠĠĠĠ Ġkey Map . put ( KeyStroke . getKey Stroke ('\ u 0 0 1 B '), Ġ" quit ") ĊĠĠĠĠĠĠĠ Ġkey Map . put ( KeyStroke . getKey Stroke (' ] '), Ġ" zoom In ") ĊĠĠĠĠĠĠĠ Ġkey Map . put ( KeyStroke . getKey Stroke (' [' ), Ġ" zoom Out ") ĊĊĠĠĠĠĠĠĠ Ġval Ġhandlers Ġ= Ġaction Map ĊĠĠĠĠĠĠĠ Ġhandlers . put (" quit ", Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer ?. shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġhandlers . put (" zoom In ", Ġaction Ġ{ Ġzoom In () Ġ}) ĊĠĠĠĠĠĠĠ Ġhandlers . put (" zoom Out ", Ġaction Ġ{ Ġzoom Out () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġzoom In () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Adjust Ġ= Ġ( max r Ġ- Ġmin r ) Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġx n Adjust Ġ= Ġ( max xn Ġ- Ġminx n ) Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġset Bounds ( min r Ġ+ Ġr Adjust , Ġminx n Ġ+ Ġx n Adjust , Ġmax r Ġ- Ġr Adjust , Ġmax xn Ġ- Ġx n Adjust ) ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġzoom Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Adjust Ġ= Ġ( max r Ġ- Ġmin r ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġx n Adjust Ġ= Ġ( max xn Ġ- Ġminx n ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġset Bounds ( min r Ġ- Ġr Adjust , Ġminx n Ġ- Ġx n Adjust , Ġmax r Ġ+ Ġr Adjust , Ġmax xn Ġ+ Ġx n Adjust ) ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcenter ( location : ĠPoint 2 D . Double ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Delta Ġ= Ġmax r Ġ- Ġmin r ĊĠĠĠĠĠĠĠ Ġval Ġx n Delta Ġ= Ġmax xn Ġ- Ġminx n ĊĠĠĠĠĠĠĠ Ġval Ġr Offset Ġ= Ġlocation . getX () Ġ- Ġr Delta Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġx n Offset Ġ= Ġlocation . getY () Ġ- Ġx n Delta Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġset Bounds ( r Offset , Ġx n Offset , Ġr Offset Ġ+ Ġr Delta , Ġx n Offset Ġ+ Ġx n Delta ) ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Bounds ( min r : ĠDouble , Ġminx n : ĠDouble , Ġmax r : ĠDouble , Ġmax xn : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( valid ( min r , Ġminx n , Ġmax r , Ġmax xn )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġbounds : Ġ(" Ġ+ Ġmin r Ġ+ Ġ", Ġ" Ġ+ Ġminx n Ġ+ Ġ") Ġ- Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax r Ġ+ Ġ", Ġ" Ġ+ Ġmax xn Ġ+ Ġ')' ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( min r Ġ> Ġmax r ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min r Ġ= Ġmax r ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max r Ġ= Ġmin r ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min r Ġ= Ġmin r ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max r Ġ= Ġmax r ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( min xn Ġ> Ġmax xn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min xn Ġ= Ġmax xn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max xn Ġ= Ġminx n ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min xn Ġ= Ġminx n ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max xn Ġ= Ġmax xn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mouse Location In Map ( e : ĠMouseEvent ): ĠPoint 2 D . Double ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloc Ġ= Ġget Mouse Location As Relative Point ( e ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint 2 D . Double ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale To Bounds ( loc . getX (), Ġmin r , Ġmax r ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale To Bounds ( 1 Ġ- Ġloc . getY (), Ġminx n , Ġmax xn ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Pressed ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . button Ġ== Ġ 1 ) Ġget Mouse Location In Map ( e )?. let Ġ{ Ġcenter ( it ) Ġ} ĊĠĠĠ Ġ} Ċ }