private List <Vector3> CreateRoad(Bounds bounds, int pointCount, Vector2[] clipPolygon) { // get offset, eg when biome mask is used for clipping float xmin = bounds.center.x - bounds.extents.x; float zmin = bounds.center.z - bounds.extents.z; // get 0/0-based bounds for graph processing Bounds graphBounds = new Bounds(bounds.size / 2, bounds.size); DelaunayVoronoiGraph graph = new DelaunayVoronoiGraph(); // algorithm is 0-based graph.GeneratePoints(0, bounds.size.x, bounds.size.z); // initialize with the dimensions which are used in the algorithm // add random points for (int i = 0; i < pointCount; i++) { // get random point starting at [0/0] Vector2 vector = PolygonUtils.GetRandomPointXZ(graphBounds); graph.AddPoint(vector.x, vector.y); } // create the graph using the points graph.CreateGraph(); int cellIndex = Random.Range(0, pointCount - 1); // normalize clip polygon, shift to [0/0] Vector2[] offsetClipPolygon = clipPolygon.Select(item => new Vector2(item.x - xmin, item.y - zmin)).ToArray(); // get cell, clip it at the clip polygon Cell cell = graph.GetVoronoiCell(cellIndex, offsetClipPolygon); if (cell == null) { return(null); } // consider biome mask shift: shift points away from 0/0 if necessary Vector3 position = new Vector3(cell.Centroid.x + xmin, 0, cell.Centroid.y + zmin); // TODO: recalculate, might have changed because of clipping // consider biome mask shift: shift points away from 0/0 if necessary List <Vector3> nodes = cell.Vertices.Select(item => new Vector3(item.x + xmin, 0, item.y + zmin)).ToList(); // apply random shape if requested if (editor.extension.shapeSettings.randomShape) { nodes = ShapeCreator.CreateRandomShape(nodes, // editor.extension.shapeSettings.RandomConvexity, // editor.extension.shapeSettings.keepOriginalPoints, // editor.extension.shapeSettings.RandomPointsCount, // editor.extension.shapeSettings.randomAngle, // editor.extension.shapeSettings.douglasPeuckerReductionTolerance); } return(nodes); }
/// <summary> /// Draw the mean vector point for all cells. /// </summary> private void DrawMeanVector() { // bounding box Vector[] clipPolygon = null; if (cbClipAtBounds.IsChecked.GetValueOrDefault()) { clipPolygon = GetClipPolygon(clipAtBoundsMargin); } // get all cells List <Cell> allCells = graph.GetAllVoronoiCells(clipPolygon); // iterate through all cells and draw the mean vector point foreach (Cell cell in allCells) { Vector meanVector = DelaunayVoronoiGraph.GetMeanVector(cell); DrawPoint(meanVector, Brushes.Green); } }