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();
}
}
}