示例#1
0
        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;
            }
        }
示例#2
0
 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);
 }
示例#3
0
 public void Build(BuildBranch buildBranch)
 {
     buildBranch(TrunkPosition, TrunkSize, TrunkAngle);
     CreateChildBranches(buildBranch, TrunkPosition, TrunkSize, BranchStartSize, TrunkAngle, ChildBranchAngle, 0);
 }