package Ġru . ily ass ha fig in . open rnd r . editor . shape . mesh Ċ Ċ import Ġorg . open rnd r . math . Vector 2 Ċ import Ġquick hull 3 d . Quick H ull 3 D Ċ Ċ object ĠDel a un ay Ġ{ ĊĊĠĠĠ Ġfun Ġfrom ( points : ĠList < Vector 2 >): ĠList < Edge > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( points . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġpoints Ġarray Ġfor Ġq hull ĊĠĠĠĠĠĠĠ Ġval Ġq Points Ġ= ĠDouble Array ( points . size Ġ* Ġ 3 Ġ+ Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpoints . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq Points [ i Ġ* Ġ 3 Ġ+ Ġ 0 ] Ġ= Ġpoints [ i ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq Points [ i Ġ* Ġ 3 Ġ+ Ġ 1 ] Ġ= Ġpoints [ i ][ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq Points [ i Ġ* Ġ 3 Ġ+ Ġ 2 ] Ġ= Ġ-( points [ i ][ 0 ] Ġ* Ġpoints [ i ][ 0 ] Ġ+ Ġpoints [ i ][ 1 ] Ġ* Ġpoints [ i ][ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 9 ] Ġ= Ġ- 2 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 8 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 7 ] Ġ= Ġ- 4 0 0 0 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 6 ] Ġ= Ġ 2 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 5 ] Ġ= Ġ 2 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 4 ] Ġ= Ġ- 8 0 0 0 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 3 ] Ġ= Ġ 2 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 2 ] Ġ= Ġ- 2 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġq Points [ q Points . size Ġ- Ġ 1 ] Ġ= Ġ- 8 0 0 0 0 0 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġ// Ġprepare Ġquick hull ĊĠĠĠĠĠĠĠ Ġval Ġquick H ull Ġ= ĠQuick H ull 3 D ( q Points ) ĊĠĠĠĠĠĠĠ Ġval Ġfaces Ġ= Ġquick H ull . get Faces ( Quick H ull 3 D . POINT _ REL ATIVE Ġ+ ĠQuick H ull 3 D . CLOCK WISE ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġturn Ġfaces Ġinto Ġlinks ĊĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= ĠLinked Array ( points . size Ġ+ Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġlinks Ġ= Ġmutable ListOf < Link >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfaces . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġfaces [ i ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġfaces [ i ][ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġfaces [ i ][ ( j Ġ+ Ġ 1 ) Ġ% Ġfaces [ i ]. size ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ< Ġpoints . size Ġ&& Ġq Ġ< Ġpoints . size Ġ&& Ġ! mesh . linked ( p , Ġq )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmesh . link ( p , Ġq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks Ġ+= ĠLink ( p , Ġq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġturn Ġlinks Ġinto Ġedges ĊĠĠĠĠĠĠĠ Ġreturn Ġlinks . map Ġ{ Ġlink Ġ-> ĠEdge ( points [ link . p ], Ġpoints [ link . q ]) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ