using System.Security.Cryptography; using System.Text; using SharpDX; using SparkClient.Model.Enums; namespace SparkClient.Model.Entity; /// /// 三角形 /// public class Viewport3DTriangleEntity { /// /// 点1 /// public Vector3 Point1 { get; set; } /// /// 点2 /// public Vector3 Point2 { get; set; } /// /// 点3 /// public Vector3 Point3 { get; set; } /// /// 三角形代码[生成] /// 按顺序:p1.x,p1.y,p1.z;p2.x,p2.y,p2.z;p3.x,p3.y,p3.z 拼接后使用生成大写16位md5 /// public String TriangleCode { get; set; } /// /// 面代码 /// 由多个三角形组成的面的代码:entity1、entity2组成了一个正方形,那么他俩的TriangleCode属性值一致 /// public String PlaneCode { get; set; } /// /// 面类型 /// 比如这个面时钻石的腰部分,那么type统一,当面类型为err时则该面是一个异常面 /// 可选值:PlaneType /// public PlaneType PlaneType { get; set; } public static Viewport3DTriangleEntity CreateByString(string str) { if (string.IsNullOrWhiteSpace(str)) { throw new ArgumentException("Input string cannot be null or empty"); } // 分割为四段 var parts = str.Split('|'); if (parts.Length != 4) { throw new ArgumentException("Input string format is incorrect. Expected 4 parts separated by '|'."); } // 解析第一段:坐标 var coordinates = parts[0].Split(';'); if (coordinates.Length != 3) { throw new ArgumentException("Coordinates part must contain exactly 3 points separated by ';'."); } var points = coordinates.Select(ParseVector3).ToArray(); // 解析第二段:TriangleCode [内部标记] // 解析第三段:PlaneCode string planeCode = parts[2]; if (string.IsNullOrWhiteSpace(planeCode)) { throw new ArgumentException("PlaneCode cannot be null or empty"); } // 解析第四段:PlaneType if (!int.TryParse(parts[3], out int planeTypeValue) || !Enum.IsDefined(typeof(PlaneType), planeTypeValue)) { throw new ArgumentException("Invalid PlaneType value"); } PlaneType planeType = (PlaneType)planeTypeValue; // 生成 TriangleCode 格式:p1.x,p1.y,p1.z;p2.x,p2.y,p2.z;p3.x,p3.y,p3.z 生成 MD5 string concatenatedPoints = string.Join(";", points.Select(p => $"{p.X},{p.Y},{p.Z}")); string generatedTriangleCode = GenerateMD5Hash(concatenatedPoints); return new Viewport3DTriangleEntity { Point1 = points[0], Point2 = points[1], Point3 = points[2], TriangleCode = generatedTriangleCode, PlaneCode = planeCode, PlaneType = planeType }; } // public static Viewport3DTriangleEntity CreateByJsonStr(string str) // { // // } private static Vector3 ParseVector3(string coordinate) { var values = coordinate.Split(','); if (values.Length != 3) { throw new ArgumentException("Each coordinate must contain exactly 3 values separated by ','"); } if (!float.TryParse(values[0], out float x) || !float.TryParse(values[1], out float y) || !float.TryParse(values[2], out float z)) { throw new ArgumentException("Coordinate values must be valid floating-point numbers"); } return new Vector3(x, y, z); } public static string GenerateMD5Hash(string input) { using (var md5 = MD5.Create()) { var inputBytes = Encoding.UTF8.GetBytes(input); var hashBytes = md5.ComputeHash(inputBytes); // 转换为大写的16位十六进制字符串 return string.Concat(hashBytes.Take(8).Select(b => b.ToString("X2"))); } } }