给定四个非共线点A、B、C 和 P。任务是找出P点是否位于A、B 和 C形成的外接圆的内部、外部或上。
例子
Input: A = {2, 8}, B = {2, 1}, C = {4, 5}, P = {2, 4};
Output: Point (2, 4) is inside the circumcircle.
Input: A = {2, 8}, B = {2, 1}, C = {4, 5}, P = {3, 0};
Output: Point (3, 0) lies outside the circumcircle.
方法:
- 用本文讨论的方法找出由A、B 和 C点形成的三角形的圆周心。
- 在上述步骤中得到外心的点后,通过使用以下公式计算外心与A、B 或 C点之一之间的距离,找到外心的半径:
For Point A = (x, y) and Point B = (a, b)
The distance between points A and B is given by:-
distance = sqrt((x - a)2 + (y - b)2)
- 由于我们知道圆的半径和外心以及点P 的坐标,因此使用本文讨论的方法找到点P的位置。
下面是上述方法的实现:
C++
// C++ program to find the points
// which lies inside, outside or
// on the circle
#include
using namespace std;
// Structure Pointer to
// store x and y coordinates
struct point {
double x, y;
};
// Function to find the line given
// two points
void lineFromPoints(point P, point Q,
double& a, double& b,
double& c)
{
a = Q.y - P.y;
b = P.x - Q.x;
c = a * (P.x) + b * (P.y);
}
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
void perpenBisectorFromLine(point P, point Q,
double& a, double& b,
double& c)
{
// Find the mid point
point mid_point;
// x coordinates
mid_point.x = (P.x + Q.x) / 2;
// y coordinates
mid_point.y = (P.y + Q.y) / 2;
// c = -bx + ay
c = -b * (mid_point.x)
+ a * (mid_point.y);
// Assign the coefficient of
// a and b
double temp = a;
a = -b;
b = temp;
}
// Returns the intersection point of
// two lines
double LineInterX(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double x = (b2 * c1 - b1 * c2);
x /= determ;
return x;
}
// Returns the intersection point of
// two lines
double LineInterY(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double y = (a1 * c2 - a2 * c1);
y /= determ;
return y;
}
// Function to find the point
// lies inside, outside or on
// the circle
void findPosition(point P, point Q,
point R, point D)
{
// Store the coordinates
// radius of circumcircle
point 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 bisectors.
// After this, L = ax + by = c
// M = ex + fy = g
perpenBisectorFromLine(P, Q, a, b, c);
perpenBisectorFromLine(Q, R, e, f, g);
// The point of intersection
// of L and M gives r as the
// circumcenter
r.x = LineInterX(a, b, c, e, f, g);
r.y = LineInterY(a, b, c, e, f, g);
// Length of radius
double q = (r.x - P.x) * (r.x - P.x)
+ (r.y - P.y) * (r.y - P.y);
// Distance between radius
// and the given point D
double dis = (r.x - D.x) * (r.x - D.x)
+ (r.y - D.y) * (r.y - D.y);
// Condition for point lies
// inside circumcircle
if (dis < q) {
cout << "Point (" << D.x << ", "
<< D.y << ") is inside "
<< "the circumcircle";
}
// Condition for point lies
// on circumcircle
else if (dis == q) {
cout << "Point (" << D.x << ", "
<< D.y << ") lies on the "
<< "circumcircle";
}
// Condition for point lies
// outside circumcircle
else {
cout << "Point (" << D.x << ", "
<< D.y << ") lies outside"
<< " the circumcircle";
}
}
// Driver Code
int main()
{
point A, B, C, D;
// Given Points
A = { 2, 8 };
B = { 2, 1 };
C = { 4, 5 };
D = { 3, 0 };
// Function call to find
// the point lies inside,
// outside or on the
// circle
findPosition(A, B, C, D);
return 0;
}
Java
// Java program to find the points
// which lies inside, outside or
// on the circle
class GFG{
// Structure Pointer to
// store x and y coordinates
static class point {
double x, y;
public point() {
}
public point(double x, double y) {
this.x = x;
this.y = y;
}
};
// Function to find the line given
// two points
static void lineFromPoints(point P, point Q,
double a, double b,
double c)
{
a = Q.y - P.y;
b = P.x - Q.x;
c = a * (P.x) + b * (P.y);
}
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
static void perpenBisectorFromLine(point P, point Q,
double a, double b,
double c)
{
// Find the mid point
point mid_point = new point();
// x coordinates
mid_point.x = (P.x + Q.x) / 2;
// y coordinates
mid_point.y = (P.y + Q.y) / 2;
// c = -bx + ay
c = -b * (mid_point.x)
+ a * (mid_point.y);
// Assign the coefficient of
// a and b
double temp = a;
a = -b;
b = temp;
}
// Returns the intersection point of
// two lines
static double LineInterX(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double x = (b2 * c1 - b1 * c2);
x /= determ;
return x;
}
// Returns the intersection point of
// two lines
static double LineInterY(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double y = (a1 * c2 - a2 * c1);
y /= determ;
return y;
}
// Function to find the point
// lies inside, outside or on
// the circle
static void findPosition(point P, point Q,
point R, point D)
{
// Store the coordinates
// radius of circumcircle
point r = new point();
// Line PQ is represented
// as ax + by = c
double a = 0, b = 0, c = 0;
lineFromPoints(P, Q, a, b, c);
// Line QR is represented
// as ex + fy = g
double e = 0, f = 0, g = 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
perpenBisectorFromLine(P, Q, a, b, c);
perpenBisectorFromLine(Q, R, e, f, g);
// The point of intersection
// of L and M gives r as the
// circumcenter
r.x = LineInterX(a, b, c, e, f, g);
r.y = LineInterY(a, b, c, e, f, g);
// Length of radius
double q = (r.x - P.x) * (r.x - P.x)
+ (r.y - P.y) * (r.y - P.y);
// Distance between radius
// and the given point D
double dis = (r.x - D.x) * (r.x - D.x)
+ (r.y - D.y) * (r.y - D.y);
// Condition for point lies
// inside circumcircle
if (dis < q) {
System.out.print("Point (" + D.x+ ", "
+ D.y+ ") is inside "
+ "the circumcircle");
}
// Condition for point lies
// on circumcircle
else if (dis == q) {
System.out.print("Point (" + D.x+ ", "
+ D.y+ ") lies on the "
+ "circumcircle");
}
// Condition for point lies
// outside circumcircle
else {
System.out.print("Point (" + D.x+ ", "
+ D.y+ ") lies outside"
+ " the circumcircle");
}
}
// Driver Code
public static void main(String[] args)
{
point A, B, C, D;
// Given Points
A = new point(2, 8 );
B = new point(2, 1 );
C = new point(4, 5 );
D = new point(3, 0 );
// Function call to find
// the point lies inside,
// outside or on the
// circle
findPosition(A, B, C, D);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program to find the points
# which lies inside, outside or
# on the circle
# 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-lies o
# on the bisector
def perpenBisectorFromLine(P, Q, a, b, c):
# Find the mid point
mid_point = [0, 0]
# x coordinates
mid_point[0] = (P[0] + Q[0]) / 2
# y coordinates
mid_point[1] = (P[1] + Q[1]) / 2
# c = -bx + ay
c = (-b * (mid_point[0]) +
a * (mid_point[1]))
# Assign the coefficient of
# a and b
temp = a
a = -b
b = temp
return a, b, c
# Returns the intersection of
# two lines
def LineInterX(a1, b1, c1, a2, b2, c2):
# Find determinant
determ = a1 * b2 - a2 * b1
x = (b2 * c1 - b1 * c2)
x /= determ
return x
# Returns the intersection of
# two lines
def LineInterY(a1, b1, c1, a2, b2, c2):
# Find determinant
determ = a1 * b2 - a2 * b1
y = (a1 * c2 - a2 * c1)
#print(y)
y /= determ
return y
# Function to find the point
# lies inside, outside or on
# the circle
def findPosition(P, Q, R, D):
# Store the coordinates
# radius of circumcircle
r = [0, 0]
# Line PQ is represented
# as ax + by = c
a, b, c = lineFromPoints(P, Q, 0, 0, 0)
# Line QR is represented
# as ex + fy = g
e, f, g = lineFromPoints(Q, R, 0, 0, 0)
# Converting lines PQ and QR
# to perpendicular bisectors.
# After this, L = ax + by = c
# M = ex + fy = g
a, b, c = perpenBisectorFromLine(P, Q,
a, b, c)
e, f, g = perpenBisectorFromLine(Q, R,
e, f, g)
# The of intersection
# of L and M gives r as the
# circumcenter
r[0] = LineInterX(a, b, c, e, f, g)
r[1] = LineInterY(a, b, c, e, f, g)
# Length of radius
q = ((r[0] - P[0]) *
(r[0] - P[0]) +
(r[1] - P[1]) *
(r[1] - P[1]))
# Distance between radius
# and the given D
dis = ((r[0] - D[0]) *
(r[0] - D[0]) +
(r[1] - D[1]) *
(r[1] - D[1]))
# Condition for lies
# inside circumcircle
if (dis < q):
print("Point (", D[0], ",", D[1],
") is inside the circumcircle")
# Condition for lies
# on circumcircle
elif (dis == q):
print("Point (", D[0], ",", D[1],
") lies on the circumcircle")
# Condition for lies
# outside circumcircle
else:
print("Point (", D[0], ",", D[1],
") lies outside the circumcircle")
# Driver Code
if __name__ == '__main__':
# A, B, C, D
# Given Points
A = [2, 8]
B = [2, 1]
C = [4, 5]
D = [3, 0]
# Function call to find
# the lies inside,
# outside or on the
# circle
findPosition(A, B, C, D)
# This code is contributed by mohit kumar 29
C#
// C# program to find the points
// which lies inside, outside or
// on the circle
using System;
class GFG{
// Structure Pointer to
// store x and y coordinates
class point {
public double x, y;
public point() {
}
public point(double x, double y) {
this.x = x;
this.y = y;
}
};
// Function to find the line given
// two points
static void lineFromPoints(point P, point Q,
double a, double b,
double c)
{
a = Q.y - P.y;
b = P.x - Q.x;
c = a * (P.x) + b * (P.y);
}
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
static void perpenBisectorFromLine(point P, point Q,
double a, double b,
double c)
{
// Find the mid point
point mid_point = new point();
// x coordinates
mid_point.x = (P.x + Q.x) / 2;
// y coordinates
mid_point.y = (P.y + Q.y) / 2;
// c = -bx + ay
c = -b * (mid_point.x)
+ a * (mid_point.y);
// Assign the coefficient of
// a and b
double temp = a;
a = -b;
b = temp;
}
// Returns the intersection point of
// two lines
static double LineInterX(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double x = (b2 * c1 - b1 * c2);
x /= determ;
return x;
}
// Returns the intersection point of
// two lines
static double LineInterY(double a1, double b1,
double c1, double a2,
double b2, double c2)
{
// Find determinant
double determ = a1 * b2 - a2 * b1;
double y = (a1 * c2 - a2 * c1);
y /= determ;
return y;
}
// Function to find the point
// lies inside, outside or on
// the circle
static void findPosition(point P, point Q,
point R, point D)
{
// Store the coordinates
// radius of circumcircle
point r = new point();
// Line PQ is represented
// as ax + by = c
double a = 0, b = 0, c = 0;
lineFromPoints(P, Q, a, b, c);
// Line QR is represented
// as ex + fy = g
double e = 0, f = 0, g = 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
perpenBisectorFromLine(P, Q, a, b, c);
perpenBisectorFromLine(Q, R, e, f, g);
// The point of intersection
// of L and M gives r as the
// circumcenter
r.x = LineInterX(a, b, c, e, f, g);
r.y = LineInterY(a, b, c, e, f, g);
// Length of radius
double q = (r.x - P.x) * (r.x - P.x)
+ (r.y - P.y) * (r.y - P.y);
// Distance between radius
// and the given point D
double dis = (r.x - D.x) * (r.x - D.x)
+ (r.y - D.y) * (r.y - D.y);
// Condition for point lies
// inside circumcircle
if (dis < q) {
Console.Write("Point (" + D.x+ ", "
+ D.y+ ") is inside "
+ "the circumcircle");
}
// Condition for point lies
// on circumcircle
else if (dis == q) {
Console.Write("Point (" + D.x+ ", "
+ D.y+ ") lies on the "
+ "circumcircle");
}
// Condition for point lies
// outside circumcircle
else {
Console.Write("Point (" + D.x+ ", "
+ D.y+ ") lies outside"
+ " the circumcircle");
}
}
// Driver Code
public static void Main(String[] args)
{
point A, B, C, D;
// Given Points
A = new point(2, 8 );
B = new point(2, 1 );
C = new point(4, 5 );
D = new point(3, 0 );
// Function call to find
// the point lies inside,
// outside or on the
// circle
findPosition(A, B, C, D);
}
}
// This code is contributed by Rajput-Ji
Javascript
输出:
Point (3, 0) lies outside the circumcircle