package Ġcom . cur tis lb . ad vent of code . common . grid Ċ Ċ import Ġcom . cur tis lb . ad vent of code . common . math . Fraction Ċ Ċ /** Ċ Ġ* ĠA Ġunique Ġrepresentation Ġof Ġa Ġray Ġwith Ġa Ġgiven Ġorigin Ġand Ġdirection Ġin Ġa Ġ 2 D Ġgrid . Ċ Ġ* Ċ Ġ* Ġ@ param Ġsource ĠThe Ġorigin Ġpoint Ġof Ġthe Ġray . Ċ Ġ* Ġ@ param Ġslope ĠThe Ġslope Ġof Ġthe Ġray , Ġor Ġ` null ` Ġif Ġits Ġslope Ġis Ġinfinite . Ċ Ġ* Ġ@ param Ġdirection Par ity ĠA Ġflag Ġindicating Ġthe Ġdirection Ġof Ġthe Ġray . ĠIf Ġ[ slope ] Ġis Ġnon - null , Ġ` true ` Ċ Ġ* Ġ Ġindicates Ġthat Ġthe Ġx Ġvalues Ġof Ġpoints Ġon Ġthe Ġray Ġapproach Ġpositive Ġinfinity , Ġwhereas Ġ` false ` Ċ Ġ* Ġ Ġindicates Ġthat Ġthey Ġapproach Ġnegative Ġinfinity . ĠIf Ġ[ slope ] Ġis Ġ` null `, Ġ` true ` Ġindicates Ġthat Ġthe Ċ Ġ* Ġ Ġy Ġvalues Ġof Ġpoints Ġon Ġthe Ġray Ġapproach Ġpositive Ġinfinity , Ġwhereas Ġ` false ` Ġindicates Ġthat Ġthey Ċ Ġ* Ġ Ġapproach Ġnegative Ġinfinity . Ċ Ġ*/ Ċ data Ġclass ĠRay ( val Ġsource : ĠPoint , Ġval Ġslope : ĠFraction ?, Ġval Ġdirection Par ity : ĠBoolean ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġunique Ġrepresentation Ġof Ġa Ġray Ġwith Ġa Ġgiven Ġorigin Ġand Ġdirection Ġin Ġa Ġ 2 D Ġgrid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsource ĠThe Ġorigin Ġpoint Ġof Ġthe Ġray . ĊĠĠĠĠ Ġ* Ġ@ param Ġmember ĠA Ġsecond Ġpoint Ġon Ġthe Ġray . ĠMust Ġbe Ġdistinct Ġfrom Ġ[ source ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠIf Ġ[ source ] Ġand Ġ[ member ] Ġare Ġthe Ġsame Ġpoint . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( source : ĠPoint , Ġmember : ĠPoint ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġsource , ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember Ġ== Ġsource Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Source Ġand Ġmember Ġpoints Ġmust Ġbe Ġdistinct .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember . x Ġ== Ġsource . x Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFraction ( member . y Ġ- Ġsource . y , Ġmember . x Ġ- Ġsource . x ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġif Ġ( source . x Ġ!= Ġmember . x ) Ġmember . x Ġ> Ġsource . x Ġelse Ġmember . y Ġ> Ġsource . y ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġan Ġinfinite Ġsequence Ġof Ġall Ġgrid Ġpoints Ġthat Ġfall Ġon Ġthis Ġray , Ġsorted Ġby Ġtheir ĊĠĠĠĠ Ġ* Ġdistances Ġfrom Ġ( and Ġincluding ) Ġthe Ġ[ source ] Ġpoint . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpoints (): ĠSequence < Point > Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġchange Ġin Ġx Ġand Ġy Ġvalues Ġbetween Ġsubsequent Ġpoints . ĊĠĠĠĠĠĠĠ Ġval Ġdirection Sign Ġ= Ġif Ġ( direction Par ity ) Ġ 1 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġdirection Sign Ġ* Ġ( slope ?. denom inator ?. toInt () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġdirection Sign Ġ* Ġ( slope ?. num erator ?. toInt () Ġ?: Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠY ield Ġeach Ġpoint Ġin Ġorder , Ġstarting Ġwith Ġsource . ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġsource . x ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġsource . y ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Point ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġdelta X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġdelta Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ