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 LookAt3d GetLookAt()
{
return new LookAt3d()
{
Eye = new Point3d(0, 0, 0),
Center = new Point3d(0, 0, 0),
Up = new Point3d(0, 1, 0)
};
}
///
/// 获取透视信息
///
public Perspective3d GetPerspective(LookAt3d lookAt, SharpGL.OpenGLControl openglControl = null)
{
if (lookAt == null)
{
lookAt = GetLookAt();
}
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 bufferFactor = 1.2f;
var aspect = 1.25f;
if (openglControl != null)
{
aspect = (float)openglControl.Width / (float)openglControl.Height;
}
var near = minDistance * bufferFactor;
var far = maxDistance * bufferFactor;
return new Perspective3d()
{
Fovy = 45f,
Aspect = aspect,
Near = near,
Far = far
};
}
///
/// 获取旋转信息
///
///
public Point3d GetRotation()
{
return new Point3d();
}
///
/// 获取转换
///
public Point3d GetTranslation(BoundingBox3d boudingBox, Point3d center)
{
if (boudingBox == null)
{
boudingBox = GetBoundingBox();
}
if (center == null)
{
center = GetCenter(boudingBox);
}
var zBufferFactor = 3f;
return new Point3d()
{
X = -center.X,
Y = -center.Y,
Z = -boudingBox.Max.Z * zBufferFactor
};
}
///
/// 获取参数
///
///
public NetworkParas GetParas(SharpGL.OpenGLControl openglControl = null)
{
var boundingBox = GetBoundingBox();
var center = boundingBox.GetCenter();
var lookAt = GetLookAt();
var perspective = GetPerspective(lookAt, openglControl);
var rotation = GetRotation();
var translation = GetTranslation(boundingBox, center);
return new NetworkParas()
{
BoundingBox = boundingBox,
Ceneter = center,
Perspective = perspective,
LookAt = lookAt,
Rotation = rotation,
Translation = translation
};
}
}
}