namespace Yw.WinFrmUI.HydroL3d { /// /// /// public partial class Network { /// /// 判断是否存在 /// public bool IsExist(string id) { return _parters.Exists(x => x.Id == id); } /// /// 获取包围盒 /// public BoundingBox3d GetBoundingBox() { var minX = float.MaxValue; var minY = float.MaxValue; var minZ = float.MaxValue; var maxX = float.MinValue; var maxY = float.MinValue; var maxZ = float.MinValue; foreach (var node in this.Nodes) { minX = Math.Min(minX, node.Position.X); minY = Math.Min(minY, node.Position.Y); minZ = Math.Min(minZ, node.Position.Z); maxX = Math.Max(maxX, node.Position.X); maxY = Math.Max(maxY, node.Position.Y); maxZ = Math.Max(maxZ, node.Position.Z); } return new BoundingBox3d() { Min = new Point3d(minX, minY, minZ), Max = new Point3d(maxX, maxY, maxZ) }; } /// /// 获取中心点 /// public Point3d GetCenter(BoundingBox3d boundingBox) { if (boundingBox == null) { boundingBox = GetBoundingBox(); } return boundingBox.GetCenter(); } /// /// 获取转换 /// public Point3d GetTranslation(BoundingBox3d boundingBox, Point3d center) { if (boundingBox == null) { boundingBox = GetBoundingBox(); } if (center == null) { center = GetCenter(boundingBox); } return new Point3d() { X = -center.X, Y = -center.Y, Z = -center.Z }; } /// /// 获取旋转信息 /// /// public Point3d GetRotation() { return new Point3d(); } /// /// 缩放 /// public Point3d GetScale() { return new Point3d() { X = 1f, Y = 1f, Z = 1f }; } /// /// 获取观察信息 /// public LookAt3d GetLookAt(BoundingBox3d boundingBox, Point3d center) { if (boundingBox == null) { boundingBox = GetBoundingBox(); } if (center == null) { center = boundingBox.GetCenter(); } return new LookAt3d() { Eye = new Point3d(0, 0, 3 * boundingBox.Max.Z), Center = new Point3d(0, 0, 0), Up = new Point3d(0, 1, 0) }; } /// /// 获取透视信息 /// public Perspective3d GetPerspective(BoundingBox3d boundingBox, Point3d center, LookAt3d lookAt, SharpGL.OpenGLControl openglControl = null) { if (boundingBox == null) { boundingBox = GetBoundingBox(); } if (center == null) { center = boundingBox.GetCenter(); } if (lookAt == null) { lookAt = GetLookAt(boundingBox, center); } var minDistance = float.MaxValue; var maxDistance = float.MinValue; foreach (var node in this.Nodes) { var distance = lookAt.Eye.Distance(node.Position); minDistance = MathF.Min(minDistance, distance); maxDistance = MathF.Max(maxDistance, distance); } var fovy = 45f; var aspect = 1.25f; if (openglControl != null) { aspect = (float)openglControl.Width / (float)openglControl.Height; } var bufferFactor = 1.2f; var near = minDistance / 100f; var far = maxDistance * 5f * bufferFactor; return new Perspective3d() { Fovy = fovy, Aspect = aspect, Near = near, Far = far }; } /// /// 获取参数 /// /// public NetworkParas GetParas(SharpGL.OpenGLControl openglControl = null) { var boundingBox = GetBoundingBox(); var center = boundingBox.GetCenter(); var translation = GetTranslation(boundingBox, center); var scale = GetScale(); var rotation = GetRotation(); var lookAt = GetLookAt(boundingBox, center); var perspective = GetPerspective(boundingBox, center, lookAt, openglControl); return new NetworkParas() { BoundingBox = boundingBox, Ceneter = center, Translation = translation, Rotation = rotation, Scale = scale, LookAt = lookAt, Perspective = perspective, }; } /// /// 绘制 /// public void Draw(SharpGL.OpenGL gl) { foreach (var link in this.Links) { link.Draw(gl); } foreach (var node in this.Nodes) { node.Draw(gl); } } /// /// 选择 /// public List Select(Point3d pt) { int i = 0; foreach (var node in this.Nodes) { node.Selected = node.Contains(pt); if (node.Selected) { i++; } } if (i > 0) { this.Links.ForEach(x => x.Selected = false); return this.Nodes.Where(x => x.Selected).Select(x => x as Parter).ToList(); } foreach (var link in this.Links) { link.Selected = link.Contains(pt); } return this.Links.Where(x => x.Selected).Select(x => x as Parter).ToList(); } /// /// 悬停 /// public List Hover(Point3d pt) { int i = 0; foreach (var node in this.Nodes) { node.Hovered = node.Contains(pt); if (node.Hovered) { i++; } } if (i > 0) { this.Links.ForEach(x => x.Hovered = false); return this.Nodes.Where(x => x.Hovered).Select(x => x as Parter).ToList(); } foreach (var link in this.Links) { link.Hovered = link.Contains(pt); } return this.Links.Where(x => x.Hovered).Select(x => x as Parter).ToList(); } } }