📜  查找三角形的圆心的程序

📅  最后修改于: 2021-04-27 21:24:27             🧑  作者: Mango

给定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

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

下图中对此进行了很好的解释。

三角形的圆心

请注意,无需查找三角形的所有三个边。找到两条边就足够了,因为我们仅需使用两个垂直平分线就可以唯一地找到交点。第三个垂直平分线本身将穿过如此发现的外接中心。
可以做的事情可以分为以下几类:

  1. 找到形成三角形边的2条线(例如PQ和QR)。
  2. 求出PQ和QR的垂直平分线(分别表示线L和M)。
  3. 找到直线L和M的交点作为给定三角形的外接点。

步骤1
请参阅此帖子程序以查找穿过2点的线
第2步
令PQ用ax + = 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)