圆柱体
1.绘制圆柱体,计算圆柱体表面某一点的法向量。
1 r=5; 2 h=10; 3 n=100;%分点数 4 radius = 1.0;%搜索半径 5 min_neighbors = 8; 6 %------------------------------- 7 n_h= floor(h/(r*2*pi/n)); 8 X=zeros(n,n_h); 9 Y=zeros(n,n_h); 10 Z=zeros(n,n_h); 11 for j=1:n_h 12 for i=1:n 13 X(i,j)=r*cos(i*2*pi/n); 14 Y(i,j)=r*sin(i*2*pi/n); 15 Z(i,j)=j*r*2*pi/n; 16 end 17 end 18 19 data=zeros(n*n_h,3); 20 data(:,1)=reshape(X,[n*n_h,1]); 21 data(:,2)=reshape(Y,[n*n_h,1]); 22 data(:,3)=reshape(Z,[n*n_h,1]); 23 tree=KDTreeSearcher(data); 24 query=[X(50,20),Y(50,20),Z(50,20)]; 25 hold on 26 plot3(X,Y,Z,'r.','MarkerSize',1) 27 plot3(query(:,1),query(:,2),query(:,3),'b.','MarkerSize',4) 28 idx = rangesearch(tree, query, radius); 29 idxs = idx{1}; 30 neighbors = [data(idxs(:),1) data(idxs(:),2) data(idxs(:),3)]; 31 if size(neighbors) < min_neighbors 32 normal = {1}; 33 return; 34 end 35 C = cov(neighbors);% 计算协方差矩阵 36 [v, lambda] = eig(C); 37 [~, i_min] = min(diag(lambda)); 38 [~, i_max] = max(diag(lambda)); 39 normal = v(:,i_min) ./ norm(v(:,i_min)); 40 normal_max = v(:,i_max) ./ norm(v(:,i_max)); 41 query1=[normal(1,1)+ query(1,1),normal(2,1)+ query(1,2),normal(3,1)+ query(1,3)]; 42 query2=[normal_max(1,1)+ query(1,1),normal_max(2,1)+ query(1,2),normal_max(3,1)+ query(1,3)]; 43 plot3([query1(1,1) query(1,1)],[query1(1,2) query(1,2)],[query1(1,3) query(1,3)],'LineWidth',1); 44 plot3([query2(1,1) query(1,1)],[query2(1,2) query(1,2)],[query2(1,3) query(1,3)],'LineWidth',1); 45 46 47 hold off 48 axis equal
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2014-12-25 几个想法
2013-12-25 空间直角坐标系与球面坐标互转