c++ 程序来寻找三角形的外心(Program to find Circumcenter of a Triangle)

给定 2D 平面中 3 个非共线点 P、Q 和 R,以及它们各自的 x 和 y 坐标,找到三角形的外心。
注意:三角形的外心是圆的中心,由三角形的三个顶点形成。请注意,三个点可以唯一地确定一个圆。
示例: 

输入:P(6, 0) 
        Q(0, 0) 
        R(0, 8)
        
输出:三角形 PQR 的外心
         是:(3, 4)

输入:P(1, 1) 
        Q(0, 0) 
        R(2, 2)
        
输出:找到的两条垂直平分线平行。因此,给定的点不形成三角形并且共线

给定三角形的三个点,我们可以轻松找到三角形的边。现在,我们有了三角形三边的直线方程。得到这些后,我们可以通过一个简单的属性找到三角形的外心,如下所示:

三角形的外心是三角形所有边的垂直平分线的交点。

下图很好地解释了这一点:

        请注意,这里不需要找到三角形的所有三条边。找到两条边就足够了,因为我们只需使用两条垂直平分线就可以唯一地找到交点。第三条垂直平分线本身将通过如此找到的外心。
要做的事情可以分为以下几部分: 

        1、找到构成三角形边的两条线(比如 PQ 和 QR)。

        2、找到 PQ 和 QR 的垂直平分线(分别称为线 L 和 M)。

        3、找到直线 L 和 M 的交点作为给定三角形的外心。

步骤 1 
参考:
JavaScript 程序寻找通过 2 个点的线 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141058023
Python 程序寻找通过 2 个点的线 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141057960
Java 程序寻找通过 2 个点的线 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141057928
C# 程序寻找通过 2 个点的线 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141057987
C++ 程序寻找通过 2 个点的线 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/141057713

步骤 2 
让 PQ 表示为 ax + by = c 
垂直于此线的线表示为 -bx + ay = d,其中 d 为某个。 
但是,我们对垂直平分线感兴趣。因此,我们找到 P 和 Q 的中点,并将该值放入标准方程中,我们得到 d 的值。 
同样,我们对 QR 重复该过程。
 
d = -bx + ay
其中,x = (x p + x q )/2
且 y = (y p + y q )/2

步骤 3 
参考:
c++ 两线交点计算程序 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/144345813
Java 两线交点计算程序 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/144346095
Python 两线交点计算程序 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/144346130
c# 两线交点计算程序 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/144346249
Javascript 两线交点计算程序 https://blog.youkuaiyun.com/hefeng_aspnet/article/details/144346271

示例代码:

// C++ program to find the CIRCUMCENTER of a
// triangle
#include <iostream>
#include <cfloat>
using namespace std;
 
// This pair is used to store the X and Y
// coordinate of a point respectively
#define pdd pair<double, double>
 
// Function to find the line given two points
void lineFromPoints(pdd P, pdd Q, double &a,
                        double &b, double &c)
{
    a = Q.second - P.second;
    b = P.first - Q.first;
    c = a*(P.first)+ b*(P.second);
}
 
// Function which converts the input line to its
// perpendicular bisector. It also inputs the points
// whose mid-point lies on the bisector
void perpendicularBisectorFromLine(pdd P, pdd Q,
                 double &a, double &b, double &c)
{
    pdd mid_point = make_pair((P.first + Q.first)/2,
                            (P.second + Q.second)/2);
 
    // c = -bx + ay
    c = -b*(mid_point.first) + a*(mid_point.second);
 
    double temp = a;
    a = -b;
    b = temp;
}
 
// Returns the intersection point of two lines
pdd lineLineIntersection(double a1, double b1, double c1,
                         double a2, double b2, double c2)
{
    double determinant = a1*b2 - a2*b1;
    if (determinant == 0)
    {
        // The lines are parallel. This is simplified
        // by returning a pair of FLT_MAX
        return make_pair(FLT_MAX, FLT_MAX);
    }
 
    else
    {
        double x = (b2*c1 - b1*c2)/determinant;
        double y = (a1*c2 - a2*c1)/determinant;
        return make_pair(x, y);
    }
}
 
void findCircumCenter(pdd P, pdd Q, pdd R)
{
    // Line PQ is represented as ax + by = c
    double a, b, c;
    lineFromPoints(P, Q, a, b, c);
 
    // Line QR is represented as ex + fy = g
    double e, f, g;
    lineFromPoints(Q, R, e, f, g);
 
    // Converting lines PQ and QR to perpendicular
    // vbisectors. After this, L = ax + by = c
    // M = ex + fy = g
    perpendicularBisectorFromLine(P, Q, a, b, c);
    perpendicularBisectorFromLine(Q, R, e, f, g);
 
    // The point of intersection of L and M gives
    // the circumcenter
    pdd circumcenter =
           lineLineIntersection(a, b, c, e, f, g);
 
    if (circumcenter.first == FLT_MAX &&
        circumcenter.second == FLT_MAX)
    {
        cout << "The two perpendicular bisectors "
                "found come parallel" << endl;
        cout << "Thus, the given points do not form "
                "a triangle and are collinear" << endl;
    }
 
    else
    {
        cout << "The circumcenter of the triangle PQR is: ";
        cout << "(" << circumcenter.first << ", "
             << circumcenter.second  << ")" << endl;
    }
}
 
// Driver code.
int main()
{
    pdd P = make_pair(6, 0);
    pdd Q = make_pair(0, 0);
    pdd R = make_pair(0, 8);
    findCircumCenter(P, Q, R);
    return 0;
}

输出: 
 
三角形 PQR 的外心是:(3,4)

时间复杂度:O(1),因为执行常量操作

辅助空间: O(1)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值