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); }
public Heightmap(BaseScalarField height) { Contract.Requires(height != null); _gradient = new Gradient(height); }
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)); } } }
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)); }
public Inverse(IVector2Field field) { Contract.Requires(field != null); _field = field; }