基本思想:过外接圆的圆心与每条边的中点的直线垂直于每条边,对每条边建立这样的方程,联立方程组,然后解之即得。这里要注意Cramer法则中必须排除系数行列式为零的情况,即要排除三个顶点在一条直线上的情形。

下面是实现代码

//两个向量之差
static void get_vector_diff( float3& aimV, const float3 a, const float3 b )
{
aimV[0] = b[0] - a[0];
aimV[1] = b[1] - a[1];
aimV[2] = b[2] - a[2];
}
//两个向量的内积
static float get_inner_product(const float3 v1,const float3 v2)
{
return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
}
//三阶矩阵的行列式
static float get_vector3_det( const float3 v1, const float3 v2, const float3 v3)
{
float a[3][3];
for ( int i = 0; i != 3; ++i )
{
a[0][i] = v1[i];
a[1][i] = v2[i];
a[2][i] = v3[i];
}
return a[0][0] * a[1][1] * a[2][2] +
a[0][1] * a[1][2] * a[2][0] +
a[0][2] * a[1][0] * a[2][1] -
a[0][2] * a[1][1] * a[2][0] -
a[0][1] * a[1][0] * a[2][2] -
a[0][0] * a[1][2] * a[2][1];
}
//欧氏范数
static float get_Euclidean_distance(const float3 v1,const float3 v2)
{
return sqrt(pow(v1[0]-v2[0],2)+pow(v1[1]-v2[1],2)+pow(v1[2]-v2[2],2));
}
static void get_vector_center( float3& aimV, const float3 a, const float3 b )
{
aimV[0] = (a[0] + b[0])/2;
aimV[1] = (a[1] + b[1])/2;
aimV[2] = (a[2] + b[2])/2;
}
///
//求三维空间的三角形外接圆圆心坐标及半径
///
static bool triangle_circumcentre(float3 center,float *radiu,float3 pt[3])
{
float3 line_center1,line_center2,line_center3;
float3 normal1,normal2,normal3;
float3 result,rep1,rep2,rep3;
float d_det;
get_vector_center(line_center1,pt[0],pt[1]);
get_vector_center(line_center2,pt[0],pt[2]);
get_vector_center(line_center3,pt[1],pt[2]);
get_vector_diff(normal1,pt[0],pt[1]);
get_vector_diff(normal2,pt[0],pt[2]);
get_vector_diff(normal3,pt[1],pt[2]);
result[0]=get_inner_product(line_center1,normal1);
result[1]=get_inner_product(line_center2,normal2);
result[2]=get_inner_product(line_center3,normal3);
rep1[0]=normal1[0];
rep1[1]=normal2[0];
rep1[2]=normal3[0];
rep2[0]=normal1[1];
rep2[1]=normal2[1];
rep2[2]=normal3[1];
rep3[0]=normal1[2];
rep3[1]=normal2[2];
rep3[2]=normal3[2];
d_det=get_vector3_det(rep1,rep2,rep3);
if(d_det==0)
{
return false;
}
//Cramer法则
center[0]=get_vector3_det(result,rep2,rep3)/d_det;
center[1]=get_vector3_det(rep1,result,rep3)/d_det;
center[2]=get_vector3_det(rep1,rep2,result)/d_det;
*radiu=get_Euclidean_distance(center,pt[0]);
return true;
}

求三维空间中的三角形外接圆圆心坐标的算法相关推荐

  1. 向量叉乘求三维空间中两直线(或线段)的交点

    1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...

  2. 给定两个点的坐标和一个半径,求能组成的圆的圆心坐标

    中文背景: 给定两个点坐标分别为(x1, y1), (x2, y2)和半径r,求出圆心的坐标(a, b). 英文背景: Given the coordinates of two points (x1, ...

  3. 求有向图中两点最短距离java_Java 迪杰斯特拉算法实现查找最短距离

    迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...

  4. 三角形垂点坐标js算法(三点定圆求圆心)

    已知平面三点坐标A(x1, y1).B(x2, y2).C(x3, y3),三点定圆也就是三角形的中垂线交点, //平面三点定位算法 function locate(x1, y1, x2, y2, x ...

  5. 三角形外接圆与内切圆

    0. 直角三角形 直角三角形天然地对应着一个外接圆,外接圆的圆心在斜边的中点处,斜边上的高最大为斜边的一半: 1. 外接圆 与多边形各顶点都相交的圆叫做多边形的外接圆. 三角形有外接圆,其他的图形不一 ...

  6. 三点求圆心坐标(三角形外心)

    //过三点求圆心坐标 Point waixin(Point a,Point b,Point c) { double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1*a ...

  7. 计算三维空间中直线和三角形的交点

    计算三维空间中直线和三角形的交点 前言 一.计算平面方程 1.1 平面不过原点 1.2 平面过原点 1.3 平面过 zzz 轴 1.4 平面为 yOzyOzyOz 平面 二.计算直线方程 三.计算交点 ...

  8. 三维空间中的圆与三角形(二):圆与外切三角形

    圆的参数方程(字母所代表含义可参见[第六回]OCCT之Package Geom的曲线曲面参数方程解析): P(U) = O + R*Cos(U)*XDir + R*Sin(U)*YDir 已知△ABC ...

  9. 已知三角形三点坐标求角度_高中数学:椭圆相关角度的最值问题

    圆锥曲线中的最值问题主要包括长度最值.角度最值及面积最值等. 例题:如图1,已知椭圆的中心在坐标原点,焦点在x轴上,长轴 的长为4,左准线与x轴的交点为M, . (1)求椭圆的方程: (2)若直线 , ...

  10. 已知三角形三点坐标, 求三角形的面积

    摘自:http://blog.sina.com.cn/s/blog_4cddcaa3010008u7.html 已知三角形三点坐标, 求三角形的面积 发表时间:2004-8-10 作者:未知[获得此文 ...

最新文章

  1. android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating cl
  2. PostgreSQL在何处处理 sql查询之三十九
  3. python项目实战:20行代码画一朵好看又有趣的小花花
  4. 最小生成树prim算法———模板
  5. android项目模块导入eclipse编译报错,android中studio导入eclipse项目报错怎么办
  6. mysql 二进制日志变化_MySQL运维之二进制日志
  7. java php html,java和html的区别是什么
  8. python变量如何用循环定义_Python学习日记1(变量定义,分支,循环)
  9. d3 v4 api transitions
  10. Javascript作用域、闭包原理以及性能问题
  11. Hart/Hart-IP协议 介绍、分析和应用
  12. ES测试数据,kibana命令
  13. 关于 未受信任的企业级开发者 提示的解决
  14. 品质催生消费升级 ACCESS集团和VTN国际品牌会员俱乐部的跨境电商之路
  15. 三网融合融什么融,团购网站团什么团【涂雅速涂】
  16. 题目内容: 班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1
  17. 荣耀 MagicBook Pro 加装固态硬盘
  18. STRATASYS 即将收购 ORIGIN,将全新增材制造平台引入聚合物生产领域
  19. svg转成jpg/png图片跨域图片
  20. EXCEL+方方格子中的翻译工具+百度翻译=实现批量翻译

热门文章

  1. 性能测试之LoadRunner11脚本录制方法
  2. ADB工具安装及常用命令
  3. 6m缓存和8m缓存差距_i7-9700和i7-9700K性能差距多大?i7-9700和i7-9700K区别对比评测...
  4. 冲着名为Sundy的男人去麦子学院
  5. java batik_batik详解2
  6. JVM内存模型和java内存模型
  7. 华硕笔记本 FX50J Fn热键无效
  8. Quartus II 13.1与Modelsim SE的安装
  9. 图像修复经典算法--Criminisi算法
  10. BUAA北京地铁乘坐线路查询