public void Build(TracingConfiguration config, Func <double> random, INamedDataCollection metadata, Vector2 min, Vector2 max) { Contract.Requires(config != null); Contract.Requires(random != null); Contract.Requires(metadata != null); if (!_begun) { Begin(min, max); AddBoundary(min, max); } var extent = max - min; var eigens = config.TensorField.Presample(min, max, (uint)Math.Max(extent.X, extent.Y)); var count = (int)((extent.X * extent.Y) / 2500); Func <Vector2, bool> isOutOfBounds = v => v.X > max.X || v.X <min.X || v.Y> max.Y || v.Y < min.Y; var seeds = RandomSeedsInBounds(random, count, eigens.MajorEigenVectors, eigens.MinorEigenVectors, min, max, isOutOfBounds); Build(seeds, min, max, config.SeparationField, true, true, config.SegmentLength, config.MergeDistance, config.CosineSearchConeAngle, isOutOfBounds, null, s => { s.Width = (uint)config.RoadWidth.SelectIntValue(random, metadata); LinearReduction(s); }); }
public void Build(TracingConfiguration config, Func <double> random, INamedDataCollection metadata, Region region) { Contract.Requires(config != null); Contract.Requires(random != null); Contract.Requires(metadata != null); Contract.Requires(region != null); //var extent = region.Max - region.Min; //var eigens = config.TensorField.Presample(new Vector2(region.Min.X, region.Min.Y), new Vector2(region.Max.X, region.Max.Y), (int)Math.Max(extent.X, extent.Y)); var ex = _max - _min; var eigens = config.TensorField.Presample(_min, _max, (uint)Math.Max(ex.X, ex.Y)); var seeds = SeedsAlongEdge(region, config.SeparationField, eigens.MajorEigenVectors, eigens.MinorEigenVectors); Build(seeds, region.Min, region.Max, config.SeparationField, true, true, config.MergeDistance, config.SegmentLength, config.CosineSearchConeAngle, p => !region.PointInPolygon(p), e => e.Streamline.Region == region, s => { s.Width = (uint)config.RoadWidth.SelectIntValue(random, metadata); s.Region = region; LinearReduction(s); }); }