package Ġcommon s Ċ Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . sqrt Ċ Ċ @ Serializable Ċ data Ġclass ĠCoordinate ( val Ġx Ġ: ĠDouble , Ġval Ġy Ġ: ĠDouble ) Ġ{ ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other Ġ: ĠCoordinate ) Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCoordinate ( this . x Ġ+ Ġother . x , Ġthis . y Ġ+ Ġother . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( other Ġ: ĠCoordinate ) Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCoordinate ( this . x Ġ- Ġother . x , Ġthis . y Ġ- Ġother . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠDouble ) Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCoordinate ( this . x Ġ* Ġother , Ġthis . y Ġ* Ġother ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠCoordinate ) Ġ: ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . x Ġ* Ġother . x Ġ+ Ġ Ġthis . y Ġ* Ġother . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠDouble ) Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCoordinate ( this . x Ġ/ Ġother , Ġthis . y Ġ/ Ġother ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlength () Ġ: ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( this Ġ* Ġthis ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunit () Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ/ Ġthis . length () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġor tho () Ġ: ĠCoordinate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . x Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate ( 1 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠCoordinate (- this . y / this . x , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ/ Ġc . length () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdistance To Segment ( start Ġ: ĠCoordinate , Ġend Ġ: ĠCoordinate ) Ġ: ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġstart Ġ- Ġend ĊĠĠĠĠĠĠĠ Ġval Ġor tho Ġ= Ġdelta . orth o () ĊĠĠĠĠĠĠĠ Ġval Ġy Or tho Ġ= Ġ(( start . x Ġ- Ġthis . x )* delta . y * orth o . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . y * delta . y * orth o . x Ġ- Ġor tho . y * start . y * delta . x ) Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( orth o . x * delta . y Ġ- Ġor tho . y * delta . x ) ĊĊĠĠĠĠĠĠĠ Ġval Ġx Or tho Ġ= Ġ(( start . y Ġ- Ġthis . y )* delta . x * orth o . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . x * delta . x * orth o . y Ġ- Ġor tho . x * start . x * delta . y ) Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( orth o . y * delta . x Ġ- Ġor tho . x * delta . y ) ĊĠĠĠĠĠĠĠ Ġval Ġpoint Or tho Ġ= ĠCoordinate ( x Or tho , Ġy Or tho ) ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġif Ġ( point Or tho . x Ġ<= Ġmax ( start . x , Ġend . x ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Or tho . x Ġ>= Ġmin ( start . x , Ġend . x ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġps Ġ= Ġthis Ġ- Ġpoint Or tho ĊĠĠĠĠĠĠĠĠĠĠĠ Ġps . length () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin (( start Ġ- Ġthis ). length (), Ġ( end Ġ- Ġthis ). length ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠ Ġ} Ċ } Ċ