c++ 三点求外接圆圆心 3维实现
有很多类似的算法,我在网上找到一个按照几何去解的代码,这次我自己写的是一个安装代数来解的代码。
知识来源是上一篇解n元一次方程组中的文章。我扩展到了三维。方法很简单,就是安装那个文章上的形式写出方程组,解出方程组。
POINT7D AssembleAlgorithm::computeCenterPointImprove(vector<POINT7D> dataList)
{POINT7D r;POINT7D *p1;p1 = new POINT7D[3];p1[0].x=dataList[0].x;p1[1].x=dataList[dataList.size()/2].x;p1[2].x=dataList[dataList.size() - 1].x;p1[0].y=dataList[0].y;p1[1].y=dataList[dataList.size()/2].y;p1[2].y=dataList[dataList.size() - 1].y;p1[0].z=dataList[0].z;p1[1].z=dataList[dataList.size()/2].z;p1[2].z=dataList[dataList.size() - 1].z;AdjustLSM MObj;
// int nRow=8, nCol=12;double** d = MObj.CreateMatrix(3, 4);d[0][0] = p1[0].x - p1[1].x;d[0][1] = p1[0].y - p1[1].y;d[0][2] = p1[0].z - p1[1].z;d[1][0] = p1[0].x - p1[2].x;d[1][1] = p1[0].y - p1[2].y;d[1][2] = p1[0].z - p1[2].z;d[2][0] = p1[1].x - p1[2].x;d[2][1] = p1[1].y - p1[2].y;d[2][2] = p1[1].z - p1[2].z;//ud[0][3] = (p1[0].x*p1[0].x - p1[1].x*p1[1].x + p1[0].y*p1[0].y - p1[1].y*p1[1].y +p1[0].z*p1[0].z - p1[1].z*p1[1].z)/2.0;d[1][3] = (p1[0].x*p1[0].x - p1[2].x*p1[2].x + p1[0].y*p1[0].y - p1[2].y*p1[2].y +p1[0].z*p1[0].z - p1[2].z*p1[2].z)/2.0;d[2][3] = (p1[1].x*p1[1].x - p1[2].x*p1[2].x + p1[1].y*p1[1].y - p1[2].y*p1[2].y +p1[1].z*p1[1].z - p1[2].z*p1[2].z)/2.0;double* X = this->solveEquationSet(d, 3);
这样你觉得就结束了吗?nonono
因为是3维空间上的点,方程组的约束其实只在二维空间上能找到唯一的点,在三维上可以找到一条直线。
所以还要把解出来的投射到这个平面上。
//点x不一定在这个平面,所以需要投影到平面上去float t1,t2,t3;POINT7D* p =new POINT7D;
<span style="white-space:pre"> </span>//t1,t2,t3是法向量,有其他很多方法可以求,大家可以百度一下,我这里是调用了其他的一个函数this->planeFitting(t1, t2, t3, p, dataList);//求出单位向量float sum_fenmu = sqrt(t1*t1 + t2*t2 + t3*t3);t1 /= sum_fenmu;t2 /= sum_fenmu;t3 /= sum_fenmu;POINT7D tmp;tmp.x = X[0] - p1[0].x;tmp.y = X[1] - p1[0].y;tmp.z = X[2] - p1[0].z;float tmp_muli;tmp_muli = tmp.x*t1 + tmp.y*t2 + tmp.z*t3;tmp.x = tmp_muli*t1;tmp.y = tmp_muli*t2;tmp.z = tmp_muli*t3;r.x = X[0] - tmp.x;r.y = X[1] - tmp.y;r.z = X[2] - tmp.z;return r;
}
这个只是我的程序中的函数我没有把他独立出来,不过有一些基础的人应该改一些东西就能独立使用了。
c++ 三点求外接圆圆心 3维实现相关推荐
- 【第4期-智能驾驶汽车系列术语概念解析】第2节:基于三点求外接圆的曲率计算方法
目录 一.利用三次多项式曲线求曲率的缺陷 二.基于三点求外接圆的曲率计算方法 三.实例介绍 1.MATLAB代码 2. 结果展示 总结 一.利用三次多项式曲线求曲率的缺陷 在第4期第一节中,我们利用三 ...
- java求外接圆圆心_由三点三维坐标计算圆半径和圆心位置
[实例简介] 通过输入任意三点空间坐标自动判断三点是否在一条直线上,若不在则求三点外接圆的圆心位置和半径,计算精度可调节.解决了"知三点求圆心半径"程序对于某些点无法计算的缺陷. ...
- java求外接圆圆心_吉软_Java_第六次作业
编写一个圆类Circle 要求: 1. 该类拥有两个属性: 1) Point p代表圆心 2) float radius代表半径 2. 构造方法 1) Circle() 2) Circle(Point ...
- QT快速入门、三点求圆心实现详解
在编程中,会经常用到数学计算,所以C++将常用的数学计算,例如求正余弦等,封装成函数(正是我们在3.2 数学计算中学习到的),我们只需要写入简单的语句就可以执行所需要的功能,这正是函数的意义.在这一章 ...
- 三点求圆心坐标(三角形外心)
//过三点求圆心坐标 Point waixin(Point a,Point b,Point c) { double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1*a ...
- 圆上三点求圆心和半径
下面的程序实现用到C++和OpenCV. 先定义一个用于存储圆的数据的结构体CircleData: struct CircleData {Point2f center;int radius; }; 假 ...
- 已知三点求圆心与半径
已知三点求圆心与半径 kezunhai@gmail.com http://blog.csdn.net/kezunhai 在计算机图像图形学中,经常会用到求圆心或圆半径的情况,本文介绍一种已知三个点求 ...
- 三点法求三维坐标精度误差评估实验
1. 实验目的 1) 对实验做一个系统性的误差评价. 2) 验证本实验的精度能否达到测量空间角的要求. 2. 实验原理 参考论文[1]进行误差评估实验,但是由于论文中的评定指标并不都适合本次实验,所 ...
- 三点求外接园,同时计算三点的圆弧弧长,以及半径等信息
已知三点在圆上,求三点构成的圆弧弧长,以及半径等信息 三点进行求圆弧以及半径,这就需要用到了高中时期的三角函数以及反三角函数进行求解. 首先简单讲解一下思路吧: 1.三点中任意两点构成两条直线,求出直 ...
- [转] 二分法求外接圆最大半径
[转]https://blog.csdn.net/flashmsn/article/details/94642687 题目描述: 给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸多边形的外接 ...
最新文章
- 浅谈安卓线程池相关问题
- LaTex文章中插入Visio及Matlab矢量图
- 数据中心ups电源七个故障分析
- @ExceptionHandler
- MyEclipse10安装SVN插件的几种方法
- python强转字符串_在Python 3中将Exception转换为字符串
- 理解 __doPostBack--2
- 基于社会资源的普通摄像机1400结构化AI算法改造方案
- Linux内核系统调用原理与实现
- 免费服务器推荐1:无限自由
- m3u8手机批量转码_M3U8批量转换器(Android)开发
- python爬取网易云音乐 专辑图片+歌词
- OpenCV图像的基本操作
- antd提交表单_antd快速开发(Form篇)
- java中default关键字_Java 中的 default 关键字及代码示例
- Lambert漫反射光照模型归纳
- discuz 版块导航function_forumlist.php,Discuz! X2扩建左侧版块导航 社区层次一目了然...
- H2/H∞半车悬架控制仿真分析
- Python 三维绘图
- word怎么改一张纸的方向_word怎样单独改变一张纸的方向