Matlab之过球面一点的平面方程

embedded/2024/11/28 2:55:36/

这篇文章描述2件事情:

1、已知球面上任意点,求过该点、地心、与北极点的平面方程(即过该点的经线平面方程);

2、绕过球心的任意轴旋转平面得到新平面的方程

一、已知球面上任意点,求过该点、地心、与北极点的平面方程(即过该点的经线平面方程

输入经纬度,输出过该点,穿过地心、与北极点的平面方程,输出参数是平面方程的参数。

平面方程基本形式为:A*X+B*Y+C*Z+D=0 

%% 已知球面上任意点,求过该点、地心、与北极点的平面方程(即过该点的经线平面方程)
%% 输入参数:任意点的经纬度(LNG,LAT)
%% 输出参数:平面方程的参数,平面方程的表达式为A*X+B*Y+C*Z+D=0
function [A,B,C,D]=GPS2EQPlane(LNG,LAT)
%% 地理常数
R=6371;%地球半径,单位km%% 经纬度转地理坐标系坐标
xt=R*cosd(LAT)*cosd(LNG);
yt=R*cosd(LAT)*sind(LNG);
zt=R*sind(LAT);%% 平面计算
% 计算单位法向量
nx = -yt/(sqrt(xt^2+yt^2));
ny = xt/(sqrt(xt^2+yt^2));
nz = 0;% 法向量
n = [nx; ny; nz];%% 求解平面方程的参数形式
A = n(1);
B = n(2);
C = n(3);
D = -(A * xt + B * yt + C * zt);
end

二、绕过球心的任意轴旋转平面得到新平面

%% 绕过球心的任意轴旋转平面得到新平面
% 输入参数
% P:球面上的一点坐标,在直角坐标系下(x,y,z)
% N:原平面的法向量
% theta:绕旋转轴旋转的角度,单位度
% 输出参数:新平面的参数A*X+B*Y+C*Z+D=0
function [newA, newB, newC, newD] = rotatePlane(P, N, theta)
%% 地理常数
R=6371;%地球半径,单位km%% 计算点 P到球心的向量
OP = P; % 假设球心在原点,P 是点 P 的笛卡尔坐标
% 旋转轴的单位化
A = OP / norm(OP);%% 计算右乘旋转矩阵
C=cosd(theta);
S=sind(theta);
R=[C+A(1)^2*(1-C) A(1)*A(2)*(1-C)-A(3)*S A(1)*A(3)*(1-C)+A(2)*S;A(1)*A(2)*(1-C)+A(3)*S C+A(2)^2*(1-C) A(2)*A(3)*(1-C)-A(1)*S;A(1)*A(3)*(1-C)-A(2)*S A(2)*A(3)*(1-C)+A(1)*S C+A(3)^2*(1-C)];%% 旋转原平面的法向量
rotated_N = N*R;%% 计算新的平面方程的系数
newA = rotated_N(1);
newB = rotated_N(2);
newC = rotated_N(3);
newD = -(newA * P(1) + newB * P(2) + newC * P(3));
end

三、示例

3.1 代码1示例

以海南凤凰机场为例:

三亚凤凰国际机场位于经度:109.414871、纬度:18.303421。

3.1.1 测试代码

clc;clear;close all
%% 经纬度和地理坐标系的转换仿真
%% 输入参数
R=6371;%地球半径,单位km
lng=109.414871;%经度
lat=18.303421;%纬度%% 算法计算
xt=R*cosd(lat)*cosd(lng);
yt=R*cosd(lat)*sind(lng);
zt=R*sind(lat);%% 结果展示(绘制三维球体地图)
plot_Globe%% 结果展示(绘制三维点)
% 绘制三维点图
plot3(xt, yt, zt, 'o', 'MarkerSize', 10, 'MarkerEdgeColor', 'r', 'MarkerFaceColor', 'g');%% 平面计算
[A,B,C,D]=GPS2EQPlane(lng,lat);
%% 结果展示(绘制三维面)
plot_plane(A,B,C,D, 7000);% %% 旋转平面
% theta =90; % 旋转角度
% [newA, newB, newC, newD] = rotatePlane([xt yt zt],[A B C], theta);% %% 结果展示(绘制三维面)
% plot_plane(newA, newB, newC, newD, 7000);

3.1.2 结果展示

3.2 代码二示例

以经度:0、纬度:0为例:

3.1.1 测试代码

clc;clear;close all
%% 经纬度和地理坐标系的转换仿真
%% 输入参数
R=6371;%地球半径,单位km
lng=109.414871;%经度
lat=18.303421;%纬度%% 算法计算
xt=R*cosd(lat)*cosd(lng);
yt=R*cosd(lat)*sind(lng);
zt=R*sind(lat);%% 结果展示(绘制三维球体地图)
plot_Globe%% 结果展示(绘制三维点)
% 绘制三维点图
plot3(xt, yt, zt, 'o', 'MarkerSize', 10, 'MarkerEdgeColor', 'r', 'MarkerFaceColor', 'g');%% 平面计算
[A,B,C,D]=GPS2EQPlane(lng,lat);
% %% 结果展示(绘制三维面)
% plot_plane(A,B,C,D, 7000);%% 旋转平面
theta =45; % 旋转角度
[newA, newB, newC, newD] = rotatePlane([xt yt zt],[A B C], theta);%% 结果展示(绘制三维面)
plot_plane(newA, newB, newC, newD, 7000);

3.1.2 结果展示

旋转45度后

旋转90度后

旋转180度后


http://www.ppmy.cn/embedded/5271.html

相关文章

深度学习基础——卷积神经网络的感受野、参数量、计算量

深度学习基础——卷积神经网络的感受野、参数量、计算量 深度学习在图像处理领域取得了巨大的成功,其中卷积神经网络(Convolutional Neural Networks,CNN)是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标&#…

基于CppHttpLib的Httpserver

1 背景 大多数嵌入式设备由于没有屏幕输出,只能通过Web页面来配置。这里利用CPPHttpLib来实现HttpServer。 2 HttpServer HttpServer是利用CPPHttpLib开源库实现的Http服务器CppHttpLib是基于C11的HTTP开源库,开源协议是MIT. CppHttpLib下载地址 2.1 …

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论:一般用inner join来改写in和exist,用left join来改写not in,not exist;(本文会比较内连接,包含in子句的子查询,exist的性能 ) 1. 本文总结自高性能mysql 6…

第3章 数据

第3章 数据 学习笔记书后练习问题3问题7问题10问题11问题21 学习笔记 value value - 0; 通常用于将字符转换为其对应的整数值enum Jar_Type { CUP, PINT, QUART, HALF_GALLON, GALLON }; 这些符号名的实际值都是整型值,例如,CUP 是0,PINT …

戒烟生活记录

今天是2024年4月15日,从大前天也就是12号下班后,吃的有一点饱,就感觉身体及其难受,气短呼吸不上,我查了后可能是心脏的问题,并且晚上睡觉有一种呼吸不上,憋气的感觉,然后我就又开始决…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天,软件产品已经成为各行各业不可或缺的一部分。然而,随着软件功能的日益复杂和用户需求的不断增长,软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下,软件压力测试作为软件质量保障的重要手段之一&a…

第八章 透明效果

在渲染模型中控制透明通道。透明度为1,完全不透明;透明度为0,完全不会显示。 两种方法: (1)透明度测试 (2)透明度混合 深度缓冲(z-buffer)用于解决可见性问题。可以决定哪个物体的哪些部分被渲染到前面,哪些部分会被其他物体遮掩。根据深度缓存中的值来判断该片…

Linux的学习之路:9、冯诺依曼与进程(1)

摘要 本章主要是说一下冯诺依曼体系结构和进程的一部分东西。 目录 摘要 一、冯诺依曼体系结构 二、操作系统的概念 三、设计OS的目的 四、管理 五、进程的基本概念 六、PCB 七、在Linux环境下查看进程 八、使用代码创建进程 九、思维导图 一、冯诺依曼体系结构 如…