已知三点在圆上,求三点构成的圆弧弧长,以及半径等信息
三点进行求圆弧以及半径,这就需要用到了高中时期的三角函数以及反三角函数进行求解。
首先简单讲解一下思路吧:
1.三点中任意两点构成两条直线,求出直线方程(Ax+By+C=0);
2.对1中求出的两条直线求出对应的中垂线;
3.使用两条中垂线求出交点(即是半径);
4.使用反三角函数(Atan2),求出角度即可得出弧度值;

// 三点求圆弧.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <math.h>
#define M_PI 3.1415926class MathPoint
{public:MathPoint() {}MathPoint(double _dx, double _dy, double _dz):x(_dx), y(_dy), z(_dz){}MathPoint operator-(const MathPoint& pt) const;MathPoint operator+(const MathPoint& pt) const;MathPoint operator/(const double factor) const;MathPoint operator*(const double factor) const;MathPoint& operator-=(const MathPoint& pt);MathPoint& operator+=(const MathPoint& pt);MathPoint& operator/=(const double factor);MathPoint& operator*=(const double factor);double GetLength();
public:double x = 0.0;double y = 0.0;double z = 0.0;
};MathPoint MathPoint::operator-(const MathPoint& pt) const
{MathPoint ptt;ptt.x = x - pt.x;ptt.y = y - pt.y;ptt.z = z - pt.z;return ptt;
}MathPoint MathPoint::operator+(const MathPoint& pt) const
{MathPoint ptt;ptt.x = x + pt.x;ptt.y = y + pt.y;ptt.z = z + pt.z;return ptt;}MathPoint MathPoint::operator/(const double factor) const
{MathPoint ptt;ptt.x = x / factor;ptt.y = y / factor;ptt.z = z / factor;return ptt;
}MathPoint MathPoint::operator*(const double factor) const
{MathPoint ptt;ptt.x = x * factor;ptt.y = y * factor;ptt.z = z * factor;return ptt;
}MathPoint& MathPoint::operator-=(const MathPoint& pt)
{x -= pt.x;y -= pt.y;z -= pt.z;return *this;
}MathPoint& MathPoint::operator+=(const MathPoint& pt)
{x += pt.x;y += pt.y;z += pt.z;return *this;
}MathPoint& MathPoint::operator/=(const double factor)
{x /= factor;y /= factor;z /= factor;return *this;
}MathPoint& MathPoint::operator*=(const double factor)
{x *= factor;y *= factor;z *= factor;return *this;
}double MathPoint::GetLength()
{double dLength = 0.0;dLength = sqrt(x * x + y * y + z * z);return dLength;
}// 通过两点计算 直线方程(Ax+By+C = 0)
bool LineEquation(const MathPoint& pt1, const MathPoint& pt2, double& A, double& B, double& C)
{//求直线方程 算出A B CA = 1.0;B = 1.0;C = 1.0;MathPoint pt;double F = pt1.x * pt2.y - pt1.y * pt2.x;pt = pt2 - pt1;if (fabs(F) < 1e-6){if ((fabs(pt.x) < 1e-6) && (fabs(pt.y) < 1e-6)){return false;}else if (fabs(pt.x) < 1e-6){A = 1.0;B = 0.0;C = 0.0 - pt1.x;}else if (fabs(pt.y) < 1e-6){A = 0.0;B = 1.0;C = 0.0 - pt1.y;}else{A = 1.0;B = 0.0 - pt1.x / pt1.y;C = 0.0;}}else{A = 0.0 - pt.y / F;B = pt.x / F;C = 1.0;}return true;
}// 通过一个点以及直线方程中的AB值求C(Ax+By+C=0)
bool LineEquation(const MathPoint& pt, double A, double B, double& C)
{求经过pt点的平行线 A B同 求CC = 0.0 - A * pt.x - B * pt.y;return true;
}// 通过两条直线交点求出圆心
bool LineLineCross(double A1, double B1, double C1, double A2, double B2, double C2, MathPoint& ptCross)
{double F = A1 * B2 - A2 * B1;// 判断两条直线是否平行if (fabs(F) < 1e-8){return false;}ptCross.x = (B1 * C2 - B2 * C1) / F;ptCross.y = 0.0 - (A1 * C2 - A2 * C1) / F;return true;
}//已知3点,求半径,圆心,是否顺时针(G代码),弧长,开始角度(数学坐标系,弧度),结束角度(数学坐标系,弧度)
bool Pt3CircleWithAngle(const MathPoint& pt1, const MathPoint& pt2, const MathPoint& pt3, double& R, MathPoint& ptCen, double& radLength, double& startAngleG, double& endAngleG)
{// pt1:圆弧点     pt2:上一个中间点         pt3:当前中间点double A[4];double B[4];double C[4];MathPoint pt[3];// (1) 整合出两条直线 Ax+By+C=0;LineEquation(pt1, pt2, A[0], B[0], C[0]);LineEquation(pt2, pt3, A[1], B[1], C[1]);if (fabs(B[0]) < 1e-6){if (fabs(B[1]) < 1e-6)   // 三点同一条垂直线不能构成园{return false;}}else{if (fabs(B[1]) > 1e-6){if (fabs(A[0] / B[0] - A[1] / B[1]) < 1e-6){return false;}}}// (2)  找出pt1与点pt2的中间点pt[0] = pt1;pt[0] *= 0.5;pt[2] = pt2;pt[2] *= 0.5;pt[0] += pt[2];// 找出pt2与点pt3的中间点  (准备找中垂线)pt[1] = pt2;pt[1] *= 0.5;pt[2] = pt3;pt[2] *= 0.5;pt[1] += pt[2];// (3)   做出中垂线(L1的中垂线)A[2] = 0.0 - B[0];B[2] = A[0];LineEquation(pt[0], A[2], B[2], C[2]);// 做出L2的中垂线A[3] = 0.0 - B[1];B[3] = A[1];LineEquation(pt[1], A[3], B[3], C[3]);// 求两线的交点  ptCen 为两条中垂线的交点同时也是圆心LineLineCross(A[2], B[2], C[2], A[3], B[3], C[3], ptCen);// 求半经pt[2] = pt1;pt[2] -= ptCen;pt[2].z = 0.0;R = pt[2].GetLength();pt[0] = pt2;pt[0] -= pt1;pt[1] = pt3;pt[1] -= pt2;A[0] = atan2(pt[0].y, pt[0].x);A[1] = atan2(pt[1].y, pt[1].x);A[2] = A[1] - A[0];// 这里需要确保 A[2]在 -M_PI 到 M_PI范围内if (A[2] < 0.0 - M_PI){A[2] += 2 * M_PI;}else if (A[2] > M_PI){A[2] -= 2 * M_PI;}radLength = 2 * fabs(A[2]);startAngleG = atan2(pt1.y - ptCen.y, pt1.x - ptCen.x);//将范围从-pi 到 pi 转换为 0 到 2*piif (startAngleG < 0 && startAngleG >= -M_PI){startAngleG += 2 * M_PI;}endAngleG = startAngleG + 2 * A[2];return true;
}int main()
{MathPoint pt1(1,1,0), pt2(2,2,0), pt3(3,1,0);   ///  pt1,pt2,pt3 为圆弧上的三个点,且pt1与pt3为圆弧的两个端点,pt2为圆弧的中间点double R;   // 圆弧半径MathPoint ptCen;         // 圆心double radLength;        // 圆弧的弧度值double startAngleG, endAngleG;   // 圆弧的起始以及结束角度// 计算圆弧相关数据Pt3CircleWithAngle(pt1,pt2,pt3,R, ptCen,radLength,startAngleG,endAngleG);std::cout << "圆心为:(" << ptCen.x << "," << ptCen.y << "," << ptCen.z << ")" << std::endl;std::cout << "半径为:" << R << std::endl;std::cout << "圆弧弧度值:" << radLength << std::endl;
}

创作不易,如有帮助,麻烦点赞支持一下,谢谢。

三点求外接园,同时计算三点的圆弧弧长,以及半径等信息相关推荐

  1. java 任意数平均值_【编程题】通过键盘输入三个任意的数字,计算三个值的平均值,并输出结果。...

    [单选题]对放大电路测试NPN型硅管测得Ube>0,Ubc>0,Uce>0 [简答题]Even ordinary men understand now that the univer ...

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

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

  3. C语言编程b a化简,C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形......

    导航:网站首页 > C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形... C语言编程,已知三角形的三边长a,b,c,计算求三角 ...

  4. php100以内质数求和,100以内的质数_PHP质数计算三种方法 php求100以内的质数

    摘要 腾兴网为您分享:PHP质数计算三种方法 php求100以内的质数,自动刷宝,长沙银行,猿辅导,愈加等软件知识,以及cf一键刷枪,业主名录采集软件,卡乐光电,魔方虚拟光驱,掌上徐州,卡农社区,fa ...

  5. java求外接圆圆心_由三点三维坐标计算圆半径和圆心位置

    [实例简介] 通过输入任意三点空间坐标自动判断三点是否在一条直线上,若不在则求三点外接圆的圆心位置和半径,计算精度可调节.解决了"知三点求圆心半径"程序对于某些点无法计算的缺陷. ...

  6. QT快速入门、三点求圆心实现详解

    在编程中,会经常用到数学计算,所以C++将常用的数学计算,例如求正余弦等,封装成函数(正是我们在3.2 数学计算中学习到的),我们只需要写入简单的语句就可以执行所需要的功能,这正是函数的意义.在这一章 ...

  7. 多电压等级计算机潮流计算,第三章简单电力系统的潮流计算

    <第三章简单电力系统的潮流计算>由会员分享,可在线阅读,更多相关<第三章简单电力系统的潮流计算(52页珍藏版)>请在人人文库网上搜索. 1.问题的提出,第3章 简单电力系统的潮 ...

  8. 三点法求三维坐标精度误差评估实验

    1. 实验目的 1) 对实验做一个系统性的误差评价. 2) 验证本实验的精度能否达到测量空间角的要求. 2.  实验原理 参考论文[1]进行误差评估实验,但是由于论文中的评定指标并不都适合本次实验,所 ...

  9. 三个数求其中的最大值和最小值

    /* *Copyritht (c) 2013,烟台大学计算学院 *All rigts reserved. *作者:高古尊 *版本号:v1.0 *问题的描述: 任意输入三个数,求它们的最大值和最小值 * ...

最新文章

  1. 从numpy开启Python数据科学之旅
  2. yolov5 mobile 剪枝
  3. canopy算法 java_mahout源码canopy算法分析之二CanopyMapper
  4. NiosII中Flash的使用(转)
  5. 解决del找不到关键词‘province‘的问题和思想
  6. 响应式系统reactive system初探
  7. 获取${}中的值? 比如说var a=${date },无法取出date中的值
  8. 五大数据库理念,读懂亚马逊云科技的数据库布局
  9. 计算机相关专业“Python程序设计”教学大纲(参考)
  10. php中高光显示的高数,[技术博客]React Native——HTML页面代码高亮数学公式解析...
  11. vscode-background插件“卸载“以及“禁用“失效
  12. 对信号函数sigaction的sa_mask的学习
  13. 高斯消元解同余方程组
  14. c++股票数据接口逻辑是什么
  15. java实习面试题整理
  16. 一文读懂长非编码RNA(lncRNA)的分类、功能及测序鉴定方法
  17. TJUPT 无法与服务器建立连接问题的解决方法
  18. ttl传输中过期可能是什么原因_ttl传输中过期怎么解决
  19. 手把手教用matlab做无人驾驶
  20. C++ 使用Poco库操作 json 文件

热门文章

  1. \xe4\xb8\xad\xe6\x96\x87 phython 字符编码乱码问题
  2. LaTeX学习总结5(插图)
  3. 语音识别(语音转文字) 语音合成(文字转语音)
  4. 网易互娱人工智能工程师笔试题
  5. ZedBoard的初步学习-通信设置
  6. 常见EDA软件工具有哪些?(附EDA企业名单)
  7. STM32 TIM PWM高阶操作:刹车及状态约束
  8. WEB前端大作业-汽车保养服务中心响应式网页模板(HTML JS CSS)
  9. 证明一个数能被3整除,当且仅当它的各位数的和能被3整除!
  10. Hotspot 垃圾回收之ReferenceProcessor(二) 源码解析