// Check for Self Intersection
def pgnInt (pts:var[]..[],pnt:var)
//Edges with existing points
pg01 = Polygon.ByPoints(pts).Explode();
in01 = 1..List.Count(pg01);
ds01 = pnt.DistanceTo(pg01);
//Index of closest edge to new point
in02 = List.SortByKey(in01,ds01)["sortedList"];
//Shift indices of points list
pt01 = List.ShiftIndices(pts,List.FirstItem(-in02));
pt10 = List.ShiftIndices(pt01,n);
//Add new point to top of list
pt11 = List.AddItemToFront(pnt,pt10);
pg11 = Polygon.ByPoints(pt11);
//Check Self Intersection
it11 = pg11.SelfIntersections();
bl01 = List.Count(it11) != 0;
def clsNgh (pnt:var[]..[])
pg01 = Polygon.ByPoints(occ);
ds01 = pg01.DistanceTo(avl);
pt01 = List.SortByKey(avl,ds01)["sortedList"];
pt02 = List.FirstItem(pt01);
pt03 = List.RestOfItems(pt01);
pt04 = pgnInt (occ,pt02);
// Repeat until all points are included
ds01 = List.FirstItem(pt01).DistanceTo(pt01);
pt02 = List.SortByKey(pt01,ds01)["sortedList"];
pt11 = [List.TakeItems(pt02,3),List.DropItems(pt02,3)];
// Implementation on lists of Random points
pt01 = Point.ByCoordinates
(Math.RandomList(n)*8000,Math.RandomList(n)*6000);
[pt02[0],GeometryColor.ByGeometryColor
(Polygon.ByPoints(pt02[0]),Color.ByARGB(255,255,0,0))];
[pt02[1],GeometryColor.ByGeometryColor
(Polygon.ByPoints(pt02[1]),Color.ByARGB(255,0,255,0))];
[pt02[2],GeometryColor.ByGeometryColor
(Polygon.ByPoints(pt02[2]),Color.ByARGB(255,0,0,255))];
[pt02[3],GeometryColor.ByGeometryColor
(Polygon.ByPoints(pt02[3]),Color.ByARGB(255,255,0,250))];