三点确定一个圆的计算方法

article/2025/11/6 22:33:37

最近在看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

 

 


http://chatgpt.dhexx.cn/article/YjqgdeMv.shtml

相关文章

三点确定一个圆(Apple HDU - 6206)(计算几何+高精度)

传送门 三点确定一个圆的计算方法 设一个圆的圆心坐标为(x0,y),半径为r。那么这个圆的方程可以写成 (x-x0)^2(y-y0)^2r^2 在这个圆上随便取三个点,设这三个点的坐标分别为(x1,y1),(x2,y2),(x3,y3)。那么有 公式(1)(2)相减,(1)(3)相减经过…

与圆有关的位置关系

与圆有关的位置关系 主讲:黄冈中学高级教师 余国琴 知识强化 一、知识概述 1、点和圆的位置关系 如果圆的半径为r,已知点到圆心的距离为d,则可用数量关系表示位置关系. (1)d>r点在圆外; (2)dr点在圆上&a…

三点定圆原理与C++实现

文章目录 1 原理2 C实现 1 原理 根据我们小学二年级就学过的三点定圆定理: 不 共 线 的 三 个 点 可 唯 一 确 定 一 个 圆 不共线的三个点可唯一确定一个圆 不共线的三个点可唯一确定一个圆 且,不共线的三点相互连接必然构成一个三角形,这…

使用C语言实现简单的PNG图像读取

概述 首先,关于png图像的结构:PNG文件的结构、PNG格式的数据结构。这两篇文章说的比较细。我简单地说一下我使用到的地方: 注:①引于PNG格式的数据结构。②引于PNG文件的结构 “png文件的前8个字节为固定的文件头信息&#xff0…

RK3588平台开发系列讲解(Display篇)开机视频的设置

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、开机视频功能介绍二、使用方法2.1、开启与关闭2.2、视频放置位置2.3、编译结果2.4、视频素材要求2.5、参数控制说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台开机视频的使用方法…

NR PUCCH(一) PUCCH format 0/1

欢迎关注同名微信公众号“modem协议笔记”。 NR中PUCCH物理信道用来发送上行控制信息Uplink Control Information(UCI),当然UCI也可以在PUSCH上发送。UCI 内容包括:CSI,HARQ ACK/NACK ,SR 及上述三者的组合信息。 那先看下PUCCH format ,序…

NR PUSCH(三) 频域资源分配方式

微信公众号同步更新欢迎关注同名modem协议笔记 这篇看下频域资源分配,本篇内容主要在38.214 6.1.2.2 resource allocation in frequency domain章节中。 相比于R15,R16 频域资源分配有3种类型 Uplink resource allocation scheme type 0/1/2&#xff08…

NR PUSCH(四) Frequency hopping

微信公众号同步更新,欢迎关注同名modem协议笔记 上篇PUSCH 介绍了频域分配方式resource allocation type0/1/2,其中type 0 RBG位图的分配方式比较灵活,type 2对应的interlaced RB 本身就是一种频域的离散化,都可以实现类似的效果…

halcon中阈值分割算子用法

1.threshold(Image : Region : MinGray, MaxGray : ):通过给定的阈值区间对图像进行分割 效果图: read_image (Audi2, audi2) fill_interlace (Audi2, ImageFilled, odd) threshold (ImageFilled, Region, 0, 90) 2.binary_threshold(Image : Region : …

De-interlace 反交错 简介

<script type"text/javascript"> </script> <script type"text/javascript"> </script> 为了更好的理解新的逐行扫瞄的概念&#xff0c;必须先弄清楚电视传输的一些基本知识&#xff0c;一副图像是如何传输的&#xff0c;它与新的…

pygame加载png出现known incorrect sRGB,Interlace handling should be turned on when using png_read_image问题

使用pygame加载png出现libpng warning: iCCP: known incorrect sRGB profile和Interlace handling should be turned on when using png_read_image警告的问题 一、解决Interlace handling should be turned on when using png_read_image警告 最近使用Python实现强化学习走迷…

计算机视觉之旅(Day3)

对不起大家&#xff0c;opencv的坑我尽量在年底更完&#xff0c;C的坑已经基本更完了&#xff0c;在没有进一步深入学习C之前可能这个系列已经算完了。不多说&#xff0c;我看看机器视觉的基本内容吧。 &#xff08;一&#xff09;基本构成 传统的机器视觉系统是由待测目标、…

交错(拉丝)(Interlace) 与 反胶卷过带

第一部分——交错&#xff08;拉丝&#xff09;&#xff08;Interlace&#xff09;的产生 引用了相当多网友的分析与结论&#xff0c;恕我不能依次注明。分析主要来自“[SilkyBible] 视频知识系列”&#xff0c;就主要概念的主要影响因素进行了一点分析。如果有错误&#xff0c…

二分法之最大子段和

1.问题描述&#xff1a;给定一个数组&#xff0c;找出其中可以构成最大数的子段&#xff0c;子段和是由连续的子段构成的&#xff1b;给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值。 2.设计思路&#xff1a;对于一个连续的子段和&#xf…

java动态规划求最大子段和_动态规划-最大子段和

2018-01-14 21:14:58 一、最大子段和问题 问题描述&#xff1a;给定n个整数(可能有负数)组成的序列a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;求该序列的最大子段和。如果所有整数都是负数&#xff0c;那么定义其最大子段和为0。 方法一、最大子段和的简单算法…

四种方法求解最大子段和问题

题目描述 给定一段长度为n的序列&#xff0c;我们需要找到其中一个连续的子段&#xff0c;使这个子段中各个元素加和最大&#xff0c;如果这个数组中全为负整数&#xff0c;我们就定义这个子段和为0. 题目分析 首先我们的目的是找一个局部的子段但加和是全局最大&#xff0c;…

最大子段和问题(分治法和动态规划)

什么是最大子段和&#xff0c;通俗点讲&#xff1a; 最大子段和就是给了一些数&#xff0c;然后你从中找了几个连续的数&#xff0c;这组连续的数的和比任意一组连续的数的和都大&#xff0c;那么你找的这几个连续的数的和就是这些数的最大子段和。 通俗的听不懂你就看这里&am…

最大子段求和

3种算法&#xff1a;最大子段求和 一、问题分析 问题&#xff1a;给定有n个整数(可能为负整数)组成的序列 a 1 , a 2 , . . . , a n , a_1,a_2,...,a_n, a1​,a2​,...,an​,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。 简易算法…

最大子段和问题(3种方法)

给定由n个整数(可能为负整数)组成的序列a1&#xff0c;a2&#xff0c; a3… &#xff0c; an&#xff0c; 寻找它的某个连续子段&#xff0c;使得其和最大。例如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。 1、最大字段和问题的简单算法 (1)枚举法求解&#xff1…

最大子段和(动态规划算法)

最大子段和&#xff08;动态规划算法&#xff09; 文章目录 最大子段和&#xff08;动态规划算法&#xff09;一、思路二、伪代码三、C代码四、输入实例 一、思路 D[i]表示从i开始的最大字段和。&#xff08;但我们不是从前往后找字段结束位置&#xff09; 根据递推公式&#x…