package Ġshapes Ċ Ċ import Ġbasics . BoundingBox Ċ import Ġbasics . Hit Ċ import Ġutil . Math s Ċ import Ġbasics . Point Ċ import Ġbasics . Ray Ċ import ĠShape Ċ import Ġbasics . Vector Ċ import Ġkotlin . math . min Ċ Ċ class ĠSphere ( val Ġcenter : ĠPoint , Ġval Ġradius : ĠFloat ) Ġ: ĠShape () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġbounding Box Ġ= ĠBounding Box ( get Low (), Ġget High ()) ĊĊĠĠĠ Ġprivate Ġfun Ġget Correct Solution ( t 1 : ĠFloat , Ġt 2 : ĠFloat ): ĠFloat ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ> Ġ 0 . 0 Ġ&& Ġt 2 Ġ< Ġ 0 . 0 Ġ-> Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ< Ġ 0 . 0 Ġ&& Ġt 2 Ġ> Ġ 0 . 0 Ġ-> Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ> Ġ 0 . 0 Ġ&& Ġt 2 Ġ> Ġ 0 . 0 Ġ-> Ġmin ( t 1 , Ġt 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġintersect ( ray : ĠRay ): ĠHit ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġ( ray . direction . x Ġ* Ġray . direction . x ) Ġ+ Ġ( ray . direction . y Ġ* Ġray . direction . y ) Ġ+ Ġ( ray . direction . z Ġ* Ġray . direction . z ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġ 2 . 0 f Ġ* Ġ( ray . origin . x Ġ* Ġray . direction . x Ġ+ Ġray . origin . y Ġ* Ġray . direction . y Ġ+ Ġray . origin . z Ġ* Ġray . direction . z ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġ( ray . origin . x Ġ* Ġray . origin . x ) Ġ+ Ġ( ray . origin . y Ġ* Ġray . origin . y ) Ġ+ Ġ( ray . origin . z Ġ* Ġray . origin . z ) Ġ- Ġ( radius Ġ* Ġradius ) ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġ( b Ġ* Ġb ) Ġ- Ġ( 4 Ġ* Ġa Ġ* Ġc ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ< Ġ 0 . 0 f Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ== Ġ 0 . 0 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġ- b Ġ/ Ġ( 2 . 0 f Ġ* Ġa ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ> Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= ĠVector ( center . x Ġ/ Ġradius , Ġcenter . y Ġ/ Ġradius , Ġcenter . z Ġ/ Ġradius ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHit ( t , Ġnormal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġ(- b Ġ+ ĠMath s . sqrt ( d )) Ġ/ Ġ( 2 . 0 f Ġ* Ġa ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= Ġ(- b Ġ- ĠMath s . sqrt ( d )) Ġ/ Ġ( 2 . 0 f Ġ* Ġa ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġget Correct Solution ( t 1 , t 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( t Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= ĠVector ( center . x Ġ/ Ġradius , Ġcenter . y Ġ/ Ġradius , Ġcenter . z Ġ/ Ġradius ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHit ( t , Ġnormal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Low () Ġ= ĠPoint (( 0 . 0 f Ġ- Ġradius ) Ġ- ĠMath s . e (), Ġ( 0 . 0 f Ġ- Ġradius ) Ġ- ĠMath s . e (), Ġ( 0 . 0 f Ġ- Ġradius ) Ġ- ĠMath s . e ()) ĊĊĠĠĠ Ġprivate Ġfun Ġget High () Ġ= ĠPoint (( 0 . 0 f Ġ+ Ġradius ) Ġ+ ĠMath s . e (), Ġ( 0 . 0 f Ġ+ Ġradius ) Ġ+ ĠMath s . e (), Ġ( 0 . 0 f Ġ+ Ġradius ) Ġ+ ĠMath s . e ()) ĊĊĠĠĠ Ġoverride Ġfun Ġinside ( point : ĠPoint ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Math s . pow ( point . x Ġ- Ġcenter . x , Ġ 2 . 0 f ) Ġ+ ĠMath s . pow ( point . y Ġ- Ġcenter . y , Ġ 2 . 0 f ) Ġ+ ĠMath s . pow ( point . z Ġ- Ġcenter . z , Ġ 2 . 0 f )) Ġ> ĠMath s . pow ( radius , Ġ 2 . 0 f ) ĊĠĠĠ Ġ} Ċ }