Unity3D C#数学系列之求点到直线的距离 |
您所在的位置:网站首页 › 圆上点到直线最大值和最小值计算 › Unity3D C#数学系列之求点到直线的距离 |
目录
1. 引言2. 法一(角度法)2.1 分析2.2 代码2.2.1 求两点的距离2.2.2 向量的点积求夹角2.2.3 完整代码
3. 法二(面积法)3.1 分析3.2 代码
4 项目
1. 引言
之前写的博客里面有好多坑没有填,以后慢慢填吧。 最近想到可以总结点和数学相关的东西,自己觉得挺有意思的。目前想到的可以总结点有: 求空间中一点到两点所在直线的距离求空间过一点到两点所在直线的垂线求两条直线的交点已知一个圆,并给出圆上一点,求该点在圆上的切线求三点所在平面的法线方向判断一点是否在圆弧范围内判断一点是否在矩形内部判断一点是否在长方体、球体、圆柱体内部网格绘制长方体、球体、胶囊体这里,我们先看看"求空间中一点到两点所在直线的距离"。 这里给出两种方法来计算,我测试了下,其实两种方式的效率差不多。 2. 法一(角度法) 2.1 分析
直接使用Vector3.Distance,即可求出。 float distance = Vector3.Distance(a, b); 2.2.2 向量的点积求夹角直接看公式。 这里有一点要注意,Mathf.Acos求出的θ是用弧度值(rad)表示的,弧度值和我们平时喜欢用的0°、180°的关系是 Π弧度 = 180° 如下表 度0°90°180°270°360°弧度0Π/2Π3Π/22Π在代码中弧度值和角度值的换算直接乘以Mathf.Rad2Deg(弧度值转换为角度值,2表示to的意思)或Mathf.Deg2Rad(角度值转换为弧度值),如下。 // 弧度值转换为角度值 float angle = seitaRad * Mathf.Rad2Deg; // 角度值转换为弧度值 float rad = angle * Mathf.Deg2Rad; 2.2.3 完整代码 private float DistanceFromPoint2Line(Vector3 p, Vector3 p1, Vector3 p2) { // 求A2B的距离 float p2pDistance = Vector3.Distance(p2, p); // 或者使用 p2p.magnitude Vector3 p2p1 = p2 - p1; Vector3 p2p = p2 - p; // 求p2p1·p2p float dotResult = Vector3.Dot(p2p1, p2p); // 求θ float seitaRad = Mathf.Acos(dotResult / (p2p1.magnitude * p2pDistance)); // 求p点到p1p2的距离 float distance = p2pDistance * Mathf.Sin(seitaRad); return distance; } 3. 法二(面积法) 3.1 分析如图,我们先做条辅助线,A2A1’,A2A1’与A2A1互相垂直。 效果如下。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |