using Island.StandardLib.Storage; using System; namespace Island.StandardLib.Math { public struct Cube3f : IStorable { float _XStart, _XEnd, _YStart, _YEnd, _ZStart, _ZEnd; public float XStart { get { return _XStart; } set { _XStart = value; if (_XEnd < _XStart) { float f = _XEnd; _XEnd = _XStart; _XStart = f; } } } public float YStart { get { return _YStart; } set { _YStart = value; if (_YEnd < _YStart) { float f = _YEnd; _YEnd = _YStart; _YStart = f; } } } public float ZStart { get { return _ZStart; } set { _ZStart = value; if (_ZEnd < _ZStart) { float f = _ZEnd; _ZEnd = _ZStart; _ZStart = f; } } } public float XEnd { get { return _XEnd; } set { _XEnd = value; if (_XEnd < _XStart) { float f = _XEnd; _XEnd = _XStart; _XStart = f; } } } public float YEnd { get { return _YEnd; } set { _YEnd = value; if (_YEnd < _YStart) { float f = _YEnd; _YEnd = _YStart; _YStart = f; } } } public float ZEnd { get { return _ZEnd; } set { _ZEnd = value; if (_ZEnd < _ZStart) { float f = _ZEnd; _ZEnd = _ZStart; _ZStart = f; } } } /// /// 以完整格式初始化 /// /// X起始点 /// X终点 /// Y起始点 /// Y终点 /// Z起始点 /// Z终点 public Cube3f(float xStart, float xEnd, float yStart, float yEnd, float zStart, float zEnd) { _XStart = xStart; _XEnd = xEnd; _YStart = yStart; _YEnd = yEnd; _ZStart = zStart; _ZEnd = zEnd; Trim(); } /// /// 以三边长度初始化,并将起始点设为 /// /// X长度 /// Y长度 /// Z长度 public Cube3f(float xlen, float ylen, float zlen) { _XStart = _YStart = _ZStart = 0f; _XEnd = xlen; _YEnd = ylen; _ZEnd = zlen; } /// /// 以三边长度初始化,并将起始点设为 /// /// 三边长度 public Cube3f(Vector3 size) { _XStart = _YStart = _ZStart = 0f; _XEnd = size.x; _YEnd = size.y; _ZEnd = size.z; } void Trim() { if (_XEnd < _XStart) { float f = _XEnd; _XEnd = _XStart; _XStart = f; } if (_YEnd < _YStart) { float f = _YEnd; _YEnd = _YStart; _YStart = f; } if (_ZEnd < _ZStart) { float f = _ZEnd; _ZEnd = _ZStart; _ZStart = f; } } /// /// 获取三边长度 /// public Vector3 Length { get { return new Vector3(_XEnd - _XStart, _YEnd - _YStart, _ZEnd - _ZStart); } } /// /// 获取或设置起始点 /// public Vector3 Start { get { return new Vector3(_XStart, _YStart, _ZStart); } set { Vector3 delta = value.RED(Start); _XEnd += delta.x; _YEnd += delta.y; _ZEnd += delta.z; _XStart = value.x; _YStart = value.y; _ZStart = value.z; } } /// /// 获取和设置终点 /// public Vector3 End { get { return new Vector3(_XEnd, _YEnd, _ZEnd); } set { Vector3 delta = value.RED(End); _XStart += delta.x; _YStart += delta.y; _ZStart += delta.z; _XEnd = value.x; _YEnd = value.y; _ZEnd = value.z; } } /// /// 获取和设置底面中心点 /// public Vector3 BottomCenter { get { Vector3 hfsize = Length.MUL(0.5f); return new Vector3(_XStart + hfsize.x, _YStart, _ZStart + hfsize.z); } set { Vector3 hfsize = Length.MUL(0.5f); hfsize.y = 0; Start = value.RED(hfsize); } } /// /// 测试此是否包含指定的点 /// /// /// public bool ContainPoint(Vector3 pt) { return pt.x >= _XStart && pt.x <= _XEnd && pt.y >= _YStart && pt.y <= _YEnd && pt.z >= _ZStart && pt.z <= _ZEnd; } /// /// 测试此是否与指定的相交 /// /// /// public bool ContainCube(Cube3f cb) { if (cb.XStart > XEnd) return false; if (cb.XEnd < XStart) return false; if (cb.YStart > YEnd) return false; if (cb.YEnd < YStart) return false; if (cb.ZStart > ZEnd) return false; if (cb.ZEnd < ZStart) return false; return true; } public void WriteToData(DataStorage data) { data.Write(_XStart); data.Write(_XEnd); data.Write(_YStart); data.Write(_YEnd); data.Write(_ZStart); data.Write(_ZEnd); } public void ReadFromData(DataStorage data) { data.Read(out _XStart); data.Read(out _XEnd); data.Read(out _YStart); data.Read(out _YEnd); data.Read(out _ZStart); data.Read(out _ZEnd); } public static Cube3f operator +(Cube3f cube, Vector3 vec) { return new Cube3f( cube.XStart + vec.x, cube.XEnd + vec.x, cube.YStart + vec.y, cube.YEnd + vec.y, cube.ZStart + vec.z, cube.ZEnd + vec.z); } public static Cube3f operator -(Cube3f cube, Vector3 vec) { return new Cube3f( cube.XStart - vec.x, cube.XEnd - vec.x, cube.YStart - vec.y, cube.YEnd - vec.y, cube.ZStart - vec.z, cube.ZEnd - vec.z); } } }