package Ġca . all an wang . minecraft . toolbox . core Ċ Ċ import Ġjava . util . logging . Logger Ċ Ċ data Ġclass ĠPolygon Data ( ĊĠĠĠ Ġval Ġpath : ĠList < Point Kt >, ĊĠĠĠ Ġval Ġbounding Box : ĠBounding Box Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger (" Points In Polygon ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġf lood Fill : ĠF lood Fill Ġby Ġlazy Ġ{ ĠF lood Fill () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġof ĠF lood ĠFill , Ġor Ġmore Ġspecifically , ĠSpan ĠFill . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġhttps :// en . wikipedia . org / wiki / F lood _ fill # Span _ Fill ing ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġheav ily Ġinspired Ġby ĊĠĠĠĠ Ġ* Ġhttp :// www . adam mil . net / blog / v 1 2 6 _ A _ More _ E fficient _ F lood _ Fill . html ĊĠĠĠĠ Ġ* Ġand Ġis ĠKotlin ized Ġin Ġthis Ġclass . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġsake Ġof Ġdocumentation , Ġwe Ġwill Ġdraw Ġgrids Ġwhere ĊĠĠĠĠ Ġ* Ġ- Ġ` o ` Ġrepresents Ġa Ġpoint Ġinside Ġthe Ġpolygon , ĊĠĠĠĠ Ġ* Ġ- Ġ`. ` Ġrepresents Ġa Ġpoint Ġoutside Ġthe Ġpolygon Ġ( or Ġa Ġpoint Ġalong Ġthe Ġpath ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPoints Ġare Ġwritten Ġas Ġ( x , Ġy ), Ġwhere Ġx Ġ= Ġpoint Ġalong Ġthe Ġrow Ġand Ġy Ġ= Ġpoint Ġalong Ġthe Ġcol . ĊĠĠĠĠ Ġ* ĠThe Ġ` o ` Ġpoint Ġbelow Ġis Ġ( 2 , Ġ 1 ). ĊĠĠĠĠ Ġ* Ġ----------- ĊĠĠĠĠ Ġ* Ġ. Ġ. Ġ. Ġ. ĊĠĠĠĠ Ġ* Ġ. Ġ. Ġo Ġ. ĊĠĠĠĠ Ġ* Ġ. Ġ. Ġ. Ġ. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠF lood Fill Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠShared Ġmemory Ġrequired Ġfor Ġalgorithm . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠContext ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠFlag Ġgrid Ġto Ġindicate Ġvisited Ġpoints . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠNormal ized Ġsuch Ġthat Ġ( min X , Ġmin Y ) Ġis Ġ( 0 , Ġ 0 ). ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠStarts Ġwith Ġoffset Ġpath Ġpoints Ġset Ġto Ġtrue . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflag ged : ĠArray < Boolean Array >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠMutable Ġcollection Ġfor Ġgather ing Ġfilled Ġpoints . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠValues Ġare Ġ_ not _ Ġnormalized ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilled Points : ĠMutable Set < Point Kt >, ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġden ormal ized Ġpoint Ġto Ġcollection ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġadd Filled Point ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilled Points . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint Kt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+ Ġbounding Box . min X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+ Ġbounding Box . min Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġoperator Ġfun ĠMap < Int , ĠSet < Int >> . get ( x : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ( x )?. contains ( y ) Ġ== Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠComp uted Ġpoints Ġwithin Ġthe Ġpolygon . ĠPoints Ġare Ġnot Ġoffset ted , Ġand Ġare Ġcomputed Ġvia Ġ[ compute ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠResult Ġis Ġsorted , Ġand Ġis Ġnull Ġprior Ġto Ġcomputation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġfilled Points : ĠCollection < Point Kt >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġoperator Ġfun ĠArray < Boolean Array >. get ( x : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ x ][ y ] ĊĊĠĠĠĠĠĠĠ Ġprivate Ġoperator Ġfun ĠArray < Boolean Array >. set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ x ][ y ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġpoints Ġin Ġpolygon Ġ( from Ġf lood Ġfill ). ĠResult Ġis Ġcached . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpoints In Polygon (): ĠCollection < Point Kt > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilled Points Ġ?: Ġcompute (). also Ġ{ Ġfilled Points Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠComp utation Ġfor Ġ[ points In Polygon ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompute (): ĠCollection < Point Kt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormal ized Ġpoint Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Path Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint Kt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . x Ġ- Ġbounding Box . min X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . y Ġ- Ġbounding Box . min Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormal ized Ġflag Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflag ged : ĠArray < Boolean Array > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( bounding Box . size X ) Ġ{ ĠBoolean Array ( bounding Box . size Y ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMark Ġedges Ġas Ġvisited Ġto Ġcreate Ġboundary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Path . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag ged [ it . x , Ġit . y ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContext Ġfor Ġcomputation . ĠGC 'd Ġafter Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext ( flag ged Ġ= Ġflag ged , Ġfilled Points Ġ= Ġmutable Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠGiven Ġthe Ġrequirements Ġfrom Ġour Ġpath Ġand Ġbounding Ġbox , Ġwe Ġknow Ġthat Ġthe Ġleft Ġmost Ġedge ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġexists Ġalong Ġx Ġ= Ġ 0 , Ġand Ġthat Ġthe Ġpath Ġis Ġnever Ġadjacent Ġto Ġourselves . ĠWith Ġthat , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwe Ġknow Ġthat Ġa Ġpoint Ġis Ġinside Ġthe Ġpolygon Ġif Ġit Ġis Ġimmediately Ġto Ġthe Ġright Ġof Ġa Ġpath Ġpoint Ġat Ġx Ġ= Ġ 0 . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġalso Ġtrans lates Ġto Ġthe Ġfirst Ġpoint Ġat Ġx Ġ= Ġ 1 Ġthat Ġis Ġbelow Ġa Ġpath Ġpoint , Ġwhich Ġis Ġeasier Ġto Ġcompute . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Path . as Sequence (). filter Ġ{ Ġit . x Ġ== Ġ 1 Ġ}. map Ġ{ Ġit . y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min OrNull ()?. let Ġ{ Ġit Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Invalid Ġpath Ġor Ġbounding Ġbox .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . sub Fill ( 1 , Ġinitial Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . filled Points . sorted () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠVariant Ġof Ġ[ sub Fill ] Ġthat Ġc raw ls Ġto Ġthe Ġtop Ġleft Ġnon Ġflag ged Ġpoint Ġbefore hand . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAs Ġa Ġslight Ġoptimization , Ġmoving Ġup Ġis Ġpreferred Ġto Ġmoving Ġleft , Ġso Ġwe Ġtry Ġto Ġmove Ġup wards Ġwhenever Ġpossible . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthe Ġexample Ġbelow , Ġstarting Ġat Ġ( 4 , Ġ 2 ) Ġwill Ġresult Ġin Ġa Ġsub fill Ġstarting Ġat Ġ( 3 , Ġ 1 ) Ġrather Ġthan Ġ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ------------- ĊĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġ. Ġ. Ġ. Ġ. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġ. Ġ. Ġo Ġ. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġo Ġo Ġo Ġo ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠContext . sub Fill From Top Left ( test X : ĠInt , Ġtest Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġtest X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġtest Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( y Ġ!= Ġ 0 Ġ&& Ġ! flag ged [ x , Ġy Ġ- Ġ 1 ]) Ġy -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġ 0 Ġ&& Ġ! flag ged [ x Ġ- Ġ 1 , Ġy ]) Ġx -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġcurr X Ġ&& Ġy Ġ== Ġcurr Y ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Fill ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMain Ġpart Ġof Ġf lood Ġfill . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġbasis Ġof Ġspan Ġfilling Ġis Ġto Ġfill Ġpoints Ġalong Ġa Ġrow , Ġand Ġto Ġmove Ġup Ġand Ġdown Ġto Ġfill Ġother Ġrows . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġour Ġalgorithm , Ġwe Ġstart Ġon Ġthe Ġtop Ġleft , Ġand Ġmove Ġour Ġway Ġdown Ġand Ġto Ġthe Ġright . ĊĠĠĠĠĠĠĠĠ Ġ* ĠEach Ġsub Fill Ġis Ġresponsible Ġfor Ġfilling Ġrows Ġup Ġuntil Ġa Ġboundary Ġis Ġreached , ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġfor Ġfilling Ġsubsequent Ġrows Ġdown wards Ġwhen Ġthe Ġstart Ġpoint Ġis Ġreachable Ġfrom Ġthe Ġprevious Ġstart Ġpoint . ĊĠĠĠĠĠĠĠĠ Ġ* ĠRe cur sion Ġoccurs Ġfor Ġcases Ġwhere Ġa Ġboundary Ġsplits Ġa Ġrow Ġin Ġtwo , Ġsuch Ġas Ġa Ġ` V ` Ġsh aped Ġpolygon . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠAlgorithm Ġwill Ġstart Ġat Ġ[ test X ], Ġ[ test Y ]. ĠThat Ġpoint Ġis Ġexpected Ġnot Ġto Ġbe Ġflag ged . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠContext . sub Fill ( test X : ĠInt , Ġtest Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProvide d Ġpoint Ġis Ġnot Ġflag ged ; Ġfast Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flag ged [ test X , Ġtest Y ]) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġtest X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġtest Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev Row Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit . ĠMark Ġcurrent Ġrow Ġlength Ġas Ġ 0 Ġand Ġadd Ġstart Ġx Ġmarker . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠHandles Ġcases Ġsuch Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġo Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġ. Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhere Ġthe Ġstart Ġx Ġis Ġright wards Ġof Ġthe Ġprevious Ġstart Ġx . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTo Ġsupport Ġthis , Ġwe Ġshort ed Ġthe Ġprevious Ġrow Ġlength Ġand Ġincrement Ġour Ġstart Ġx Ġuntil Ġwe Ġreach Ġan Ġun flag ged Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġor Ġuntil Ġthe Ġprev Ġrow Ġlength Ġis Ġempty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠUn like Ġthe Ġreference Ġalgorithm , Ġwe Ġdo Ġnot Ġcheck Ġthat Ġthe Ġlast Ġrow Ġlength Ġ!= Ġ 0 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġbecause Ġwe Ġhave Ġa Ġlot Ġof Ġunnecessary Ġloops Ġthrough Ġrecursion , Ġand Ġwe Ġwish Ġto Ġfast Ġstop Ġas Ġsoon Ġas Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flag ged [ x , Ġy ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( x Ġ+ Ġ 1 ) Ġuntil Ġ( x Ġ+ Ġprev Row Length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġprev Row Length -- Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġflag ged [ it , Ġy ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Row Length Ġ-= Ġit Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġit Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(-- prev Row Length Ġ<= Ġ 0 ) Ġreturn Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( flag ged [++ x , Ġy ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠHandles Ġcases Ġsuch Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġ. Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġo Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhere Ġthe Ġstart Ġx Ġis Ġleft wards Ġof Ġthe Ġprevious Ġstart Ġx . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTo Ġsupport Ġthis , Ġwe Ġincrement Ġboth Ġcurrent Ġand Ġprev Ġrow Ġlength , Ġand Ġmove Ġx Ġbackwards ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġincrement ing Ġrows Ġis Ġnecessary Ġto Ġbroad en Ġour Ġrow Ġsearch Ġfor Ġadjacent Ġrows . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAdditionally , Ġwe Ġwill Ġflag Ġeach Ġpoint Ġwe Ġgo Ġthrough Ġand Ġadd Ġthem Ġto Ġfilled Ġpoints Ġso Ġas Ġto Ġavoid Ġduplicate Ġhandling ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġas Ġa Ġresult , Ġwe Ġdo Ġnot Ġchange Ġstart Ġx . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDuring Ġour Ġiteration , Ġwe Ġcheck Ġthe Ġrow Ġabove Ġfor Ġun marked Ġpoints , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġrecurse Ġif Ġnecessary Ġto Ġhandle Ġpreviously Ġunreachable Ġrows Ġ( to Ġthe Ġtop Ġleft ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠExample , Ġwith Ġ` x ` Ġmarking Ġfirst Ġstarting Ġpoint : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġo Ġo Ġo Ġ. Ġ. Ġx Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ. Ġo Ġo Ġo Ġo Ġo Ġo Ġ. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( x Ġ- Ġ 1 ) Ġdown To Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġ! flag ged [ it , Ġy ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filled Point ( it , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag ged [ it , Ġy ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġ 0 Ġ&& Ġ! flag ged [ it , Ġy Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Fill From Top Left ( it , Ġy Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ-= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Length Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Row Length Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( x Ġ!= Ġ 0 Ġ&& Ġ! flag ged [ x Ġ- Ġ 1 , Ġy ]) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx -- Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filled Point ( x , Ġy ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag ged [ x , Ġy ] Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġ 0 Ġ&& Ġ! flag ged [ x , Ġy Ġ- Ġ 1 ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Fill From Top Left ( x , Ġy Ġ- Ġ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Length ++ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Row Length ++ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠScan Ġthrough Ġ( remainder Ġof ) Ġcurrent Ġrow . ĠFlag Ġnew Ġpoints Ġand Ġadd Ġto Ġfilled Ġpoints , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠUpdate Ġstart Ġx Ġand Ġrow Length Ġto Ġmatch Ġlast Ġpoint Ġin Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start X Ġuntil Ġbounding Box . size X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġ! flag ged [ it , Ġy ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filled Point ( it , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag ged [ it , Ġy ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Length Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠHandles Ġend Ġcases Ġsuch Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġo Ġo Ġo Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġo Ġo Ġo Ġ. Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhere Ġa Ġboundary Ġexists Ġin Ġthe Ġcurrent Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthis Ġcase , Ġour Ġrow Ġlength Ġis Ġless Ġthan Ġbefore , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġwe Ġcan Ġiterate Ġthrough Ġthe Ġremaining Ġpoints Ġin Ġthe Ġprev Ġrow Ġlength Ġand Ġcheck Ġfor Ġun flag ged Ġpoints Ġ( potential Ġnew Ġrows ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Length Ġ< Ġprev Row Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( start X Ġ+ Ġ 1 ) Ġuntil Ġ( x Ġ+ Ġprev Row Length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġflag ged [ it , Ġy ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġsub Fill ( it , Ġy ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠHandles Ġend Ġcases Ġsuch Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġo Ġo Ġo Ġ. Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġo Ġo Ġo Ġo Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhere Ġa Ġboundary Ġexists Ġin Ġthe Ġprevious Ġrow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthis Ġcase , Ġour Ġrow Ġlength Ġis Ġlarger Ġthan Ġbefore , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġwe Ġcan Ġiterate Ġthrough Ġthe Ġremaining Ġpoints Ġafter Ġthe Ġprev Ġrow Ġlength Ġand Ġcheck Ġfor Ġun flag ged Ġpoints Ġ( potential Ġnew Ġrows ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( row Length Ġ> Ġprev Row Length Ġ&& Ġy Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( x Ġ+ Ġprev Row Length Ġ+ Ġ 1 ) Ġuntil Ġstart X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġflag ged [ it , Ġy Ġ- Ġ 1 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġsub Fill From Top Left ( it , Ġy Ġ- Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Row Length Ġ= Ġrow Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( prev Row Length Ġ!= Ġ 0 Ġ&& Ġ++ y Ġ< Ġbounding Box . size Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġcollection Ġof Ġpoints Ġthat Ġare Ġwithin Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĠPoints Ġinclude Ġvalues Ġin Ġ[ path ], Ġand Ġare Ġsorted Ġ( by Ġy , Ġthen Ġx ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpoints In Polygon (): ĠCollection < Point Kt > Ġ= Ġf lood Fill . points In Polygon () Ċ Ċ }