点到3D圆的距离
发表于|更新于|算法
如下图所示,圆的中心为C0, 半径为R, 任意一点P0到圆的距离为D, P0到圆心的距离为L, 已知圆的法向量为vector, 其与C0P0的夹角为theta
则根据余玄定理可知:
D = sqrt(L^2+R^2-2*L*R*cos(90-theta))

相关推荐

8月 27 2014
Delaunay三角剖分
参考 code function Delaunary(pt) % 生成三角面片点云 edgeHull=ConvexHull(pt); figure,plot(pt(:,1),pt(:,2),'b.'),axis equal,hold on triout=[]; newIndex = -1; len = 1;len1= 1; index = 1; while index <= length(edgeHull) edge = edgeHull(index); index = index + 1; len = length(edgeHull); len1= length(triout); dex = [edge.start edge.end]; % 判断左三角形是否存在,存在,则判断右三角行 if edge.lefttri == -1 newIndex = -1; % 新选取点索引 angle12Max = 0; angle23Max = 0; ve...

1月 14 2015
Frenet标架及曲率挠率计算
此文算法基于马国庆等论文“点云空间曲线的微分信息计算及匹配方法”,引用请注明出处,在此感谢 ###Code function [curveture,fT,fN,fB]=Frenet_Curveture(pt,k) %计算连续曲线点的frenet标架及点的曲率 %参考:点云空间曲线的微分信息计算及匹配方法 %pt:三维点集 %k:领域大小 ptNum=size(pt,1); curveture=zeros(ptNum,1); hs=floor(k/2); fT=zeros(ptNum,3); fN=zeros(ptNum,3); fB=zeros(ptNum,3); for i=hs+1:ptNum-hs Rx=pt(i,:); pj=pt(i-hs:i+hs,:); % frenet 标架计算 centerDis = sum((pj-repmat(Rx,k,1)).^2,2); scenterDis=sort(centerDis); h=scenterDis((max(floor(k/3),1)+1)); thetaj=...

4月 25 2014
关于直线镜像矩阵生成
最近项目需求,在做关于直线镜像变换,网上看了一些,留作备份,以备追溯, 关于任意直线的对称变换 矩阵运算-矩阵投影,镜像,切变 以上两个是参考的两个帖子,由于我要用到关于任意直线Ax+By+C=0的镜像,采用了第一个说道的方法,并将其代码转换为矩阵表示,更加直观 对于直线ax+by+c=0有 M1=[b*b -a*b -a*c;-a*b a*a -b*c;0 0 0]/(a*a+b*b); M2=[-1 0 0;0 -1 0; 0 0 1]; M=M2*(E-M1)+M1; 其中M就是最后所求关于直线对称的镜像矩阵了

8月 27 2014
计算点云凸包
计算点云凸包其主要思路为:1)搜寻X坐标最小的点,在此称为startPoint,从该点开始搜寻下一点,本例中以逆时针方向来搜寻边界;2)现定义一个虚拟点(该点并不存在)位置为startPoint正北方向,该点与startPoint形成一个向量Vector1,下一点(判断是否为边界点的点,或称选取的点)与startPoint也形成一个向量Vector2,则判断该选取的点是外围边界点所要满足的条件为向量Vector2与向量Vector1之间的夹角最大;3)按同样的方式,新形成的向量Vector1为新选取的外围边界点与上一个外围边界点形成的向量,向量Vector2为选取的点与新选取的外围边界点形成的向量,判断该选取的点是外围边界点所要满足的条件仍然为向量Vector2与向量Vector1之间的夹角最大;4)按此思路循环进行,直到找到一个边界点与startPoint相同。 code: function out = ConvexHull(pt) % 获取二维点集凸包 len = size(pt,1); [~, minDex] = min(pt,[],1); startIndex = min...

5月 15 2014
任意点到斜椭圆最小距离
最近由于项目需求,要计算任意点到斜椭圆的距离,方程相信大家都知道怎么建立,但是它是一个4次方程,matlab都很不好解,写到程序中也很难,搜了很多帖子,都是只给方程,不给解的,其实原理大家都知道,如何用程序解才是大家关心的,所以一直都没有找到合理的答案,关键时刻还是google给力,度娘一般的东西还撮合,可学术性的、英文的确是一塌糊涂,网络上收集到这样一篇论文,我也是用这个算法最终解决我的问题的,它只使用与标准方程,斜椭圆只是多了平移和旋转操作而已。 ###第一象限中的点到标准椭圆的距离### double DistancePointEllipseSpecial(const double e[2], const double y[2], double x[2]) { double distance; if (y[1] > 0) { if (y[0] > 0) { // bisect to compute the root of F(t) for t >=...

8月 15 2014
根据旋转前后向量求旋转矩阵
如果已知旋转前后向量的变化,如何求旋转矩阵呢?1、旋转角度:已经旋转前向量P及旋转后向量Q,由点积定义可知 P.Q =|P| |Q| cos(theta) 2、旋转轴:由上可知,旋转角所在平面为P和Q构成的平面,那么旋转轴必定垂直于该平面, A X B =(a2b3-a3b2)i + (a3b1-a1b3)j + (a1b2-a2b1)k 3、根据罗德里格旋转公式求旋转矩阵 .png) 4、Code function RotateMatrix=F_GetRotateMatrix(vectsrc,vectdst) angle=acos(dot(vectsrc,vectdst)); vector=cross(vectsrc,vectdst); % normalization vector=vector/norm(vector); cost=cos(angle);sint=sin(angle); x=vector(1);y=vector(2);z=vector(3); ...
评论

