Exemple #1
0
 public Seed(Vector2 point, IVector2Field field, IVector2Field alternativeField)
     : this()
 {
     Point            = point;
     Field            = field;
     AlternativeField = alternativeField;
 }
        public static IVector2Field Inverse(this IVector2Field field)
        {
            Contract.Requires(field != null);
            Contract.Ensures(Contract.Result <IVector2Field>() != null);

            return(new Inverse(field));
        }
        public static Vector2 TraceVectorField(this IVector2Field field, Vector2 position, Vector2 previous, float maxSegmentLength)
        {
            Contract.Requires(field != null);
            Contract.Requires(maxSegmentLength > 0);

            var first = previous;

            //Extended naieve tracing (accumulate naieve traces, stop once we hit sample OR length limit)
            float lengthSum = 0;
            var   result    = Vector2.Zero;

            for (var i = 0; i < 10 && lengthSum < maxSegmentLength; i++)
            {
                var d = field.SingleTraceVectorField(position, previous);
                var l = d.Length();
                lengthSum += d.Length();
                result    += d;
                previous   = d;

                //escape if the curvature is too much
                if (Vector2.Dot(first, d / l) < 0.9961f)
                {
                    break;
                }
            }

            return(result);
        }
        private static Vector2 SingleTraceVectorField(this IVector2Field field, Vector2 position, Vector2 previous)
        {
            Contract.Requires(field != null);

            //Naieve tracing
            //return field.CorrectedSample(position, previous);

            //RK4
            var k1 = field.CorrectedSample(position, previous);
            var k2 = field.CorrectedSample(position + k1 / 2f, previous);
            var k3 = field.CorrectedSample(position + k2 / 2f, previous);
            var k4 = field.CorrectedSample(position + k3, previous);

            return(CorrectVectorDirection(k1 / 6f + k2 / 3f + k3 / 3f + k4 / 6f, previous));
        }
        private ResampleAndRescale(Vector2[,] major, Vector2 min, Vector2 max)
        {
            _min  = min;
            _size = max - min;

            _zeroSize = (Math.Abs(_size.X) < float.Epsilon || Math.Abs(_size.Y) < float.Epsilon);

            if (_zeroSize)
            {
                return;
            }

            _majorEigenVectors = major;

            _xLength = major.GetLength(0) - 1;
            _yLength = major.GetLength(1) - 1;

            _minor = new EigenAccessor(true, this);
            _major = new EigenAccessor(false, this);
        }
Exemple #6
0
        public Heightmap(BaseScalarField height)
        {
            Contract.Requires(height != null);

            _gradient = new Gradient(height);
        }
Exemple #7
0
        private static IEnumerable <Seed> RandomSeedsInBounds(Func <double> random, int count, IVector2Field major, IVector2Field minor, Vector2 min, Vector2 max, Func <Vector2, bool> isOutOfBounds)
        {
            var extent = (max - min);

            for (int i = 0; i < count; i++)
            {
                var p = new Vector2((float)random() * extent.X, (float)random() * extent.Y) + min;
                if (isOutOfBounds(p))
                {
                    i--;
                }
                else
                {
                    yield return(new Seed(p, major, minor));
                }
            }
        }
Exemple #8
0
        private static IEnumerable <Seed> SeedsAlongEdge(Region region, BaseScalarField distanceField, IVector2Field major, IVector2Field minor)
        {
            float   d        = 0;
            Vector2?previous = null;

            foreach (var vertex in region.Vertices)
            {
                if (previous.HasValue)
                {
                    var pos    = previous.Value;
                    var v      = vertex - previous.Value;
                    var length = v.Length();
                    var dir    = v / length;

                    for (int i = 0; i < length; i++)
                    {
                        var separation = distanceField.Sample(pos + dir * i);
                        d += separation;
                        if (d >= separation)
                        {
                            yield return(new Seed(pos + dir * i, major, minor));

                            d -= separation;
                        }
                    }
                }
                previous = vertex;
            }
        }
        private static Vector2 CorrectedSample(this IVector2Field field, Vector2 position, Vector2 baseDirection)
        {
            Contract.Requires(field != null);

            return(CorrectVectorDirection(field.Sample(position), baseDirection));
        }
Exemple #10
0
        public Inverse(IVector2Field field)
        {
            Contract.Requires(field != null);

            _field = field;
        }