lixiaojun
6 天以前 fba4613d6b8dcbcaea6c7dc83bda14ed49d2f6de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using OpenTK.Mathematics;
 
namespace Yw.WinFrmUI.Hydro
{
    /// <summary>
    /// 包围盒辅助类
    /// </summary>
    internal class BoundingBox3Helper
    {
 
        /// <summary>
        /// 计算圆点包围盒
        /// </summary>
        /// <param name="pt">圆点</param>
        /// <param name="radius">半径</param>
        /// <returns></returns>
        public static BoundingBox3 CalcuPointBoundingBox(Vector3 pt, float radius)
        {
            var min = pt - new Vector3(radius);
            var max = pt + new Vector3(radius);
            return new BoundingBox3(min, max);
        }
 
        /// <summary>
        /// 计算圆柱体的轴对齐包围盒(AABB)
        /// </summary>
        public static BoundingBox3 CalcuLineBoundingBox(Vector3 start, Vector3 end, float width)
        {
            var radius = width / 2f;
            Vector3 dir = (end - start).Normalized();
            float dirX = dir.X, dirY = dir.Y, dirZ = dir.Z;
 
            // 计算各轴的端点和扩展量
            float minX = Math.Min(start.X, end.X);
            float maxX = Math.Max(start.X, end.X);
            float extensionX = radius * (float)MathF.Sqrt(1f - dirX * dirX);
            minX -= extensionX;
            maxX += extensionX;
 
            float minY = Math.Min(start.Y, end.Y);
            float maxY = Math.Max(start.Y, end.Y);
            float extensionY = radius * (float)MathF.Sqrt(1f - dirY * dirY);
            minY -= extensionY;
            maxY += extensionY;
 
            float minZ = Math.Min(start.Z, end.Z);
            float maxZ = Math.Max(start.Z, end.Z);
            float extensionZ = radius * (float)MathF.Sqrt(1f - dirZ * dirZ);
            minZ -= extensionZ;
            maxZ += extensionZ;
 
            return new BoundingBox3(new Vector3(minX, minY, minZ), new Vector3(maxX, maxY, maxZ));
        }
 
    }
}