Exemplo n.º 1
0
        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);
            });
        }
Exemplo n.º 2
0
        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);
            });
        }