matlab 三边测量,三边测量的定位算法,matlab转为c

article/2025/11/10 10:40:32

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

%三边测量的定位算法

%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

代码如下:

078ac08a44eb7f46607b1d6f34060925.png

//三边测量的定位算法

//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);

}


http://chatgpt.dhexx.cn/article/vYdN3Q26.shtml

相关文章

定位算法-三边测距定位

作者&#xff1a;姜小明 github 日期&#xff1a;2020-09-06 关键字&#xff1a;RANSAC, Multilateral positioning, localization 上一篇文章&#xff08;《使用RANSAC的鲁棒TDOA Chan定位算法》&#xff09;中提到&#xff0c;如果我们知道当前位置到各个基站的距离&#x…

三边测距定位算法详解

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;平行机器人 | 赵得江 整理&#xff1a;李肖遥 通过GPS定位系统实现无人机的空中悬停定点飞行 “定位”这个概念我想大家并不陌生&#xff0c;可以说定位技术的迅猛发展给我们的日常生活带来了极大的便利。比如&#…

Android框架揭秘电子书pdf下载

Android框架揭秘下载链接: https://pan.baidu.com/s/1W1xrsC2-w5MgsrY-6i_cFg 提取码获取方式&#xff1a;关注下面微信公众号&#xff0c;回复关键字: 1119

Android初学之路—Android系统框架

从下到上依次为&#xff1a; 1.Linux内核&#xff08;Linux Kernel&#xff09; Android系统的最底层是基于Linux内核实现的&#xff0c;它负责硬件驱动、网络管理、电源管理、系统安全、内存管理等。例如它可以负责显示驱动、基于Linux的帧缓存驱动、键盘驱动、Flash驱动、摄…

《Android框架揭秘》——2.2节搭建Android平台编译环境

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.2节搭建Android平台编译环境&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 搭建Android平台编译环境Android框架揭秘…

《Android框架揭秘》——2.3节搭建Android SDK开发环境

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.3节搭建Android SDK开发环境&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.3 搭建Android SDK开发环境Android框架揭秘…

《Android框架揭秘》——2.4节开发Android应用程序

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.4节开发Android应用程序&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.4 开发Android应用程序Android框架揭秘在上一节…

《Android框架揭秘》——2.1节主机环境构成

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.1节主机环境构成&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.1 主机环境构成Android框架揭秘虽然Android开发环境多…

《Android框架揭秘》——1.2节通过启动过程分析Android Framework

本节书摘来自异步社区《Android框架揭秘》一书中的第1章&#xff0c;第1.2节通过启动过程分析Android Framework&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.2 通过启动过程分析Android Fra…

《Android框架揭秘》——2.5节应用程序Framework源码级别调试

本节书摘来自异步社区《Android框架揭秘》一书中的第2章&#xff0c;第2.5节应用程序Framework源码级别调试&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.5 应用程序Framework源码级别调试An…

《Android框架揭秘》读书笔记--在Java中调用C库函数

简介 以下试验在Ubuntu16.04 x86&#xff0c;jdk安装&#xff1a;sudo apt-get install openjdk-9-jdk-headless&#xff0c;原书介绍的是在win系统实现。 步骤 第一步&#xff1a;编写Java代码第二步&#xff1a;编译Java代码第三步&#xff1a;生成C语言头文件第四步&#…

Android 框架揭秘 --读书笔记

Android 框架揭秘 Insied the Android Framework 转载于:https://www.cnblogs.com/drduan/p/4788554.html

android框架揭秘!Android开发者跳槽指南一线互联网公司面经总结

前言概要&#xff1a; 1&#xff0c;进大公司还是小公司&#xff0c;真的有的选&#xff1f; 2&#xff0c;校招的潜规则 3&#xff0c;校招想进大厂怎么办 4&#xff0c;社招的潜规则 5&#xff0c;社招想进大厂怎么办&#xff1f; 面试部门 岗位&#xff1a;商业化 - 高级 …

《Android框架揭秘》——导读

本节书摘来自异步社区《Android框架揭秘》一书中的目录&#xff0c;作者 金泰延 , 宋亨周 , 朴知勋 , 李白 , 林起永&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 第1章 Android Framework概要 1.1 Android源代码组成1.2 通过启动过程分析Android…

Android框架揭秘读书笔记

Android启动过程 1.linux内核&#xff0c;加载linux内核 2 init 进程对各种设备进行初始化&#xff0c; 执行Daemon进程&#xff0c;管理USB、ADB链接管理器、Debugger系统、rild管理无线通信链接 Content Manager进程&#xff0c;提供运行Android各种系统服务信息 Media …

android框架揭秘!连续四年百度Android岗必问面试题!实战篇

前言 今天想停下代码&#xff0c;写点脑袋里不断浮现出来的一些看法。 也就是最近在微博和知乎上老看到“互联网寒冬”的说法。要么是看到啥公司薪水无法如期发放了&#xff0c;要么是看到别人说什么“裁员了&#xff0c;没有交接&#xff0c;签字然后电脑还了就走人&#xf…

字节大佬封神之作《Android Framework高级开发笔记》,完整版开放下载

在现阶段的Android开发工作中&#xff0c;无论是底层&#xff0c;还是应用层&#xff0c;Framework都至关重要。Framework的火热程度&#xff0c;相信我也不必再赘述。 为帮助大家深度学习Framework背景及它的巨大作用&#xff0c;这里分享一份《Android Framework高级开发笔记…

ANDROID框架揭秘

本书通过对Android系统源代码的分析&#xff0c;主要介绍Android框架的初始化过程及 主要组件的工作原理。作者直接分析和整理了Android框架的主要源代码&#xff0c;并详细讲 解了理解框架工作原理所需的各种基础知识和构成实际Android平台骨干的服务框架。 其中的主要内容包括…

用Java写linux命令行cd,java执行linux命令cd

java执行linux命令cd [2021-01-31 01:51:23] 简介: php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1…

Linux 常用命令与教程

http://c.biancheng.net/view/705.html C语言编程网的教程很好 还有菜鸟教程的 还有这个 https://mp.weixin.qq.com/s/7bSwKiPmtJbs7FtRWZZqpA 讲的也不错 https://baike.baidu.com/item/PS/8850709 百度百科 搜索一个linux命令 会出来这个 〇、序言&#xff1a;命令基本格式…