Exemplo n.º 1
0
        void GenerateRiver()
        {
            var param = new RiverParameter
            {
                ChunkSize                      = parameter.chunkSize,
                NumberOfChunk                  = parameter.numberOfChunk,
                HeadwaterIsOutside             = parameter.headwaterIsOutside,
                MinInitialWidth                = parameter.minInitialRiverWidth,
                MaxInitialWidth                = parameter.maxInitialRiverWidth,
                AngleRange                     = parameter.angleRange,
                StepSize                       = parameter.riverStepSize,
                MinInitialBranchingProbability = parameter.minInitialBranchingProbability,
                MaxInitialBranchingProbability = parameter.maxInitialBranchingProbability,
                MinNumStepWithoutBranching     = parameter.minNumStepWithoutBranching,
                MaxNumStepWithoutBranching     = parameter.maxNumStepWithoutBranching,
                BendabilityAttenuation         = parameter.bendabilityAttenuation,
            };

            river.Generate(param, random);
            fieldPoints.AddRange(river.Points);
        }
Exemplo n.º 2
0
        public void Generate(RiverParameter parameter, System.Random random)
        {
            lastInterruptionTime = System.DateTime.Now;

            this.parameter          = parameter;
            this.random             = random;
            width                   = Mathf.Lerp(parameter.MinInitialWidth, parameter.MaxInitialWidth, (float)random.NextDouble());
            branchingProbability    = CalcBranchingProbability();
            numStepWithoutBranching = CalcNumStepWithoutBranching();

            points.Clear();
            vertices.Clear();
            riverPointsMap.Clear();
            leftRightPoints.Clear();
            pointLevels.Clear();
            quadranglesMap.Clear();

            Vector3 initialPosition = DecideInitialPosition();
            float   initialAngle    = DecideInitialAngle(initialPosition);

            rootPoint          = new RiverPoint();
            rootPoint.Position = initialPosition;
            rootPoint.Width    = width;
            AddToPointMap(rootPoint);

            var     step       = new Vector3(0, 0, parameter.StepSize);
            Vector3 initialDir = Quaternion.Euler(0, initialAngle, 0) * step;

            minAngleForBranching = Mathf.Atan2(width * 0.5f, parameter.StepSize) * Mathf.Rad2Deg * 2;
            canBranch            = parameter.AngleRange >= minAngleForBranching;

            GenerateRiverRecursive(rootPoint, initialDir, 1);

            ConnectPoints();
            for (int i0 = 0; i0 < leftRightPoints.Count - 1; ++i0)
            {
                if (pointLevels[i0 + 1] - pointLevels[i0] == 1)
                {
                    Vector3 point1, point2, point3, point4;
                    point1 = leftRightPoints[i0][0];
                    point2 = leftRightPoints[i0 + 1][0];
                    point3 = leftRightPoints[i0 + 1][1];
                    point4 = leftRightPoints[i0][1];
                    Vector2Int chunk1, chunk2, chunk3, chunk4;
                    chunk1 = GetChunk(point1);
                    chunk2 = GetChunk(point2);
                    chunk3 = GetChunk(point3);
                    chunk4 = GetChunk(point4);
                    var chunks = new List <Vector2Int>();
                    chunks.Add(chunk1);
                    if (chunk2 != chunk1)
                    {
                        chunks.Add(chunk2);
                    }
                    if (chunk3 != chunk1 && chunk3 != chunk2)
                    {
                        chunks.Add(chunk3);
                    }
                    if (chunk4 != chunk1 && chunk4 != chunk2 && chunk4 != chunk3)
                    {
                        chunks.Add(chunk4);
                    }

                    for (int i1 = 0; i1 < chunks.Count; ++i1)
                    {
                        Vector2Int       chunk = chunks[i1];
                        List <Vector3[]> quadrangles;
                        if (quadranglesMap.TryGetValue(chunk, out quadrangles) == false)
                        {
                            quadrangles = new List <Vector3[]>();
                            quadranglesMap.Add(chunk, quadrangles);
                        }
                        quadrangles.Add(new Vector3[] { point1, point2, point3, point4 });
                    }
                }
            }
        }