private List <Rectangle2D> GetRecrangle(List <Vector2D> points) { List <Rectangle2D> rectangles = new List <Rectangle2D>(); Vector2D floorLocalCoord = GetBasicDirection()[0]; Vector2D GlobalCoord = new Vector2D(1, 0); double xiTa = 0; if (floorLocalCoord.Dot(GlobalCoord) > 0 && GlobalCoord.Cross(floorLocalCoord) < 0) { xiTa = GlobalCoord.AngleWith(floorLocalCoord); } else if (floorLocalCoord.Dot(GlobalCoord) < 0 && GlobalCoord.Cross(-floorLocalCoord) < 0) { xiTa = GlobalCoord.AngleWith(floorLocalCoord); } else if (floorLocalCoord.Dot(GlobalCoord) > 0 && GlobalCoord.Cross(floorLocalCoord) > 0) { xiTa = Math.PI / 2 - GlobalCoord.AngleWith(floorLocalCoord); } else if (floorLocalCoord.Dot(GlobalCoord) < 0 && GlobalCoord.Cross(-floorLocalCoord) > 0) { xiTa = Math.PI / 2 - GlobalCoord.AngleWith(floorLocalCoord); } points.ForEach(x => x.X = Math.Floor(x.X * 1e9) / 1e9); points.ForEach(x => x.Y = Math.Floor(x.Y * 1e9) / 1e9); List <Vector2D> newCoord = new List <Vector2D>(); points.ForEach(x => newCoord.Add(CoordTransform(x, xiTa))); List <double> newXCoord = new List <double>(); List <double> newYCoord = new List <double>(); newCoord.ForEach(x => { newXCoord.Add(x.X); newYCoord.Add(x.Y); }); newXCoord = newXCoord.Distinct().OrderBy(x => x).ToList(); newYCoord = newYCoord.Distinct().OrderBy(y => y).ToList(); for (int i = 0; i < newXCoord.Count - 1; i++) { for (int j = 0; j < newYCoord.Count - 1; j++) { Vector2D p1 = new Vector2D(newXCoord[i], newYCoord[j]); Vector2D p2 = new Vector2D(newXCoord[i + 1], newYCoord[j]); Vector2D p3 = new Vector2D(newXCoord[i + 1], newYCoord[j + 1]); Vector2D p4 = new Vector2D(newXCoord[i], newYCoord[j + 1]); p1 = CoordTransform(p1, -xiTa); p2 = CoordTransform(p2, -xiTa); p3 = CoordTransform(p3, -xiTa); p4 = CoordTransform(p4, -xiTa); Rectangle2D rec = new Rectangle2D(p1, p2, p3, p4); rectangles.Add(rec); } } return(rectangles); }