bool addNewMinaret() { Edge curEdge = freeEdges[Randomiser.intBetween(0, freeEdges.Count / 2)]; Junction junction = new Junction(Randomiser.pointOnEdge(curEdge), curEdge.axisDirection); Vector3 measurePoint = junction.position + 0.2f * curEdge.axisDirection; if (!checkJunction(measurePoint)) { return(false); } int distanceAlongEdge = Mathf.Min( Randomiser.measureDistance(measurePoint, GenericUtils.rotateClockwise(curEdge.axisDirection), maxLengthR / 2), Randomiser.measureDistance(measurePoint, -1 * GenericUtils.rotateClockwise(curEdge.axisDirection), maxLengthR / 2) ); if (distanceAlongEdge < minLengthS) { return(false); } int distanceAlongAxis = Randomiser.measureDistance(measurePoint, curEdge.axisDirection, minaretSize); if (distanceAlongAxis * 2 < minaretSize) { return(false); } distanceAlongAxis = Randomiser.clampInRange(distanceAlongAxis, minaretSize, (int)(distanceAlongEdge * 2)); MinaretFoundation minaret = minaretFromJunction(junction, curEdge.axisDirection, Mathf.Min(distanceAlongEdge * 2, distanceAlongAxis)); if (!checkMinaretConsistency(minaret)) { minaret.delete(); return(false); } if (!checkOverlaps(minaret)) { minaret.delete(); return(false); } minarets.Add(minaret); freeEdges.Remove(curEdge); usedEdges.Add(curEdge); return(true); }
bool checkMinaretConsistency(MinaretFoundation m) { return(m.isConsistent(minaretSize, minaretSize)); }