三点确定一个圆的计算方法
最近在看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
三点确定一个圆的计算方法相关推荐
- java三点确定圆弧_圆弧方向判断方法和三点确定一个圆的计算方法
圆弧方向判断方法 设p1=(x1,y1) p2=(x2,y2) p3=(x3,y3) 求向量 p12=(x2-x1,y2-y1) p23=(x3-x2,y3-y2) 则当 p12与p23的叉乘(向量积 ...
- 圆弧方向判断方法和三点确定一个圆的计算方法
圆弧方向判断方法 设p1=(x1,y1) p2=(x2,y2) p3=(x3,y3) 求向量 p12=(x2-x1,y2-y1) p23=(x3-x2,y3-y2) 则当 p12与p2 ...
- 三点确定一个圆(输出圆心、弧长、圆心角、方向)
三点确定一个圆(输出圆心.弧长.圆心角.方向) 已知圆弧上的三个点,求解该圆的描述信息 /*** @brief The PointF class 基础点结构定义浮点型*/ class PointF { ...
- matlab中三点定圆,MATLAB三点确定一个圆
1 给定三个不在同一直线上的三个点的坐标,确定圆的轨迹方程 2 3 4 下面是MATLAB中的函数文件 5 function[a,b,c]=ThreePointFitCircle(x,y,flag) ...
- AutoCAD VBA:过三点创建一个圆
基本思路,两点连线,两个线段中垂线交点就是圆心,圆心到任一点距离为半径,做圆. 代码如下: Function BisectorPLine(Point1 As Variant, point2 As Va ...
- 三个点坐标求解一个圆
clear all; clc; close all; %已知随bai便三点,不在同一条du直线上zhi的三点确定一个圆? A1=[0 0.05]; A2=[0.01 0.06]; A3=[0 0.07 ...
- 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆
已知三点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 ...
- 【第4期-智能驾驶汽车系列术语概念解析】第2节:基于三点求外接圆的曲率计算方法
目录 一.利用三次多项式曲线求曲率的缺陷 二.基于三点求外接圆的曲率计算方法 三.实例介绍 1.MATLAB代码 2. 结果展示 总结 一.利用三次多项式曲线求曲率的缺陷 在第4期第一节中,我们利用三 ...
- 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
- 编写一个圆类Circle
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
最新文章
- 松本行弘:我的编程人生
- 13:TextView#setText、DalvikART虚拟机
- libcurl linux 静态链接库_Linux学习:Makefile 模板(动态库、静态库、可执行程序)...
- 隐私设置错误您的连接不是私密连接_用小米手机的,赶紧将这些保护个人隐私的功能设置起来,安全好用...
- LeetCode Algorithm 剑指 Offer 28. 对称的二叉树
- gulp教程之gulp-minify-css【gulp-clean-css】
- sdram trp_TRP的完整形式是什么?
- es6生成器_ES6生成器
- 读《一天搞懂深度学习》ppt的笔记
- uboot源码修改之支持DM9000
- 计算机桌面保护时间,请教一个屏幕保护的问题,域内的计算机可以设置不同时间的屏幕保护策略吗?...
- html罗马字母怎么打,怎么打罗马数字二 罗马数字 在电脑上怎么打出来呢?
- 虚拟账户 FTP 服务器不能上传可下载
- 农作物病虫害识别进展概述(***)
- 摄像机产生“拖影”、“重影”的原因
- java实时获取android网速_Android实现网速实时监测工具类
- 【量化选基】每年初买入近5年 收益率最高的10支基金会暴富吗?
- ubuntu14设置在当前目录打开终端
- python画三维立体图-Python 绘制酷炫的三维图步骤详解
- FusionCharts Free (FCF) V3 新特性之样式(Styles)
热门文章
- Java集合源码剖析-Java集合框架
- 3套看漫画学python视频教程
- 《数据库原理》— 数据库系统概论第五版习题解析
- java jdk官网下载地址
- MATLAB 2020b 中文版安装教程(简洁版)
- [Android]安卓简易计算器 (使用GridLayout)
- 第一阶段:Java基础
- 掘金mysql_MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
- Modelsim SE 的下载安装与注册
- hp laserjet 1213 linux驱动下载,惠普HP LaserJet Pro M1213nf 一体机驱动