import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠShape Ġimplementing Ġa Ġsphere Ġin Ġthe Ġ 3 D Ġspace Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġinherits Ġfrom Ġabstract Ġclass ĠShape Ġand Ġimplements Ġthe Ġobject Ġsphere Ġand Ġits Ġevery Ġpossible Ċ Ġ* Ġtransformation Ċ Ġ* Ċ Ġ* ĠClass Ġproperties : Ċ Ġ* Ġ- Ġ[ T ] Ġ- ĠThe Ġ[ Transformation ] Ġto Ġapply Ġto Ġthe Ġcanonical Ġsphere Ċ Ġ* Ġ- Ġ[ material ] Ġ- ĠThe Ġ[ Material ] Ġof Ġwhich Ġthe Ġ[ Sphere ] Ġis Ġmade Ġof Ċ Ġ* Ċ Ġ* Ġ@ see ĠShape Ċ Ġ*/ Ċ class ĠSphere Ġ( T Ġ: ĠTransformation Ġ= ĠTransformation (), Ġmaterial : ĠMaterial Ġ= ĠMaterial ()): ĠShape ( T , Ġmaterial ) Ġ Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġis Point Internal Ġ( p Ġ: ĠPoint ) Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġreturn Ġ( T . inverse () Ġ* Ġp ). to Vector (). norm 2 () Ġ< Ġ 1 . 0 F ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġevaluates Ġif Ġthe Ġgiven Ġ[ Ray ] Ġintersect s Ġthe Ġ[ Sphere ] Ġand Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġclosest Ġintersection Ġfrom Ġthe Ġobserver Ġpoint Ġof Ġview ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġr ĠThe Ġ[ Ray ] Ġto Ġcheck Ġthe Ġintersection Ġwith ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġ[ Hit Record ] Ġcontaining Ġthe Ġclosest Ġintersection Ġto Ġthe Ġ[ Ray . origin ] Ġif Ġany . ĠOtherwise Ġnull Ġis Ġreturned ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġray Intersection ( r : ĠRay ): ĠHit Record ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Ġ= ĠT . inverse () Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġ// Compute Ġintersection ĊĠĠĠĠĠĠĠ Ġ// Determin ant / 4 Ġ( Ġ- b Ġ+ /- Ġsqrt ( b * b Ġ- Ġac ) Ġ) / a ĊĠĠĠĠĠĠĠ Ġval Ġo Vec Ġ= Ġir . origin . to Vector () ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġo Vec Ġ* Ġir . dir ĊĠĠĠĠĠĠĠ Ġval Ġd 2 Ġ= Ġir . dir . norm 2 () ĊĠĠĠĠĠĠĠ Ġval Ġdet 4 Ġ= Ġb * b Ġ- Ġ Ġd 2 * Ġ( o Vec . norm 2 () Ġ- Ġ 1 . 0 F ) ĊĠĠĠĠĠĠĠ Ġ// Inter sections ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġ( Ġ- b Ġ- Ġsqrt ( det 4 ) Ġ) / d 2 ĊĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= Ġ( Ġ- b Ġ+ Ġsqrt ( det 4 ) Ġ) / d 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġt Hit Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġin Ġr . t min .. r . t max Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 Ġin Ġr . t min .. r . t max Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhit Ġ= Ġir . at ( t Hit ) ĊĠĠĠĠĠĠĠ Ġreturn ĠHit Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworld Point Ġ= ĠT Ġ* Ġhit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= ĠT Ġ* Ġget Normal ( hit , Ġir . dir ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Point Ġ= Ġto Sur Point ( hit ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġt Hit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġray Ġ= Ġr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġevaluates Ġif Ġthe Ġgiven Ġ[ Ray ] Ġintersect s Ġthe Ġ[ Sphere ] Ġand Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġlist Ġof Ġall Ġthe Ġinter sections ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġused Ġfor ĠC SG . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġr ĠThe Ġ[ Ray ] Ġto Ġcheck Ġthe Ġinter sections Ġwith ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġ[ List ] Ġof [ Hit Record ] Ġcontaining Ġthe Ġinter sections Ġif Ġany . ĠOtherwise Ġnull Ġis Ġreturned ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠC SG Union ĊĠĠĠĠ Ġ* Ġ@ see ĠC SG Difference ĊĠĠĠĠ Ġ* Ġ@ see ĠC SG Intersection ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġray Intersection List ( r : ĠRay ): ĠList < Hit Record >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Ġ= ĠT . inverse () Ġ* Ġr ĊĠĠĠĠĠĠĠ Ġ// Compute Ġintersection ĊĠĠĠĠĠĠĠ Ġ// Determin ant / 4 Ġ( Ġ- b Ġ+ /- Ġsqrt ( b * b Ġ- Ġac ) Ġ) / a ĊĠĠĠĠĠĠĠ Ġval Ġo Vec Ġ= Ġir . origin . to Vector () ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġo Vec Ġ* Ġir . dir ĊĠĠĠĠĠĠĠ Ġval Ġd 2 Ġ= Ġir . dir . norm 2 () ĊĠĠĠĠĠĠĠ Ġval Ġdet 4 Ġ= Ġb * b Ġ- Ġ Ġd 2 * Ġ( o Vec . norm 2 () Ġ- Ġ 1 . 0 F ) ĊĠĠĠĠĠĠĠ Ġ// Inter sections ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġ( Ġ- b Ġ- Ġsqrt ( det 4 ) Ġ) / d 2 ĊĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= Ġ( Ġ- b Ġ+ Ġsqrt ( det 4 ) Ġ) / d 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġhits Ġ= Ġmutable ListOf < Hit Record >() ĊĠĠĠĠĠĠĠ Ġif Ġ( t 1 Ġin Ġr . t min .. r . t max ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhit Ġ= Ġir . at ( t 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhits . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHit Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld Point Ġ= ĠT Ġ* Ġhit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= ĠT Ġ* Ġget Normal ( hit , Ġir . dir ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Point Ġ= Ġto Sur Point ( hit ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġt 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġray Ġ= Ġr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( t 2 Ġin Ġr . t min .. r . t max Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhit Ġ= Ġir . at ( t 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhits . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHit Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld Point Ġ= ĠT Ġ* Ġhit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ= ĠT Ġ* Ġget Normal ( hit , Ġir . dir ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Point Ġ= Ġto Sur Point ( hit ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġt 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġray Ġ= Ġr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( hits . isEmpty ()) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġhits . sorted By Ġ{ Ġit . t Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Normal Ġ( p Ġ: ĠPoint , Ġray Dir Ġ: ĠVector ) Ġ: ĠNormal Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠNormal Ġ( p . x , Ġp . y , Ġp . z ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( p . to Vector ()* ray Dir < 0 . 0 F ) Ġn Ġelse Ġ- n ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Sur Point Ġ( p Ġ: ĠPoint ) Ġ: ĠVector 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġatan Ġ= Ġif Ġ( p . y Ġ>= 0 . 0 F ) Ġatan 2 ( p . y , Ġp . x ) Ġelse Ġatan 2 ( p . y , Ġp . x ) Ġ+ Ġ 2 . 0 F * PI . toFloat () ĊĠĠĠĠĠĠĠ Ġreturn ĠVector 2 d ( u = Ġatan Ġ/ Ġ( 2 . 0 F Ġ* ĠPI . toFloat ()), Ġv = acos ( p . z ) Ġ/ ĠPI . toFloat ()) ĊĠĠĠ Ġ} ĊĊ Ċ }