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); }
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); }
// 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; } }
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); }
internal void Add(VisualTopoData topoData) { Data.Add(topoData); topoData.Set = this; topoData.IsSectionStart = this.Data.Count == 1; }
public Vector4 GetColor(VisualTopoData currentNode, Vector3 position) => currentNode.Set.Color;
/// <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); }