package Ġworld . greg s . void ps . tools . map . render . raster Ċ Ċ import Ġworld . greg s . void ps . tools . map . render . raster . Colour Palette . h sv Colour Palette Ċ import Ġjava . awt . Color Ċ import Ġjava . awt . Point Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . File Ċ import Ġjavax . image io . Image IO Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ class ĠR aster ( private Ġval Ġbi : ĠBufferedImage ) Ġ{ ĊĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġbi . width ĊĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġbi . height ĊĊĠĠĠ Ġprivate Ġvar Ġmin X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmin Y Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbi . get RGB ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbi . set RGB ( x , Ġy , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw G our aud Triangle ( y 1 : ĠInt , Ġy 2 : ĠInt , Ġy 3 : ĠInt , Ġx 1 : ĠInt , Ġx 2 : ĠInt , Ġx 3 : ĠInt , Ġcolour 1 : ĠInt , Ġcolour 2 : ĠInt , Ġcolour 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw G our aud ( x 1 , Ġx 2 , Ġx 3 , Ġy 1 , Ġy 2 , Ġy 3 , Ġh sv Colour Palette [ colour 1 ], Ġh sv Colour Palette [ colour 2 ], Ġh sv Colour Palette [ colour 3 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw G our aud ( x 1 : ĠInt , Ġx 2 : ĠInt , Ġx 3 : ĠInt , Ġy 1 : ĠInt , Ġy 2 : ĠInt , Ġy 3 : ĠInt , Ġcolour 1 : ĠInt , Ġcolour 2 : ĠInt , Ġcolour 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin X Ġ= Ġmin ( x 1 , Ġmin ( x 2 , Ġx 3 )) ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= Ġmax ( x 1 , Ġmax ( x 2 , Ġx 3 )) ĊĠĠĠĠĠĠĠ Ġval Ġmin Y Ġ= Ġmin ( y 1 , Ġmin ( y 2 , Ġy 3 )) ĊĠĠĠĠĠĠĠ Ġval Ġmax Y Ġ= Ġmax ( y 1 , Ġmax ( y 2 , Ġy 3 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġused Ġ= ĠArray ( max X Ġ- Ġmin X Ġ+ Ġ 1 ) Ġ{ ĠBoolean Array ( max Y Ġ- Ġmin Y Ġ+ Ġ 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . min X Ġ= Ġmin X ĊĠĠĠĠĠĠĠ Ġthis . min Y Ġ= Ġmin Y ĊĊĠĠĠĠĠĠĠ Ġb res en ham Line ( used , Ġx 1 , Ġy 1 , Ġx 2 , Ġy 2 , Ġcolour 1 , Ġcolour 2 ) ĊĠĠĠĠĠĠĠ Ġb res en ham Line ( used , Ġx 1 , Ġy 1 , Ġx 3 , Ġy 3 , Ġcolour 1 , Ġcolour 3 ) ĊĠĠĠĠĠĠĠ Ġb res en ham Line ( used , Ġx 2 , Ġy 2 , Ġx 3 , Ġy 3 , Ġcolour 2 , Ġcolour 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// Find Ġright Ġpoint ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġmin Y Ġuntil Ġmax Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġmin X Ġuntil Ġmax X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used [ x Ġ- Ġthis . min X ][ y Ġ- Ġthis . min Y ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Colour Ġ= Ġget ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rx Ġin Ġmax X Ġdown To Ġmin X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used [ rx Ġ- Ġthis . min X ][ y Ġ- Ġthis . min Y ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb res en ham Line ( used , Ġx , Ġy , Ġrx , Ġy , Ġleft Colour , Ġget ( rx , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġb res en ham Line ( used : ĠArray < Boolean Array >, Ġx 0 : ĠInt , Ġy 0 : ĠInt , Ġx 1 : ĠInt , Ġy 1 : ĠInt , Ġcolour 1 : ĠInt , Ġcolour 2 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx 0 Ġ= Ġx 0 ĊĠĠĠĠĠĠĠ Ġvar Ġy 0 Ġ= Ġy 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġdelta Width Ġ= Ġx 1 Ġ- Ġx 0 ĊĠĠĠĠĠĠĠ Ġval Ġdelta Height Ġ= Ġy 1 Ġ- Ġy 0 ĊĊĠĠĠĠĠĠĠ Ġvar Ġdx 0 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdy 0 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdx 1 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdy 1 Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( delta Width Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx 0 Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( delta Width Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx 0 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Height Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdy 0 Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( delta Height Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdy 0 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Width Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx 1 Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( delta Width Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx 1 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġlongest Ġ= Ġabs ( delta Width ) ĊĠĠĠĠĠĠĠ Ġvar Ġshortest Ġ= Ġabs ( delta Height ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( longest Ġ<= Ġshortest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlongest Ġ= Ġabs ( delta Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshortest Ġ= Ġabs ( delta Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delta Height Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy 1 Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( delta Height Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy 1 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx 1 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġnum erator Ġ= Ġlongest Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġred 1 Ġ= Ġcolour 1 Ġshr Ġ 1 6 Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġval Ġgreen 1 Ġ= Ġcolour 1 Ġshr Ġ 8 Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġval Ġblue 1 Ġ= Ġcolour 1 Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġval Ġred 2 Ġ= Ġcolour 2 Ġshr Ġ 1 6 Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġval Ġgreen 2 Ġ= Ġcolour 2 Ġshr Ġ 8 Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġval Ġblue 2 Ġ= Ġcolour 2 Ġand Ġ 0 xff ĊĊĠĠĠĠĠĠĠ Ġval Ġr Step Ġ= Ġ( red 2 Ġ- Ġred 1 ). toFloat () Ġ/ Ġlongest ĊĠĠĠĠĠĠĠ Ġval Ġg Step Ġ= Ġ( green 2 Ġ- Ġgreen 1 ). toFloat () Ġ/ Ġlongest ĊĠĠĠĠĠĠĠ Ġval Ġb Step Ġ= Ġ( blue 2 Ġ- Ġblue 1 ). toFloat () Ġ/ Ġlongest ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. longest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Colour Ġcomputation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ( red 1 Ġ+ Ġr Step Ġ* Ġi ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġ( green 1 Ġ+ Ġg Step Ġ* Ġi ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġ( blue 1 Ġ+ Ġb Step Ġ* Ġi ). toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Pixel Ġwriting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y 0 Ġ> Ġ- 1 Ġ&& Ġx 0 Ġ> Ġ- 1 Ġ&& Ġy 0 Ġ< Ġheight Ġ&& Ġx 0 Ġ< Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Ġ= Ġ( abs ( r ). toInt () Ġshl Ġ 1 6 Ġor Ġ( abs ( g ). toInt () Ġshl Ġ 8 ) Ġor Ġabs ( b ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( x 0 , Ġy 0 , Ġ- 1 6 7 7 7 2 1 6 Ġor Ġpixel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused [ x 0 Ġ- Ġmin X ][ y 0 Ġ- Ġmin Y ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum erator Ġ+= Ġshortest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num erator Ġ>= Ġlongest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum erator Ġ-= Ġlongest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 0 Ġ+= Ġdx 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy 0 Ġ+= Ġdy 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 0 Ġ+= Ġdx 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy 0 Ġ+= Ġdy 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbi Ġ= ĠBufferedImage ( 2 5 6 , Ġ 2 5 6 , ĠBufferedImage . TYPE _ INT _ RGB ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraster Ġ= ĠR aster ( bi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= ĠPoint ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo Ġ= ĠPoint ( 0 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthree Ġ= ĠPoint ( 1 0 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraster . draw G our aud Triangle ( one . x , Ġtwo . x , Ġthree . x , Ġone . y , Ġtwo . y , Ġthree . y , ĠColor . RED . rgb , ĠColor . GREEN . rgb , ĠColor . BLUE . rgb ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( bi , Ġ" png ", ĠFile (" saved . png ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }