コード例 #1
0
        public IList <LineSegment> Subdivide(Vector2 x, Vector2 y)
        {
            float per    = 1;
            var   points = new List <Vector2> {
                x, y
            };

            var oc = getOctaveAccordingToLength(x, y);

            for (int o = 0; o < oc; o++)
            {
                var newPts = new List <Vector2>();
                for (int i = 0; i < points.Count - 1; i++)
                {
                    var cur  = points[i];
                    var next = points[i + 1];

                    var dif  = next - cur;
                    var perp = Vector2.Normalize(new Vector2(dif.Y, -dif.X));

                    // TODO deterministicaly sort point
                    var a        = cur.X < next.X ? cur :next;
                    var b        = cur.X >= next.X ? cur : next;
                    var curSeed  = _random.NextD((int)a.X, (int)a.Y) * 1000;
                    var nextSeed = _random.NextD((int)b.X, (int)b.Y) * 1000;

                    float   moverRand = (_random.NextD((int)curSeed, (int)nextSeed) - .5f * _amplitude * per * 2);
                    Vector2 mover     = perp * moverRand;
                    var     newPoint  = cur + dif * .5f + mover;

                    newPts.Add(cur);
                    newPts.Add(newPoint);
                }

                newPts.Add(points[points.Count - 1]);
                points = newPts;

                per *= _persistance;
            }

            var lines = new List <LineSegment>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                var cur  = points[i];
                var next = points[i + 1];

                lines.Add(new LineSegment(cur, next));
            }
            return(lines);
        }
コード例 #2
0
ファイル: DiamondSquare.cs プロジェクト: jaroslavknotek/ts
        public ILayerMasked Do(INoiseParameters param, Vector2 size)
        {
            var dt = DateTime.Now.Millisecond;

            System.Diagnostics.Debug.Print(dt + "Rand" + _rand.NextD(1, 2));

            var           pow      = (int)JryMath.Max(JryMath.Ceil(JryMath.Log(size.X, 2)), JryMath.Ceil(JryMath.Log(size.Y, 2)));
            int           sizePow2 = (int)JryMath.Pow(2, pow) + 1;
            Layer2DObject layer    = new Layer2DObject(sizePow2, sizePow2);

            setupBaseDS(sizePow2, layer, _rand);
            var par = param.BaseAmplitude * param.Amplitude;

            ds(layer, sizePow2, par, param, _rand);


            var croped = new Layer2DObject(size);

            for (int y = 0; y < size.Y; y++)
            {
                for (int x = 0; x < size.X; x++)
                {
                    croped[x, y] = layer[x, y];
                }
            }
            return(croped);
        }
コード例 #3
0
ファイル: DiamondSquare.cs プロジェクト: jaroslavknotek/ts
        private static float rnd(IRandom2 r, int x, int y)
        {
            var rr = r.NextD(x, y);

            return(rr - .5f);
        }