Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
BoundingBox.cs
浏览该文件的文档.
1namespace Engine {
2 public struct BoundingBox : IEquatable<BoundingBox> {
3 public Vector3 Min;
4
5 public Vector3 Max;
6
7 public IEnumerable<Vector3> Corners {
8 get {
9 yield return new Vector3(Min.X, Min.Y, Min.Z);
10 yield return new Vector3(Max.X, Min.Y, Min.Z);
11 yield return new Vector3(Min.X, Max.Y, Min.Z);
12 yield return new Vector3(Max.X, Max.Y, Min.Z);
13 yield return new Vector3(Min.X, Min.Y, Max.Z);
14 yield return new Vector3(Max.X, Min.Y, Max.Z);
15 yield return new Vector3(Min.X, Max.Y, Max.Z);
16 yield return new Vector3(Max.X, Max.Y, Max.Z);
17 }
18 }
19
20 public BoundingBox(float x1, float y1, float z1, float x2, float y2, float z2) {
21 Min = new Vector3(x1, y1, z1);
22 Max = new Vector3(x2, y2, z2);
23 }
24
25 public BoundingBox(Vector3 min, Vector3 max) {
26 Min = min;
27 Max = max;
28 }
29
30 public BoundingBox(IEnumerable<Vector3> points) {
31 ArgumentNullException.ThrowIfNull(points);
32 Min = new Vector3(float.PositiveInfinity);
33 Max = new Vector3(float.NegativeInfinity);
34 foreach (Vector3 point in points) {
35 Min.X = MathF.Min(Min.X, point.X);
36 Min.Y = MathF.Min(Min.Y, point.Y);
37 Min.Z = MathF.Min(Min.Z, point.Z);
38 Max.X = MathF.Max(Max.X, point.X);
39 Max.Y = MathF.Max(Max.Y, point.Y);
40 Max.Z = MathF.Max(Max.Z, point.Z);
41 }
42 if (Min.X == float.PositiveInfinity) {
43 throw new ArgumentException("points");
44 }
45 }
46
47 public static implicit operator BoundingBox((float X1, float Y1, float Z1, float X2, float Y2, float Z2) v) =>
48 new(v.X1, v.Y1, v.Z1, v.X2, v.Y2, v.Z2);
49
50 public override bool Equals(object obj) => obj is BoundingBox box && Equals(box);
51
52 public override int GetHashCode() => Min.GetHashCode() + Max.GetHashCode();
53
54 public override string ToString() => $"{Min},{Max}";
55
56 public bool Equals(BoundingBox other) => Min == other.Min && Max == other.Max;
57
58 public Vector3 Center() => new(0.5f * (Min.X + Max.X), 0.5f * (Min.Y + Max.Y), 0.5f * (Min.Z + Max.Z));
59
60 public Vector3 Size() => Max - Min;
61
62 public float Volume() {
63 Vector3 vector = Size();
64 return vector.X * vector.Y * vector.Z;
65 }
66
67 public bool Contains(Vector3 p) => p.X >= Min.X && p.X <= Max.X && p.Y >= Min.Y && p.Y <= Max.Y && p.Z >= Min.Z && p.Z <= Max.Z;
68
69 public bool Intersection(BoundingBox box) => box.Max.X >= Min.X
70 && box.Min.X <= Max.X
71 && box.Max.Y >= Min.Y
72 && box.Min.Y <= Max.Y
73 && box.Max.Z >= Min.Z
74 && box.Min.Z <= Max.Z;
75
76 public bool Intersection(BoundingSphere sphere) {
77 if (sphere.Center.X - Min.X > sphere.Radius
78 && sphere.Center.Y - Min.Y > sphere.Radius
79 && sphere.Center.Z - Min.Z > sphere.Radius
80 && Max.X - sphere.Center.X > sphere.Radius
81 && Max.Y - sphere.Center.Y > sphere.Radius
82 && Max.Z - sphere.Center.Z > sphere.Radius) {
83 return true;
84 }
85 float num = 0f;
86 if (sphere.Center.X - Min.X <= sphere.Radius) {
87 num += (sphere.Center.X - Min.X) * (sphere.Center.X - Min.X);
88 }
89 else if (Max.X - sphere.Center.X <= sphere.Radius) {
90 num += (sphere.Center.X - Max.X) * (sphere.Center.X - Max.X);
91 }
92 if (sphere.Center.Y - Min.Y <= sphere.Radius) {
93 num += (sphere.Center.Y - Min.Y) * (sphere.Center.Y - Min.Y);
94 }
95 else if (Max.Y - sphere.Center.Y <= sphere.Radius) {
96 num += (sphere.Center.Y - Max.Y) * (sphere.Center.Y - Max.Y);
97 }
98 if (sphere.Center.Z - Min.Z <= sphere.Radius) {
99 num += (sphere.Center.Z - Min.Z) * (sphere.Center.Z - Min.Z);
100 }
101 else if (Max.Z - sphere.Center.Z <= sphere.Radius) {
102 num += (sphere.Center.Z - Max.Z) * (sphere.Center.Z - Max.Z);
103 }
104 return num <= sphere.Radius * sphere.Radius;
105 }
106
108 Vector3 min = Vector3.Max(b1.Min, b2.Min);
109 Vector3 max = Vector3.Min(b1.Max, b2.Max);
110 return !(max.X > min.X) || !(max.Y > min.Y) || !(max.Z > min.Z) ? default : new BoundingBox(min, max);
111 }
112
113 public static BoundingBox Union(BoundingBox b1, BoundingBox b2) {
114 Vector3 min = Vector3.Min(b1.Min, b2.Min);
115 Vector3 max = Vector3.Max(b1.Max, b2.Max);
116 return new BoundingBox(min, max);
117 }
118
119 public static BoundingBox Union(BoundingBox b, Vector3 p) {
120 Vector3 min = Vector3.Min(b.Min, p);
121 Vector3 max = Vector3.Max(b.Max, p);
122 return new BoundingBox(min, max);
123 }
124
125 public static float Distance(BoundingBox b, Vector3 p) {
126 float num = MathUtils.Max(b.Min.X - p.X, 0f, p.X - b.Max.X);
127 float num2 = MathUtils.Max(b.Min.Y - p.Y, 0f, p.Y - b.Max.Y);
128 float num3 = MathUtils.Max(b.Min.Z - p.Z, 0f, p.Z - b.Max.Z);
129 return MathF.Sqrt(num * num + num2 * num2 + num3 * num3);
130 }
131
133 Transform(ref b, ref m, out BoundingBox result);
134 return result;
135 }
136
137 public static void Transform(ref BoundingBox b, ref Matrix m, out BoundingBox result) {
138 Vector3[] sourceArray = [
139 new(b.Min.X, b.Min.Y, b.Min.Z),
140 new(b.Max.X, b.Min.Y, b.Min.Z),
141 new(b.Min.X, b.Max.Y, b.Min.Z),
142 new(b.Max.X, b.Max.Y, b.Min.Z),
143 new(b.Min.X, b.Min.Y, b.Max.Z),
144 new(b.Max.X, b.Min.Y, b.Max.Z),
145 new(b.Min.X, b.Max.Y, b.Max.Z),
146 new(b.Max.X, b.Max.Y, b.Max.Z)
147 ];
148 Vector3[] array = new Vector3[8];
149 Vector3.Transform(sourceArray, 0, ref m, array, 0, 8);
150 result = new BoundingBox(array);
151 }
152
153 public static bool operator ==(BoundingBox a, BoundingBox b) => a.Equals(b);
154
155 public static bool operator !=(BoundingBox a, BoundingBox b) => !a.Equals(b);
156 }
157}
Engine.Vector3 Vector3
static int Max(int x1, int x2)
BoundingBox(Vector3 min, Vector3 max)
BoundingBox(IEnumerable< Vector3 > points)
static float Distance(BoundingBox b, Vector3 p)
static BoundingBox Transform(BoundingBox b, Matrix m)
override string ToString()
static BoundingBox Union(BoundingBox b1, BoundingBox b2)
bool Intersection(BoundingBox box)
bool Intersection(BoundingSphere sphere)
static bool operator==(BoundingBox a, BoundingBox b)
BoundingBox(float x1, float y1, float z1, float x2, float y2, float z2)
bool Equals(BoundingBox other)
static BoundingBox Union(BoundingBox b, Vector3 p)
static bool operator!=(BoundingBox a, BoundingBox b)
override int GetHashCode()
override bool Equals(object obj)
bool Contains(Vector3 p)
static BoundingBox Intersection(BoundingBox b1, BoundingBox b2)
static void Transform(ref BoundingBox b, ref Matrix m, out BoundingBox result)
IEnumerable< Vector3 > Corners
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Max(Vector3 v, float f)
static Vector3 Min(Vector3 v, float f)