using DevExpress.XtraCharts.Native;
|
using DevExpress.XtraDiagram.Bars;
|
|
namespace Yw.WinFrmUI.HydroL3d
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public partial class Network
|
{
|
|
/// <summary>
|
/// 判断是否存在
|
/// </summary>
|
public bool IsExist(string id)
|
{
|
return _parters.Exists(x => x.Id == id);
|
}
|
|
/// <summary>
|
/// 获取包围盒
|
/// </summary>
|
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)
|
};
|
}
|
|
/// <summary>
|
/// 获取中心点
|
/// </summary>
|
public Point3d GetCenter(BoundingBox3d boundingBox)
|
{
|
if (boundingBox == null)
|
{
|
boundingBox = GetBoundingBox();
|
}
|
return boundingBox.GetCenter();
|
}
|
|
/// <summary>
|
/// 获取转换
|
/// </summary>
|
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 = -boundingBox.Max.Z * 3f
|
};
|
}
|
|
/// <summary>
|
/// 获取旋转信息
|
/// </summary>
|
/// <returns></returns>
|
public Point3d GetRotation()
|
{
|
return new Point3d();
|
}
|
|
/// <summary>
|
/// 缩放
|
/// </summary>
|
public Point3d GetScale()
|
{
|
return new Point3d() { X = 1f, Y = 1f, Z = 1f };
|
}
|
|
/// <summary>
|
/// 获取观察信息
|
/// </summary>
|
public LookAt3d GetLookAt(BoundingBox3d boundingBox, Point3d center)
|
{
|
if (boundingBox == null)
|
{
|
boundingBox = GetBoundingBox();
|
}
|
if (center == null)
|
{
|
center = boundingBox.GetCenter();
|
}
|
return new LookAt3d()
|
{
|
Eye = new Point3d(center.X, center.Y, center.Z),
|
Center = new Point3d(center.X, center.Y, center.Z),
|
Up = new Point3d(0, 1, 0)
|
};
|
}
|
|
/// <summary>
|
/// 获取透视信息
|
/// </summary>
|
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
|
};
|
}
|
|
|
/// <summary>
|
/// 获取参数
|
/// </summary>
|
/// <returns></returns>
|
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,
|
};
|
}
|
|
/// <summary>
|
/// 绘制
|
/// </summary>
|
public void Draw(SharpGL.OpenGL gl)
|
{
|
foreach (var link in this.Links)
|
{
|
link.Draw(gl);
|
}
|
foreach (var node in this.Nodes)
|
{
|
node.Draw(gl);
|
}
|
}
|
|
/// <summary>
|
/// 选择
|
/// </summary>
|
public List<Parter> 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();
|
}
|
|
/// <summary>
|
/// 悬停
|
/// </summary>
|
public List<Parter> 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();
|
}
|
|
|
|
}
|
}
|