给定 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 个点的线 JavaScript 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)_js如何判断两条线段在同一直线上-优快云博客
Python 程序寻找通过 2 个点的线 Python 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)_python两点坐标确定直线方程-优快云博客
Java 程序寻找通过 2 个点的线 Java 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)_java 两点确定直线-优快云博客
C# 程序寻找通过 2 个点的线 C# 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)_计算两个点 画线 c#-优快云博客
C++ 程序寻找通过 2 个点的线 C++ 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)_两点式直线方程 c++-优快云博客
步骤 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++ 两线交点计算程序 c++ 两线交点计算程序(Program for Point of Intersection of Two Lines)-优快云博客
Java 两线交点计算程序 Java 两线交点计算程序(Program for Point of Intersection of Two Lines)-优快云博客
Python 两线交点计算程序 Python 两线交点计算程序(Program for Point of Intersection of Two Lines)-优快云博客
c# 两线交点计算程序 C# 两线交点计算程序(Program for Point of Intersection of Two Lines)_单片机计算两线段交点-优快云博客
Javascript 两线交点计算程序 Javascript 两线交点计算程序(Program for Point of Intersection of Two Lines)-优快云博客
示例代码:
// Java program to find the CIRCUMCENTER of a triangle
import java.io.*;
import java.util.ArrayList;
public class GFG {
// Function to find the line given two points
public static void lineFromPoints(ArrayList<Integer> P, ArrayList<Integer> Q,
int[] a_b_c) {
a_b_c[0] = Q.get(1) - P.get(1);
a_b_c[1] = P.get(0) - Q.get(0);
a_b_c[2] = a_b_c[0] * (P.get(0)) + a_b_c[1] * (P.get(1));
}
// Function which converts the input line to its
// perpendicular bisector. It also inputs the points
// whose mid-point lies on the bisector
public static void perpendicularBisectorFromLine(
ArrayList<Integer> P, ArrayList<Integer> Q, int[] a_b_c) {
ArrayList<Integer> mid_point = new ArrayList<Integer>();
mid_point.add((P.get(0) + Q.get(0)) / 2);
mid_point.add((P.get(1) + Q.get(1)) / 2);
// c = -bx + ay
a_b_c[2] = -a_b_c[1] * (mid_point.get(0)) + a_b_c[0] * (mid_point.get(1));
int temp = a_b_c[0];
a_b_c[0] = -a_b_c[1];
a_b_c[1] = temp;
}
// Returns the intersection point of two lines
public static ArrayList<Integer> lineLineIntersection(int a1, int b1, int c1,
int a2, int b2, int c2) {
ArrayList<Integer> ans = new ArrayList<Integer>();
int determinant = a1 * b2 - a2 * b1;
if (determinant == 0) {
// The lines are parallel. This is simplified
// by returning a pair of FLT_MAX
ans.add(Integer.MAX_VALUE);
ans.add(Integer.MAX_VALUE);
} else {
int x = (b2 * c1 - b1 * c2) / determinant;
int y = (a1 * c2 - a2 * c1) / determinant;
ans.add(x);
ans.add(y);
}
return ans;
}
public static void findCircumCenter(ArrayList<Integer> P,
ArrayList<Integer> Q,
ArrayList<Integer> R) {
// Line PQ is represented as ax + by = c
int[] a_b_c = {0, 0, 0};
lineFromPoints(P, Q, a_b_c);
// Line QR is represented as ex + fy = g
int[] e_f_g = {0, 0, 0};
lineFromPoints(Q, R, e_f_g);
// Converting lines PQ and QR to perpendicular
// bisectors. 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
ArrayList<Integer> circumcenter = lineLineIntersection(a_b_c[0], a_b_c[1], a_b_c[2], e_f_g[0], e_f_g[1], e_f_g[2]);
if (circumcenter.get(0) == Integer.MAX_VALUE
&& circumcenter.get(1) == Integer.MAX_VALUE) {
System.out.println("The two perpendicular bisectors "
+ "found come parallel");
} else {
System.out.println("The circumcenter of the triangle PQR is: (" + circumcenter.get(0) + ", " + circumcenter.get(1) + ") ");
}
}
public static void main(String[] args) {
ArrayList<Integer> P = new ArrayList<Integer>();
P.add(6);
P.add(0);
ArrayList<Integer> Q = new ArrayList<Integer>();
Q.add(0);
Q.add(0);
ArrayList<Integer> R = new ArrayList<Integer>();
R.add(0);
R.add(8);
findCircumCenter(P, Q, R);
}
}
// this code is contributed by devendrasalunke
输出:
三角形 PQR 的外心是:(3,4)
时间复杂度:O(1),因为执行常量操作
辅助空间: O(1)
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
1526

被折叠的 条评论
为什么被折叠?



