コード例 #1
0
        public Vector4 GetColor(VisualTopoData currentNode, Vector3 position)
        {
            float lerpAmout = _maxDepth == 0 ? 0 : Math.Abs(position.Z / _maxDepth);
            Hsv   hsvColor  = new Hsv(MathHelper.Lerp(0f, 360f, lerpAmout), 1, 1);
            var   rgb       = _colorConverter.ToRgb(hsvColor);

            return(new Vector4(rgb.R, rgb.G, rgb.B, 255));
            //return Vector4.Lerp(VectorsExtensions.CreateColor(0, 255, 255), VectorsExtensions.CreateColor(0, 255, 0), lerpAmout);
        }
コード例 #2
0
        private VisualTopoModel ParseSet(VisualTopoModel model, StreamReader sr, bool decimalDegrees, bool ignoreRadialBeams)
        {
            VisualTopoSet set = new VisualTopoSet();

            string setHeader = sr.ReadLine();

            if (setHeader.StartsWith("[Configuration "))
            {
                sr.ReadToEnd(); // skip until end of stream
                return(model);
            }

            // Set header
            var data        = setHeader.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            var headerSlots = data[0].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            set.Color = this.ParseColor(headerSlots);
            set.Name  = data.Length > 1 ? data[1].Trim() : string.Empty;

            sr.Skip(1);
            var dataLine = sr.ReadLine();

            do
            {
                VisualTopoData topoData = new VisualTopoData();

                var parts = dataLine.Split(';');
                if (parts.Length > 1)
                {
                    topoData.Comment = parts[1].Trim();
                }
                var slots = parts[0].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                //Debug.Assert(slots.Length == 13);

                // Parse data line
                topoData = this.ParseData(topoData, slots, decimalDegrees, ignoreRadialBeams);
                if (topoData != null)
                {
                    set.Add(topoData);
                }
                dataLine = sr.ReadLine();
            }while (!string.IsNullOrWhiteSpace(dataLine));

            model.Sets.Add(set);

            return(model);
        }
コード例 #3
0
        // Elevations
        public void ComputeCavityElevations(VisualTopoModel model, DEMDataSet dataset, float zFactor = 1)
        {
            var entryPoint4326 = model.EntryPoint.ReprojectTo(model.SRID, dataset.SRID);

            model.EntryPoint.Elevation = zFactor * _elevationService.GetPointElevation(entryPoint4326, dataset).Elevation ?? 0;

            foreach (var set in model.Sets.Where(s => s.Data.First().GeoPointLocal != null))
            {
                VisualTopoData setStartData = set.Data.First(d => d.GeoPointLocal != null);
                GeoPoint       dataPoint    = setStartData.GeoPointLocal.Clone();
                dataPoint.Longitude += model.EntryPoint.Longitude;
                dataPoint.Latitude  += model.EntryPoint.Latitude;
                var setStartPointDem = dataPoint.ReprojectTo(model.SRID, dataset.SRID);
                setStartData.TerrainElevationAbove = zFactor * _elevationService.GetPointElevation(setStartPointDem, dataset).Elevation ?? 0;
            }
        }
コード例 #4
0
        private VisualTopoData ParseData(VisualTopoData topoData, string[] slots, bool decimalDegrees, bool ignoreRadialBeams)
        {
            const string DefaultSize = "0.125";

            topoData.Entree = slots[0];
            topoData.Sortie = slots[1];

            if (topoData.Sortie == "*" && ignoreRadialBeams)
            {
                return(null);
            }

            topoData.Longueur   = float.Parse(slots[2], CultureInfo.InvariantCulture);
            topoData.Cap        = ParseAngle(float.Parse(slots[3], CultureInfo.InvariantCulture), decimalDegrees);
            topoData.Pente      = ParseAngle(float.Parse(slots[4], CultureInfo.InvariantCulture), decimalDegrees);
            topoData.CutSection = (left : float.Parse(slots[5] == "*" ? DefaultSize : slots[5], CultureInfo.InvariantCulture),
                                   right : float.Parse(slots[6] == "*" ? DefaultSize : slots[6], CultureInfo.InvariantCulture),
                                   up : float.Parse(slots[8] == "*" ? DefaultSize : slots[8], CultureInfo.InvariantCulture),
                                   down : float.Parse(slots[7] == "*" ? DefaultSize : slots[7], CultureInfo.InvariantCulture));

            return(topoData);
        }
コード例 #5
0
 internal void Add(VisualTopoData topoData)
 {
     Data.Add(topoData);
     topoData.Set            = this;
     topoData.IsSectionStart = this.Data.Count == 1;
 }
コード例 #6
0
 public Vector4 GetColor(VisualTopoData currentNode, Vector3 position) => currentNode.Set.Color;
コード例 #7
0
        /// <summary>
        /// // Make a rectangle perpendicual to direction centered on point (should be centered at human eye (y = 2m)
        /// </summary>
        /// <param name="triangulation"></param>
        /// <param name="current"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        private TriangulationList <Vector3> AddCorridorRectangleSection(TriangulationList <Vector3> triangulation, VisualTopoData current, VisualTopoData nextData, int startIndex, IColorCalculator colorFunc)
        {
            Vector3      next      = (nextData == null) ? current.VectorLocal : nextData.VectorLocal;
            GeoPointRays rays      = current.GeoPointLocal;
            Vector3      direction = (nextData == null) ? Vector3.UnitZ * -1 : next - current.VectorLocal;

            direction = (direction == Vector3.Zero) ? Vector3.UnitZ * -1 : direction;
            var position = current.VectorLocal;

            Vector3 side = Vector3.Normalize(Vector3.Cross(direction, Vector3.UnitY));

            if (IsInvalid(side))      // Vector3 is UnitY
            {
                side = Vector3.UnitX; // set it to UnitX
            }
            Vector3 up = Vector3.Normalize(Vector3.Cross(direction, side));

            if (IsInvalid(side) || IsInvalid(up))
            {
                return(triangulation);
            }
            //var m = Matrix4x4.CreateWorld(next, direction, Vector3.UnitZ);

            triangulation.Positions.Add(position - side * rays.Left - up * rays.Down);
            triangulation.Positions.Add(position - side * rays.Left + up * rays.Up);
            triangulation.Positions.Add(position + side * rays.Right + up * rays.Up);
            triangulation.Positions.Add(position + side * rays.Right - up * rays.Down);

            //Vector4 color = (colorIndex++) % 2 == 0 ? VectorsExtensions.CreateColor(0, 255, 0) : VectorsExtensions.CreateColor(0, 0, 255);

            triangulation.Colors.AddRange(Enumerable.Repeat(colorFunc.GetColor(current, position), 4));

            // corridor sides
            if (triangulation.NumPositions > 4)
            {
                int i         = startIndex; // triangulation.NumPositions - 8;
                int lastIndex = triangulation.NumPositions - 4;
                for (int n = 0; n < 4; n++)
                {
                    AddFace(ref triangulation, i + n, i + (n + 1) % 4
                            , lastIndex + n, lastIndex + (n + 1) % 4);
                }
            }
            return(triangulation);
        }