/// <summary> /// Add graph section using polygon, extruded in given direction. /// Any vertices that already exist are not created but reused. /// This way new region is connected with the rest of the graph. /// </summary> /// <param name="boundingPolygon">Base polygon</param> /// <param name="extrusionAxis">Extrusion direction</param> /// <param name="distance">Height of polygon extrusion</param> /// <param name="keyPoints">Set of 3D points, region is split with.</param> public void AddFromExtrude(Polygon boundingPolygon, Vector3 extrusionAxis, double distance, List <Vector3> keyPoints) { var gridZ = new Grid1d(new Line(boundingPolygon.Start, boundingPolygon.Start + distance * extrusionAxis)); gridZ.SplitAtPoints(keyPoints); var edgesBefore = GetEdges(); var zCells = gridZ.GetCells(); for (var i = 0; i < zCells.Count; i++) { var elevationVector = zCells[i].Domain.Min * extrusionAxis; var transformedPolygonBottom = boundingPolygon.TransformedPolygon(new Transform(elevationVector)); var grid = CreateGridFromPolygon(transformedPolygonBottom); SplitGrid(grid, keyPoints); SplitGridAtIntersectionPoints(boundingPolygon, grid, edgesBefore); var addedEdges = AddFromGrid(grid, edgesBefore); AddVerticalEdges(extrusionAxis, zCells[i].Domain.Length, addedEdges); if (i == zCells.Count - 1) { var transformedPolygonTop = boundingPolygon.TransformedPolygon( new Transform(zCells[i].Domain.Max * extrusionAxis)); grid = CreateGridFromPolygon(transformedPolygonTop); SplitGrid(grid, keyPoints); SplitGridAtIntersectionPoints(boundingPolygon, grid, edgesBefore); AddFromGrid(grid, edgesBefore); } } }