计划用CC2530做定位,网上找了一些求圆交点的程序, 修改成3个圆求交点的质心,感觉算法还行。 粗略写了一下程序,结果还行。

  现在只能手动输入3个圆的信息。 后面需要再优化。

  

全部未优化的程序:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication1
  11. {
  12.  
  13. /* static void Main(string[] args)
  14. {
  15. Circle[] circles = new Circle[2];
  16. Point[] points = new Point[2];
  17. Console.Write("请输入两圆x,y,半径(以逗号分开):");
  18. char[] sep = new char[] { ' ', ',', ',' };
  19. string[] tempstr;
  20. while (true)
  21. {
  22. tempstr = Console.ReadLine().Split(sep, StringSplitOptions.RemoveEmptyEntries);
  23. if (tempstr.Length != 6)
  24. {
  25. Console.Write("输入有误\n按任意键退出...");
  26. Console.ReadKey();
  27. Environment.Exit(0);
  28. }
  29. circles[0].X = double.Parse(tempstr[0]);
  30. circles[0].Y = double.Parse(tempstr[1]);
  31. circles[0].Radius = double.Parse(tempstr[2]);
  32. circles[1].X = double.Parse(tempstr[3]);
  33. circles[1].Y = double.Parse(tempstr[4]);
  34. circles[1].Radius = double.Parse(tempstr[5]);
  35. switch (insect(circles, points))
  36. {
  37. case -1:
  38. Console.Write("两圆相同\n");
  39. break;
  40. case 0:
  41. Console.Write("不相交\n");
  42. break;
  43. case 1:
  44. Console.WriteLine(points[0]);
  45. break;
  46. case 2:
  47. Console.WriteLine(string.Join(" ", points));
  48. break;
  49. }
  50. }
  51. }*/
  52.  
  53. public partial class Form1 : Form
  54. {
  55. public Form1()
  56. {
  57. InitializeComponent();
  58. }
  59.  
  60. private void Form1_Load(object sender, EventArgs e)
  61. {
  62.  
  63. }
  64. struct Point
  65. {
  66. public double X;
  67. public double Y;
  68. public override string ToString()
  69. {
  70. return string.Format("({0},{1})", X, Y);
  71. }
  72. }
  73.  
  74. struct Circle
  75. {
  76. public Point Center;
  77. public double X { get { return Center.X; } set { Center.X = value; } }
  78. public double Y { get { return Center.Y; } set { Center.X = value; } }
  79. public double Radius;
  80. };
  81. const double ZERO = 1e-;//误差,小于这个就当作0
  82. static bool double_equals(double a, double b)
  83. {
  84. return Math.Abs(a - b) < ZERO;
  85. }
  86.  
  87. static double distance_sqr(Point a, Point b)
  88. {
  89. return (a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y);
  90. }
  91.  
  92. static double distance(Point a, Point b)
  93. {
  94. return Math.Sqrt(distance_sqr(a, b));
  95. }
  96.  
  97. int insect(Circle[] circles, Point[] points)
  98. {
  99. double d, a, b, c, p, q, r;
  100. double[] cos_value = new double[], sin_value = new double[];
  101. if (double_equals(circles[].Center.X, circles[].Center.X)
  102. && double_equals(circles[].Center.Y, circles[].Center.Y)
  103. && double_equals(circles[].Radius, circles[].Radius))
  104. {
  105. return -;
  106. }
  107.  
  108. d = distance(circles[].Center, circles[].Center);
  109. if (d > circles[].Radius + circles[].Radius
  110. || d < Math.Abs(circles[].Radius - circles[].Radius))
  111. {
  112. return ;
  113. }
  114.  
  115. a = 2.0 * circles[].Radius * (circles[].Center.X - circles[].Center.X);
  116. b = 2.0 * circles[].Radius * (circles[].Center.Y - circles[].Center.Y);
  117. c = circles[].Radius * circles[].Radius - circles[].Radius * circles[].Radius
  118. - distance_sqr(circles[].Center, circles[].Center);
  119. p = a * a + b * b;
  120. q = -2.0 * a * c;
  121. if (double_equals(d, circles[].Radius + circles[].Radius)
  122. || double_equals(d, Math.Abs(circles[].Radius - circles[].Radius)))
  123. {
  124. cos_value[] = -q / p / 2.0;
  125. sin_value[] = Math.Sqrt( - cos_value[] * cos_value[]);
  126.  
  127. points[].X = circles[].Radius * cos_value[] + circles[].Center.X;
  128. points[].Y = circles[].Radius * sin_value[] + circles[].Center.Y;
  129.  
  130. if (!double_equals(distance_sqr(points[], circles[].Center),
  131. circles[].Radius * circles[].Radius))
  132. {
  133. points[].Y = circles[].Center.Y - circles[].Radius * sin_value[];
  134. }
  135. return ;
  136. }
  137.  
  138. r = c * c - b * b;
  139. cos_value[] = (Math.Sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
  140. cos_value[] = (-Math.Sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
  141. sin_value[] = Math.Sqrt( - cos_value[] * cos_value[]);
  142. sin_value[] = Math.Sqrt( - cos_value[] * cos_value[]);
  143.  
  144. points[].X = circles[].Radius * cos_value[] + circles[].Center.X;
  145. points[].X = circles[].Radius * cos_value[] + circles[].Center.X;
  146. points[].Y = circles[].Radius * sin_value[] + circles[].Center.Y;
  147. points[].Y = circles[].Radius * sin_value[] + circles[].Center.Y;
  148.  
  149. if (!double_equals(distance_sqr(points[], circles[].Center),
  150. circles[].Radius * circles[].Radius))
  151. {
  152. points[].Y = circles[].Center.Y - circles[].Radius * sin_value[];
  153. }
  154. if (!double_equals(distance_sqr(points[], circles[].Center),
  155. circles[].Radius * circles[].Radius))
  156. {
  157. points[].Y = circles[].Center.Y - circles[].Radius * sin_value[];
  158. }
  159. if (double_equals(points[].Y, points[].Y)
  160. && double_equals(points[].X, points[].X))
  161. {
  162. if (points[].Y > )
  163. {
  164. points[].Y = -points[].Y;
  165. }
  166. else
  167. {
  168. points[].Y = -points[].Y;
  169. }
  170. }
  171. return ;
  172. }
  173.  
  174. void Draw_circle(Graphics grap, Circle circles)
  175. {
  176. // int iSeed = 10;
  177. Random ro = new Random();
  178. long tick = DateTime.Now.Ticks;
  179. Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> ));
  180.  
  181. int R = ran.Next();
  182. int G = ran.Next();
  183. int B = ran.Next();
  184. B = (R + G > ) ? R + G - : B;//0 : 380 - R - G;
  185. B = (B > ) ? : B;
  186.  
  187. Pen pen = new Pen(Color.Red, );//画笔颜色
  188. pen.Color = Color.FromArgb(R, G, B);
  189. grap.DrawEllipse(pen, Convert.ToInt32(circles.Center.X - circles.Radius), Convert.ToInt32(circles.Center.Y - circles.Radius), Convert.ToInt32(* circles.Radius), Convert.ToInt32(* circles.Radius));//画椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50
  190. }
  191.  
  192. private void button1_Click(object sender, EventArgs e)
  193. {
  194. Graphics gra = this.pictureBox1.CreateGraphics();
  195. gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  196. Circle[] circles = new Circle[];
  197. Point[] points = new Point[];
  198.  
  199. circles[].Center.X = ; ;
  200. circles[].Center.Y = ;
  201. circles[].Radius =;
  202.  
  203. circles[].Center.X = ;
  204. circles[].Center.Y = ;
  205. circles[].Radius =;
  206.  
  207. circles[].Center.X = ; ;
  208. circles[].Center.Y = ;
  209. circles[].Radius = ;
  210.  
  211. Circle[] copy = (Circle[])circles.Clone(); //copy
  212. // Draw_circle(gra, circles[0]);
  213. Draw_circle(gra, circles[]);
  214. Draw_circle(gra, circles[]);
  215. insect(circles, points);// 0 1
  216. Point Pac;
  217.  
  218. double points_AC_0 = distance(points[], circles[].Center);
  219. double points_AC_1 = distance(points[], circles[].Center);
  220. if (points_AC_0 < points_AC_1)
  221. {
  222. Pac.X = points[].X;
  223. Pac.Y = points[].Y;
  224. }
  225. else
  226. {
  227. Pac.X = points[].X;
  228. Pac.Y = points[].Y;
  229. }
  230. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  231. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  232.  
  233. circles[].Center.X = circles[].Center.X; ;
  234. circles[].Center.Y = circles[].Center.Y;
  235. circles[].Radius = circles[].Radius;
  236. // Draw_circle(gra, circles[0]);
  237. Draw_circle(gra, circles[]);
  238. Draw_circle(gra, circles[]);
  239. Draw_circle(gra, circles[]);
  240. insect(circles, points);// 0 2
  241.  
  242. Point Pbc;
  243.  
  244. points_AC_0 = distance(points[], copy[].Center);
  245. points_AC_1 = distance(points[], copy[].Center);
  246. if (points_AC_0 < points_AC_1)
  247. {
  248. Pbc.X = points[].X;
  249. Pbc.Y = points[].Y;
  250. }
  251. else
  252. {
  253. Pbc.X = points[].X;
  254. Pbc.Y = points[].Y;
  255. }
  256. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  257. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  258. circles = (Circle[])copy.Clone(); //copy
  259.  
  260. circles[].Center.X = circles[].Center.X; ;
  261. circles[].Center.Y = circles[].Center.Y;
  262. circles[].Radius = circles[].Radius;
  263. insect(circles, points); // 1 3
  264.  
  265. Point Pbd;
  266.  
  267. points_AC_0 = distance(points[], copy[].Center);
  268. points_AC_1 = distance(points[], copy[].Center);
  269. if (points_AC_0 < points_AC_1)
  270. {
  271. Pbd.X = points[].X;
  272. Pbd.Y = points[].Y;
  273. }
  274. else
  275. {
  276. Pbd.X = points[].X;
  277. Pbd.Y = points[].Y;
  278. }
  279. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  280. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  281.  
  282. double P_1, P_2;
  283. P_1 = (Pac.X + Pbc.X + Pbd.X) / 3.0;
  284. P_2 = (Pac.Y + Pbc.Y + Pbd.Y) / 3.0;
  285. gra.FillRectangle(new SolidBrush(Color.Blue), Convert.ToInt32(P_1), Convert.ToInt32(P_2), , );
  286.  
  287. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  288. gra.FillRectangle(new SolidBrush(Color.Red), Convert.ToInt32(points[].X), Convert.ToInt32(points[].Y), , );
  289.  
  290. }
  291. }
  292. }

[三边定位] C# 演示程序的更多相关文章

  1. 【三边定位】 演示程序V0.1

    忙于工作,这个小东西一直没有空去弄, 最近简单修改了些算法, 精度还有待提高. 贴一张图片 坐上角的坐标是鼠标点(31,17),后面location 是三边定位算出来的(31,19),后面跟的erro ...

  2. 三边定位 c#

    MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分. 项目中用到三 ...

  3. DWM1000 多个基站定位讨论 --[蓝点无限]

    该篇是之前<DWM1000 多个标签定位讨论 --[蓝点无限]>的续篇 多基站定位也是定位必然,因为有些稍微大一点的场合,或者多个区域(厂区不同房间)定位,往往4个基站会严重不足. DWM ...

  4. 【机器学习】WIFI室内定位

    WIFI室内定位-指纹法 在A1区域内每个点上采集四个WiFi的信号数据(信号强度),五点.九点.十六点采样. 5*5=25区域*16数据=400样本,用来训练 样本数 R B G1  G2 1 2 ...

  5. 关于APIT定位算法的讨论

    关于APIT定位算法的讨论 [摘要]   无线传感器网络节点定位机制的研究中,基于距离无关的定位技术得到快速发展,其中基于重叠区域的APIT定位技术在实际环境中的定位精度高,被广泛研究和应用. [关键 ...

  6. LED室内定位算法:RSS,TOA,AOA,TDOA(转载)

    转载自:https://blog.csdn.net/baidu_38197452/article/details/77115935 基于LED的室内定位算法大致可以分为四类: 1. 几何测量法 这种方 ...

  7. Bphero-UWB 基站0 和 电脑串口数据格式定义

    基站0 通过串口将系统中测得的距离信息发送到电脑,电脑定位软件通过三边定位算法计算出TAG的坐标,基站0 和 定位软件之间的数据格式定义如下(对官方数据结构进行了简化) 更多UWB定位信息请参阅论坛b ...

  8. CC2431 代码分析④-衣锦还乡的CC2431

    我们在第二节就分析到了 finishCollection( void ),但是当我们分析完第三节后,整个系统才真正执行到这里,我们依然像第二节一样把这个函数全部贴出来 /*************** ...

  9. SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言]

    //SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51总线接口方式] //应用产品: SMG12232A2标准图形点阵型液晶显示模块 // 本演示程序适用于SMG1 ...

随机推荐

  1. golang 打包,交叉编译,压缩

    打包,压缩 我们的常规打包方式 $ go build Mac下我们用 ls -lh查看,可以看到我们打包出来的可执行文件会比较大,一般只写几行代码就回又3M以上的文件大小了. 我们的带压缩的打包方式 ...

  2. 学习Maven POM

    什么是POM POM stands for "Project Object Model".It is an XML representation of a Maven projec ...

  3. 理解DeepBox算法

    理解DeepBox算法 基本情况 论文发表在ICCV2015,作者是Berkeley的博士生Weicheng Kuo: @inproceedings{KuoICCV15DeepBox, Author ...

  4. 【C++ Primer | 10】泛型算法

    #include<iostream> #include<algorithm> #include<vector> #include<string> #in ...

  5. SignalRMvc的简单例子

    1.介绍 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布,很显然,只有一方主动,这事情就没那么完美 ...

  6. 自定义rem

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. MySQL主从数据同步延时分析

    一.MySQL数据库主从同步延迟                                                              要了解MySQL数据库主从同步延迟原理,我们 ...

  8. 微信小程序—文件系统

    文件系统 文件系统是小程序提供的一套以小程序和用户维度隔离的存储以及一套响应的管理接口.通过wx.getFilesSystemManager()可以获取到全局唯一的文件管理器,所有文件管理操作通过Fi ...

  9. HDU4466 Triangle 计数 容斥原理

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4466.html 题目传送门 - HDU4466 题意 多组数据,每次询问一个数 $n(n\leq 5\t ...

  10. Java中随机数生成的问题

    [生成随机数序列] 我们只能利用Math.random()方法只能生成一个在[0,1)之间的double类型浮点数. 但如果我们想要生成[min, max]之间的随机整数时该怎么办呢? 此时可以用: ...