private void CreateChildBranches(BuildBranch buildBranch, Vector2 baseBranchPosition, Size baseBranchSize, Size size, float baseBranchAngle, float childAngle, int iteration) { if (iteration == Iterations) return; var childCount = ChildBranchCount + (int) (ChildBranchCount * Rand.Float(ChildBranchCountRandomFactor) * Rand.Sign()); var baseBranchVector = VectorKit.AngleToVector(baseBranchAngle) * baseBranchSize.Height; var startPosition = baseBranchPosition + baseBranchVector * ChildStartPositionRatio; var endPosition = baseBranchPosition + baseBranchVector * ChildEndPositionRatio; var p = startPosition; var positions = new List<Vector2>(); for (var i = 0; i < childCount; i++) { p += (endPosition - p) / (childCount - i - 1); positions.Add(p); } var s = size * ChildSizeRatio; s = s + s * Rand.Float(ChildSizeRandomFactor) * Rand.Sign(); var a = baseBranchAngle + childAngle * (childCount - 1) / 2; for (var i = 0; i < childCount; i++) { var localAngle = a + a * Rand.Float(ChildBranchAngleRandomFactor) * Rand.Sign(); CreateBranch(buildBranch, positions[i], s, localAngle, childAngle * ChildBranchAngleSoftenFactor, iteration + 1); a -= childAngle; } }
private void CreateBranch(BuildBranch buildBranch, Vector2 position, Size size, float angle, float childAngle, int iteration) { buildBranch(position, size, angle); CreateChildBranches(buildBranch, position, size, size, angle, childAngle, iteration); }
public void Build(BuildBranch buildBranch) { buildBranch(TrunkPosition, TrunkSize, TrunkAngle); CreateChildBranches(buildBranch, TrunkPosition, TrunkSize, BranchStartSize, TrunkAngle, ChildBranchAngle, 0); }