给定 2D 平面 P、Q 和 R 中的 3 个非共线点及其各自的 x 和 y 坐标,找到三角形的外心。
注:三角形的圆心是圆的中心,由三角形的三个顶点组成。请注意,三个点可以唯一确定一个圆。
例子:
Input : P(6, 0)
Q(0, 0)
R(0, 8)
Output : The circumcenter of the triangle PQR
is: (3, 4)
Input : P(1, 1)
Q(0, 0)
R(2, 2)
Output : The two perpendicular bisectors found
come parallel. Thus, the given points
do not form a triangle and are collinear
给定三角形的三个点,我们可以很容易地找到三角形的边。现在,我们有了三角形三边的直线方程。得到这些后,我们可以通过一个简单的属性找到三角形的外心,如下所示:
The circumcenter of the triangle is point where all the perpendicular bisectors of the sides of the triangle intersect.
这在下图中得到了很好的解释。
请注意,不需要找到三角形的所有三个边。找到两条边就足够了,因为我们可以只使用两个垂直的平分线来唯一地找到交点。第三个垂直平分线本身将通过如此找到的外心。
要做的事情可以分为以下几类:
- 找出构成三角形边的 2 条线(比如 PQ 和 QR)。
- 找到 PQ 和 QR 的垂直平分线(分别是线 L 和 M)。
- 找到线 L 和 M 的交点作为给定三角形的外心。
第1步
请参阅此帖子程序以查找通过 2 点的线
第2步
令 PQ 表示为 ax + by = c
对于某些 d,垂直于这条线的线表示为 -bx + ay = d。
然而,我们对垂直平分线感兴趣。因此,我们找到 P 和 Q 的中点并将该值放入标准方程中,我们得到 d 的值。
同样,我们重复 QR 的过程。
d = -bx + ay
where, x = (xp + xq)/2
AND y = (yp + yq)/2
第 3 步
参考这篇文章两条线的交点程序
CPP
// C++ program to find the CIRCUMCENTER of a
// triangle
#include
#include
using namespace std;
// This pair is used to store the X and Y
// coordinate of a point respectively
#define pdd pair
// 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;
}
Python3
# Python3 program to find the CIRCUMCENTER of a
# triangle
# This pair is used to store the X and Y
# coordinate of a point respectively
# define pair
# Function to find the line given two points
def lineFromPoints(P, Q, a, b, c):
a = Q[1] - P[1]
b = P[0] - Q[0]
c = a * (P[0]) + b * (P[1])
return a, b, c
# Function which converts the input line to its
# perpendicular bisector. It also inputs the points
# whose mid-point lies on the bisector
def perpendicularBisectorFromLine(P, Q, a, b, c):
mid_point = [(P[0] + Q[0])//2, (P[1] + Q[1])//2]
# c = -bx + ay
c = -b * (mid_point[0]) + a * (mid_point[1])
temp = a
a = -b
b = temp
return a, b, c
# Returns the intersection point of two lines
def lineLineIntersection(a1, b1, c1, a2, b2, c2):
determinant = a1 * b2 - a2 * b1
if (determinant == 0):
# The lines are parallel. This is simplified
# by returning a pair of (10.0)**19
return [(10.0)**19, (10.0)**19]
else:
x = (b2 * c1 - b1 * c2)//determinant
y = (a1 * c2 - a2 * c1)//determinant
return [x, y]
def findCircumCenter(P, Q, R):
# Line PQ is represented as ax + by = c
a, b, c = 0.0, 0.0, 0.0
a, b, c = lineFromPoints(P, Q, a, b, c)
# Line QR is represented as ex + fy = g
e, f, g = 0.0, 0.0, 0.0
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
a, b, c = perpendicularBisectorFromLine(P, Q, a, b, c)
e, f, g = perpendicularBisectorFromLine(Q, R, e, f, g)
# The point of intersection of L and M gives
# the circumcenter
circumcenter = lineLineIntersection(a, b, c, e, f, g)
if (circumcenter[0] == (10.0)**19 and circumcenter[1] == (10.0)**19):
print("The two perpendicular bisectors found come parallel")
print("Thus, the given points do not form a triangle and are collinear")
else:
print("The circumcenter of the triangle PQR is: ", end="")
print("(", circumcenter[0], ",", circumcenter[1], ")")
# Driver code.
if __name__ == '__main__':
P = [6, 0]
Q = [0, 0]
R = [0, 8]
findCircumCenter(P, Q, R)
# This code is contributed by mohit kumar 29
输出:
The circumcenter of the triangle PQR is: (3, 4)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。