using OpenTK.Mathematics;
|
|
namespace Yw.WinFrmUI.Hydro
|
{
|
/// <summary>
|
/// 包围盒
|
/// </summary>
|
internal class BoundingBox3
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public BoundingBox3() { }
|
|
/// <summary>
|
///
|
/// </summary>
|
public BoundingBox3(Vector3 min, Vector3 max)
|
{
|
this.Min = min;
|
this.Max = max;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
public BoundingBox3(List<Vector3> pts)
|
{
|
Vector3 min = new(float.MaxValue);
|
Vector3 max = new(float.MinValue);
|
|
foreach (var pt in pts)
|
{
|
min = Vector3.ComponentMin(min, pt);
|
max = Vector3.ComponentMax(max, pt);
|
}
|
this.Min = min;
|
this.Max = max;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
public Vector3 Min { get; set; }
|
|
/// <summary>
|
///
|
/// </summary>
|
public Vector3 Max { get; set; }
|
|
/// <summary>
|
/// 中心点
|
/// </summary>
|
public Vector3 Center => (Min + Max) / 2f;
|
|
/// <summary>
|
/// 尺寸
|
/// </summary>
|
public Vector3 Size => Max - Min;
|
|
/// <summary>
|
/// 是否包含
|
/// </summary>
|
public bool Contains(Vector3 pt)
|
{
|
if (pt.X > this.Max.X || pt.X < this.Min.X)
|
{
|
return false;
|
}
|
if (pt.Y > this.Max.Y || pt.Y < this.Min.Y)
|
{
|
return false;
|
}
|
if (pt.Z > this.Max.Z || pt.Z < this.Min.Z)
|
{
|
return false;
|
}
|
|
return true;
|
}
|
|
|
/// <summary>
|
/// 计算
|
/// </summary>
|
public static BoundingBox3 Calculate(List<Vector3> pts)
|
{
|
if (pts == null || pts.Count < 1)
|
{
|
return default;
|
}
|
return new BoundingBox3(pts);
|
}
|
|
/// <summary>
|
/// 合并
|
/// </summary>
|
public static BoundingBox3 Merge(BoundingBox3 a, BoundingBox3 b)
|
{
|
return new BoundingBox3(
|
Vector3.ComponentMin(a.Min, b.Min),
|
Vector3.ComponentMin(a.Max, b.Max)
|
);
|
}
|
|
|
|
|
|
|
|
|
|
}
|
}
|