matlab 三边测量,三边测量的定位算法,matlab转为c
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
%三边测量的定位算法
%dA,dB,dC为A,B,C到未知节点(假定坐标[x,y]未知)的模拟测量距离
A = [0,0];
B = [25,25*sqrt(3)];
C = [50,0];
dA=51/sqrt(3);
dB=51/sqrt(3);
dC=51/sqrt(3);
%A,B,C为三个选定的信标节点,节点坐标已知(为便于防真及验证,代码中采用的等边三角形)
%定义未知坐标x,y为符号变量
syms x y;
%距离方程,以信标节点为圆心,信标节点到未知节点的测量距离为半径作三个圆
f1 = (A(1)-x)^2+(A(2)-y)^2-dA^2;
f2 = (B(1)-x)^2+(B(2)-y)^2-dB^2;
f3 = (C(1)-x)^2+(C(2)-y)^2-dC^2;
%任两个方程联立,求任两圆交点
s1 = solve(f1,f2); %求A,B两圆的交点
s2 = solve(f2,f3); %求B,C两圆的交点
s3 = solve(f1,f3); %求A,C两圆的交点
%将结果(符号变量)转换为双精度数值
x1 = double(s1.x);
y1 = double(s1.y);
x2 = double(s2.x);
y2 = double(s2.y);
x3 = double(s3.x);
y3 = double(s3.y);
%选择内侧的三个交点
%两圆相交于两点,距第三个圆心近的为选定交点Pab,Pbc,Pac
d1(1) = sqrt(((C(1)-x1(1))^2+(C(2)-y1(1))^2));
d1(2) = sqrt(((C(1)-x1(2))^2+(C(2)-y1(2))^2));
if d1(1) <= d1(2)
Pab(1) = x1(1);
Pab(2) = y1(1);
else
Pab(1) = x1(2);
Pab(2) = y1(2);
end
d2(1) = sqrt(((A(1)-x2(1))^2+(A(2)-y2(1))^2));
d2(2) = sqrt(((A(1)-x2(2))^2+(A(2)-y2(2))^2));
if d2(1) <= d2(2)
Pbc(1) = x2(1);
Pbc(2) = y2(1);
else
Pbc(1) = x2(2);
Pbc(2) = y2(2);
end
d3(1) = sqrt(((B(1)-x3(1))^2+(B(2)-y3(1))^2));
d3(2) = sqrt(((B(1)-x3(2))^2+(B(2)-y3(2))^2));
if d3(1) <= d3(2)
Pac(1) = x3(1);
Pac(2) = y3(1);
else
Pac(1) = x3(2);
Pac(2) = y3(2);
end
%求三个圆内侧三个交点Pab,Pbc,Pac的质心,即为未知节点P,完成定位
P(1) = (Pab(1)+Pbc(1)+Pac(1))/3;
P(2) = (Pab(2)+Pbc(2)+Pac(2))/3;
转为c的代码如下
编译链接环境VC6.0
代码如下:
//三边测量的定位算法
//dA,dB,dC为A,B,C到未知节点(假定坐标[x,y]未知)的模拟测量距离
#include
#include
struct point_t
{
double x;
double y;
};
struct circle_t
{
struct point_t center;//圆心
double r;//半径
};
int double_equals(double const a, double const b)
{
static const double ZERO = 1e-9;
return fabs(a - b) < ZERO;
}
double distance_sqr(struct point_t const* a, struct point_t const* b)
{
return (a->x - b->x) * (a->x - b->x) + (a->y - b->y) * (a->y - b->y);
}
double distance(struct point_t const* a, struct point_t const* b)
{
return sqrt(distance_sqr(a, b));
}
double distance_pow(double x1,double y1,double x2,double y2)
{
return pow((x1-x2),2) + pow((y1-y2),2);
}
int insect(struct circle_t circles[], struct point_t points[])
{
double d, a, b, c, p, q, r;
double cos_value[2], sin_value[2];
if (double_equals(circles[0].center.x, circles[1].center.x)
&& double_equals(circles[0].center.y, circles[1].center.y)
&& double_equals(circles[0].r, circles[1].r))
{
return -1;
}
d = distance(&circles[0].center, &circles[1].center);
if (d > circles[0].r + circles[1].r
|| d < fabs(circles[0].r - circles[1].r))
{
return 0;
}
a = 2.0 * circles[0].r * (circles[0].center.x - circles[1].center.x);
b = 2.0 * circles[0].r * (circles[0].center.y - circles[1].center.y);
c = circles[1].r * circles[1].r - circles[0].r * circles[0].r
- distance_sqr(&circles[0].center, &circles[1].center);
p = a * a + b * b;
q = -2.0 * a * c;
if (double_equals(d, circles[0].r + circles[1].r)
|| double_equals(d, fabs(circles[0].r - circles[1].r))){
cos_value[0] = -q / p / 2.0;
sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);
points[0].x = circles[0].r * cos_value[0] + circles[0].center.x;
points[0].y = circles[0].r * sin_value[0] + circles[0].center.y;
if (!double_equals(distance_sqr(&points[0], &circles[1].center),circles[1].r * circles[1].r))
{
points[0].y = circles[0].center.y - circles[0].r * sin_value[0];
}
return 1;
}
r = c * c - b * b;
cos_value[0] = (sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
cos_value[1] = (-sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);
sin_value[1] = sqrt(1 - cos_value[1] * cos_value[1]);
points[0].x = circles[0].r * cos_value[0] + circles[0].center.x;
points[1].x = circles[0].r * cos_value[1] + circles[0].center.x;
points[0].y = circles[0].r * sin_value[0] + circles[0].center.y;
points[1].y = circles[0].r * sin_value[1] + circles[0].center.y;
if (!double_equals(distance_sqr(&points[0], &circles[1].center),circles[1].r * circles[1].r))
{
points[0].y = circles[0].center.y - circles[0].r * sin_value[0];
}
if (!double_equals(distance_sqr(&points[1], &circles[1].center),circles[1].r * circles[1].r))
{
points[1].y = circles[0].center.y - circles[0].r * sin_value[1];
}
if (double_equals(points[0].y, points[1].y)&& double_equals(points[0].x, points[1].x))
{
if (points[0].y > 0)
{
points[1].y = -points[1].y;
}
else
{
points[0].y = -points[0].y;
}
}
return 2;
}
void main()
{
point_t Pab;
point_t Pbc;
point_t Pac;
point_t A;
point_t B;
point_t C;
double dA,dB,dC;
A.x = 0.0; //圆心
A.y = 0.0;
B.x = 25.0; //圆心
B.y = 25.0*sqrt(3);
C.x = 50.0; //圆心
C.y = 0.0;
dA = 51.0/sqrt(3);//半径
dB = 51.0/sqrt(3);//半径
dC = 51.0/sqrt(3);//半径
//A,B,C为三个选定的信标节点,节点坐标已知(为便于防真及验证,代码中采用的等边三角形)
//定义未知坐标x,y为符号变量
//距离方程,以信标节点为圆心,信标节点到未知节点的测量距离为半径作三个圆
struct circle_t circles_AB[2];
struct point_t points_AB[2];
circles_AB[0].center.x = A.x;
circles_AB[0].center.y = A.y;
circles_AB[0].r = dA;
circles_AB[1].center.x = B.x;
circles_AB[1].center.y = B.y;
circles_AB[1].r = dB;
switch (insect(circles_AB, points_AB))
{
case -1:
printf("THE CIRCLES ARE THE SAME\n");
break;
case 0:
printf("NO INTERSECTION\n");
break;
case 1:
printf("(%.3lf %.3lf)\n", points_AB[0].x, points_AB[0].y);
break;
case 2:
printf("求A,B两圆的交点为\n");
printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_AB[0].x, points_AB[0].y,
points_AB[1].x, points_AB[1].y);
}
//printf("(%.3lf %.3lf %.3lf)\n", A.x, A.y,dA);
//printf("(%.3lf %.3lf %.3lf)\n", B.x, B.y,dA);
//printf("(%.3lf %.3lf %.3lf)\n", C.x, C.y,dA);
double points_AB_0 = distance_pow(points_AB[0].x,points_AB[0].y,C.x,C.y);
double points_AB_1 = distance_pow(points_AB[1].x,points_AB[1].y,C.x,C.y);
if(points_AB_0 < points_AB_1)
{
Pab.x = points_AB[0].x;
Pab.y = points_AB[0].y;
}
else
{
Pab.x = points_AB[1].x;
Pab.y = points_AB[1].y;
}
struct circle_t circles_BC[2];
struct point_t points_BC[2];
circles_BC[0].center.x = B.x;
circles_BC[0].center.y = B.y;
circles_BC[0].r = dB;
circles_BC[1].center.x = C.x;
circles_BC[1].center.y = C.y;
circles_BC[1].r = dC;
switch (insect(circles_BC, points_BC))
{
case -1:
printf("THE CIRCLES ARE THE SAME\n");
break;
case 0:
printf("NO INTERSECTION\n");
break;
case 1:
printf("(%.3lf %.3lf)\n", points_BC[0].x, points_BC[0].y);
break;
case 2:
printf("求B,C两圆的交点为\n");
printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_BC[0].x, points_BC[0].y,
points_BC[1].x, points_BC[1].y);
}
double points_BC_0 = distance_pow(points_BC[0].x,points_BC[0].y,A.x,A.y);
double points_BC_1 = distance_pow(points_BC[1].x,points_BC[1].y,A.x,A.y);
if(points_BC_0 < points_BC_1)
{
Pbc.x = points_BC[0].x;
Pbc.y = points_BC[0].y;
}
else
{
Pbc.x = points_BC[1].x;
Pbc.y = points_BC[1].y;
}
struct circle_t circles_AC[2];
struct point_t points_AC[2];
circles_AC[0].center.x = A.x;
circles_AC[0].center.y = A.y;
circles_AC[0].r = dA;
circles_AC[1].center.x = C.x;
circles_AC[1].center.y = C.y;
circles_AC[1].r = dC;
switch (insect(circles_AC, points_AC))
{
case -1:
printf("THE CIRCLES ARE THE SAME\n");
break;
case 0:
printf("NO INTERSECTION\n");
break;
case 1:
printf("(%.3lf %.3lf)\n", points_AC[0].x, points_AC[0].y);
break;
case 2:
printf("求A,C两圆的交点为\n");
printf("(%.3lf %.3lf) (%.3lf %.3lf)\n",points_AC[0].x, points_AC[0].y,
points_AC[1].x, points_AC[1].y);
}
double points_AC_0 = distance_pow(points_AC[0].x,points_AC[0].y,B.x,B.y);
double points_AC_1 = distance_pow(points_AC[1].x,points_AC[1].y,B.x,B.y);
if(points_AC_0 < points_AC_1)
{
Pac.x = points_AC[0].x;
Pac.y = points_AC[0].y;
}
else
{
Pac.x = points_AC[1].x;
Pac.y = points_AC[1].y;
}
double P_1,P_2;
P_1 = (Pab.x + Pbc.x + Pac.x)/3.0;
P_2 = (Pab.y + Pbc.y + Pac.y)/3.0;
printf("三个圆内侧三个交点Pab,Pbc,Pac的质心为\n");
printf("(%.3lf %.3lf)\n", P_1, P_2);
}
matlab 三边测量,三边测量的定位算法,matlab转为c相关推荐
- aoa定位算法matlab仿真,基于信号到达角度(AOA)的定位算法研究
内容摘要:基于信号到达角度(AOA)的定位算法是一种常见的无线传感器网络节点自定位算法,算法通信开销低,定位精度较高.由于各种原因,估测的多个节点位置可能存在不可靠位置,提出了一种改进的基于信号到达角 ...
- 伪距定位算法(matlab版)
在各种伪距定位算法中,最小二乘法是一种比较简单而广泛的方法,该算法可以分为以下几步: 1.准备数据与设置初始值 这里准备数据,主要是对于各颗可见卫星,收集到它们在同一时刻的伪距测量值,计算测量值的各项 ...
- 在matlab下实现TDOA定位算法性能仿真
一.题目 TDOA定位算法性能仿真 二.仿真要求 要求一:编写两个函数TDOA_CHAN和TDOA_Taylor得到位置的估计. 要求二:用RMSE实现两种算法的性能比较, 得到两种算法的RMSE曲线 ...
- 【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】
一.基于粒子滤波污染源定位简介 粒子滤波定位算法是目前最精准定位可移动物体的位置,由于水域的流动,工业固体废物污染源很可能随着水流移动位置,基于粒子滤波算法将污染物定位分为预测.测量以及重新采样可大大 ...
- 【定位问题】基于RSSI均值的等边三角形定位算法matlab系统
1 简介 为了提高无线传感网络的定位精度从提高测量精度.改善信标N点分布的角度提出了一种基于RSSI均值的等边三角形定位算法.该算法引入信号强指( RSSI)敏感区和非敏感区概念采用高斯模型对非敏感区 ...
- tdoa/aoa定位的扩展卡尔曼滤波定位算法matlab源码,TDOA/AOA定位的扩展卡尔曼滤波定位跟踪算法Matlab源码...
TDOA/AOA定位是无线定位领域里使用得最多的一种定位体制,扩展卡尔曼滤波器是最经典的非线性滤波算法,可用于目标的定位和动态轨迹跟踪,GreenSim团队实现了该算法,本源码由GreenSim团队原 ...
- matlab控制算法C语言,PID算法Matlab仿真程序和C程序
<PID算法Matlab仿真程序和C程序>由会员分享,可在线阅读,更多相关<PID算法Matlab仿真程序和C程序(6页珍藏版)>请在人人文库网上搜索. 1.增量式PID控制算 ...
- 分裂层次聚类matlab实现,凝聚层次聚类算法matlab源码
<凝聚层次聚类算法matlab源码>由会员分享,可在线阅读,更多相关<凝聚层次聚类算法matlab源码(3页珍藏版)>请在人人文库网上搜索. 1.共享一个在数据挖掘课程中作为示 ...
- croppos分割点位置matlab,关于指纹中心点定位的matlab程序,跪求高人指点!!
在网上找了一基于matlab的指纹中心点定位的程序,看不太懂,哪位高人来指点一下图像从哪个地方输入才是正确的,跪谢!! function [Outputprint,XofCenter,YofCente ...
- 超宽带定位算法matlab,毕业设计_--超宽带(UWB)无线定位技术.doc
毕 业 设 计 题目: 超宽带(UWB)无线定位技术 学 校 院 系 专 业 姓 名 学 号 2012 年 6 月 论文题目: 超宽带(UWB)无线通信技术 专 业: 学 生: 签名: 指导教师: 签 ...
最新文章
- 我的个人博客搭建记录
- 利用ISA Server 2006服务器阵列构建高性能、高可靠的企业防火墙
- apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数
- 文档声明和HTML样式表
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
- 最近打算学习windows核心编程
- PSTN和互联网——无线接入与定位(1)
- html5+php调用android手机图片,HTML5拍照上传图片Phonegap封装HTML5调用Android相机拍照上传到PHP端...
- pythonmysql包_[Python] MySQLdb(即 MySQL-python 包)在 OS X 中安装指南
- Oracle 11gR2 GI基本安装手册
- 2021认证杯 第二阶段 思路加代码
- Learning Modality-Specific Representation with Self-Supervised Mulit-Task Learning for MSA
- QT 如何在背景图中将部分区域设置为透明
- python初级课程-辛舒展-专题视频课程
- 机器学习项目:泰坦尼克号幸存者预测
- 【记录】螺栓连接——预紧力
- 真正实现网络下载,文件不落地.解决XmlHttp对象、winnet.dll、URLDownloadToFile生成的ie缓存(Hook_CreateFileW阻止缓存生成)
- 科学家与艺术家心中都装着什么
- 说说Teams里的Card
- mysql导出数据到csv的方式