最近在看recast&detour源码的时候有遇到许多数学上的算法问题,特此记录,以便以后查看。

推导过程

问题:

求点p1 p2 p3三点确定的圆的 圆心c 和 半径r 。

思路:

为了方便求解,将坐标系原点平移到p1点。

即新的p1坐标为(0,0),即p2 p3坐标同时减去p1坐标,假设新的p2新的坐标为(x2, y2),新的p3新的坐标(x3, y3)。

再最后求得的圆心c的坐标以后,再加上原来p1的坐标即可。

推导圆心方程:

最后,(x0 y0)再加上原来的p1点的坐标值,即为最终要求的圆心坐标。

补充公式

源码

使用的公式即为上面推导的公式。

static bool circumCircle(const float* p1, const float* p2, const float* p3,float* c, float& r)
{static const float EPS = 1e-6f;// Calculate the circle relative to p1, to avoid some precision issues. 避免精度问题?const float v1[3] = {0,0,0};float v2[3], v3[3];rcVsub(v2, p2,p1);rcVsub(v3, p3,p1);const float cp = vcross2(v1, v2, v3);if (fabsf(cp) > EPS)// 三点不能共线 组成圆的充要条件{const float v1Sq = vdot2(v1,v1);const float v2Sq = vdot2(v2,v2);const float v3Sq = vdot2(v3,v3);c[0] = (v1Sq*(v2[2]-v3[2]) + v2Sq*(v3[2]-v1[2]) + v3Sq*(v1[2]-v2[2])) / (2*cp);c[1] = 0;c[2] = (v1Sq*(v3[0]-v2[0]) + v2Sq*(v1[0]-v3[0]) + v3Sq*(v2[0]-v1[0])) / (2*cp);r = vdist2(c, v1);rcVadd(c, c, p1);return true;}rcVcopy(c, p1);r = 0;return false;
}

vcross2函数

p1指向p2的向量 和 p1指向p3的向量的 (把第三维的坐标看成0)

i        j       k

u1     v1     0

u2     v2     0

=  (u1v2 - v1u2)k

也就是二维矩阵的行列式的值。

inline float vcross2(const float* p1, const float* p2, const float* p3)
{const float u1 = p2[0] - p1[0];const float v1 = p2[2] - p1[2];const float u2 = p3[0] - p1[0];const float v2 = p3[2] - p1[2];return u1 * v2 - v1 * u2;
}

参考

https://blog.csdn.net/liyuanbhu/article/details/52891868

三点确定一个圆的计算方法相关推荐

  1. java三点确定圆弧_圆弧方向判断方法和三点确定一个圆的计算方法

    圆弧方向判断方法 设p1=(x1,y1) p2=(x2,y2) p3=(x3,y3) 求向量 p12=(x2-x1,y2-y1) p23=(x3-x2,y3-y2) 则当 p12与p23的叉乘(向量积 ...

  2. 圆弧方向判断方法和三点确定一个圆的计算方法

    圆弧方向判断方法 设p1=(x1,y1)   p2=(x2,y2)  p3=(x3,y3)   求向量 p12=(x2-x1,y2-y1) p23=(x3-x2,y3-y2)    则当 p12与p2 ...

  3. 三点确定一个圆(输出圆心、弧长、圆心角、方向)

    三点确定一个圆(输出圆心.弧长.圆心角.方向) 已知圆弧上的三个点,求解该圆的描述信息 /*** @brief The PointF class 基础点结构定义浮点型*/ class PointF { ...

  4. matlab中三点定圆,MATLAB三点确定一个圆

    1 给定三个不在同一直线上的三个点的坐标,确定圆的轨迹方程 2 3 4 下面是MATLAB中的函数文件 5 function[a,b,c]=ThreePointFitCircle(x,y,flag) ...

  5. AutoCAD VBA:过三点创建一个圆

    基本思路,两点连线,两个线段中垂线交点就是圆心,圆心到任一点距离为半径,做圆. 代码如下: Function BisectorPLine(Point1 As Variant, point2 As Va ...

  6. 三个点坐标求解一个圆

    clear all; clc; close all; %已知随bai便三点,不在同一条du直线上zhi的三点确定一个圆? A1=[0 0.05]; A2=[0.01 0.06]; A3=[0 0.07 ...

  7. 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆

    已知三点p1(x1,y1,z1).p2(x2,y2,z2).p3(x3,y3,z3),求平面方程如下: c=向量AB=向量OB-向量OA=(x2-x1,y2-y1,z2-z1) b=向量AC=向量OC ...

  8. 【第4期-智能驾驶汽车系列术语概念解析】第2节:基于三点求外接圆的曲率计算方法

    目录 一.利用三次多项式曲线求曲率的缺陷 二.基于三点求外接圆的曲率计算方法 三.实例介绍 1.MATLAB代码 2. 结果展示 总结 一.利用三次多项式曲线求曲率的缺陷 在第4期第一节中,我们利用三 ...

  9. 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...

    编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...

  10. 编写一个圆类Circle

    编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...

最新文章

  1. 松本行弘:我的编程人生
  2. 13:TextView#setText、DalvikART虚拟机
  3. libcurl linux 静态链接库_Linux学习:Makefile 模板(动态库、静态库、可执行程序)...
  4. 隐私设置错误您的连接不是私密连接_用小米手机的,赶紧将这些保护个人隐私的功能设置起来,安全好用...
  5. LeetCode Algorithm 剑指 Offer 28. 对称的二叉树
  6. gulp教程之gulp-minify-css【gulp-clean-css】
  7. sdram trp_TRP的完整形式是什么?
  8. es6生成器_ES6生成器
  9. 读《一天搞懂深度学习》ppt的笔记
  10. uboot源码修改之支持DM9000
  11. 计算机桌面保护时间,请教一个屏幕保护的问题,域内的计算机可以设置不同时间的屏幕保护策略吗?...
  12. html罗马字母怎么打,怎么打罗马数字二 罗马数字 在电脑上怎么打出来呢?
  13. 虚拟账户 FTP 服务器不能上传可下载
  14. 农作物病虫害识别进展概述(***)
  15. 摄像机产生“拖影”、“重影”的原因
  16. java实时获取android网速_Android实现网速实时监测工具类
  17. 【量化选基】每年初买入近5年 收益率最高的10支基金会暴富吗?
  18. ubuntu14设置在当前目录打开终端
  19. python画三维立体图-Python 绘制酷炫的三维图步骤详解
  20. FusionCharts Free (FCF) V3 新特性之样式(Styles)

热门文章

  1. Java集合源码剖析-Java集合框架
  2. 3套看漫画学python视频教程
  3. 《数据库原理》— 数据库系统概论第五版习题解析
  4. java jdk官网下载地址
  5. MATLAB 2020b 中文版安装教程(简洁版)
  6. [Android]安卓简易计算器 (使用GridLayout)
  7. 第一阶段:Java基础
  8. 掘金mysql_MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
  9. Modelsim SE 的下载安装与注册
  10. hp laserjet 1213 linux驱动下载,惠普HP LaserJet Pro M1213nf 一体机驱动