给定 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)
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。