📌  相关文章
📜  如何检查给定的四个点是否形成正方形

📅  最后修改于: 2021-04-29 15:10:26             🧑  作者: Mango

给定平面中四个点的坐标,请确定四个点是否形成正方形。
要检查正方形,我们需要检查以下内容。
a)由点组成的四肢相同。
b)任意两侧之间的角度为90度。 (此条件是必需的,因为四边形也具有相同的边。
c)检查两个对角线的距离是否相同

正方形

这个想法是选择任何点并计算其与其余点的距离。让选取的点为“ p”。为了形成一个正方形,两个点的距离必须与“ p”相同,使该距离为d。与一个点的距离必须不同于d,并且必须等于d的√2倍。让具有不同距离的该点为“ q”。
由于距离不同的点可能在另一侧,因此上述条件还不够好。我们还需要检查q与其他2个点的距离是否相同,并且该距离与d相同。
以下是上述想法的实现。

C++
// A C++ program to check if four given points form a square or not.
#include 
using namespace std;
 
// Structure of a point in 2D space
struct Point {
    int x, y;
};
 
// A utility function to find square of distance
// from point 'p' to point 'q'
int distSq(Point p, Point q)
{
    return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y);
}
 
// This function returns true if (p1, p2, p3, p4) form a
// square, otherwise false
bool isSquare(Point p1, Point p2, Point p3, Point p4)
{
    int d2 = distSq(p1, p2); // from p1 to p2
    int d3 = distSq(p1, p3); // from p1 to p3
    int d4 = distSq(p1, p4); // from p1 to p4
 
    if (d2 == 0 || d3 == 0 || d4 == 0)   
        return false;
 
    // If lengths if (p1, p2) and (p1, p3) are same, then
    // following conditions must met to form a square.
    // 1) Square of length of (p1, p4) is same as twice
    // the square of (p1, p2)
    // 2) Square of length of (p2, p3) is same
    // as twice the square of (p2, p4)
 
    if (d2 == d3 && 2 * d2 == d4
        && 2 * distSq(p2, p4) == distSq(p2, p3)) {
        return true;
    }
 
    // The below two cases are similar to above case
    if (d3 == d4 && 2 * d3 == d2
        && 2 * distSq(p3, p2) == distSq(p3, p4)) {
        return true;
    }
    if (d2 == d4 && 2 * d2 == d3
        && 2 * distSq(p2, p3) == distSq(p2, p4)) {
        return true;
    }
 
    return false;
}
 
// Driver program to test above function
int main()
{
    Point p1 = { 20, 10 }, p2 = { 10, 20 },
          p3 = { 20, 20 }, p4 = { 10, 10 };
    isSquare(p1, p2, p3, p4) ? cout << "Yes" : cout << "No";
    return 0;
}


Java
// A Java program to check if four given points form a square or not.
 
class GFG
{
 
// Structure of a point in 2D space
static class Point
{
    int x, y;
 
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
     
};
 
// A utility function to find square of distance
// from point 'p' to point 'q'
static int distSq(Point p, Point q)
{
    return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y);
}
 
// This function returns true if (p1, p2, p3, p4) form a
// square, otherwise false
static boolean isSquare(Point p1, Point p2, Point p3, Point p4)
{
    int d2 = distSq(p1, p2); // from p1 to p2
    int d3 = distSq(p1, p3); // from p1 to p3
    int d4 = distSq(p1, p4); // from p1 to p4
 
    if (d2 == 0 || d3 == 0 || d4 == 0)   
        return false;
 
    // If lengths if (p1, p2) and (p1, p3) are same, then
    // following conditions must met to form a square.
    // 1) Square of length of (p1, p4) is same as twice
    // the square of (p1, p2)
    // 2) Square of length of (p2, p3) is same
    // as twice the square of (p2, p4)
 
    if (d2 == d3 && 2 * d2 == d4
        && 2 * distSq(p2, p4) == distSq(p2, p3))
    {
        return true;
    }
 
    // The below two cases are similar to above case
    if (d3 == d4 && 2 * d3 == d2
        && 2 * distSq(p3, p2) == distSq(p3, p4))
    {
        return true;
    }
    if (d2 == d4 && 2 * d2 == d3
        && 2 * distSq(p2, p3) == distSq(p2, p4))
    {
        return true;
    }
 
    return false;
}
 
// Driver code
public static void main(String[] args)
{
    Point p1 = new Point(20, 10), p2 = new Point( 10, 20 ),
        p3 = new Point(20, 20 ), p4 = new Point( 10, 10 );
    System.out.println(isSquare(p1, p2, p3, p4)==true ? "Yes" : "No");
}
}
 
// This code is contributed by PrinciRaj1992


Python3
# A Python3 program to check if
# four given points form a square or not.
class Point:
     
    # Structure of a point in 2D space
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
# A utility function to find square of
# distance from point 'p' to point 'q'
def distSq(p, q):
    return (p.x - q.x) * (p.x - q.x) +\
           (p.y - q.y) * (p.y - q.y)
 
# This function returns true if (p1, p2, p3, p4)
# form a square, otherwise false
def isSquare(p1, p2, p3, p4):
 
    d2 = distSq(p1, p2) # from p1 to p2
    d3 = distSq(p1, p3) # from p1 to p3
    d4 = distSq(p1, p4) # from p1 to p4
 
    if d2 == 0 or d3 == 0 or d4 == 0:   
        return False
 
    # If lengths if (p1, p2) and (p1, p3) are same, then
    # following conditions must be met to form a square.
    # 1) Square of length of (p1, p4) is same as twice
    # the square of (p1, p2)
    # 2) Square of length of (p2, p3) is same
    # as twice the square of (p2, p4)
 
    if d2 == d3 and 2 * d2 == d4 and \
                    2 * distSq(p2, p4) == distSq(p2, p3):
        return True
 
    # The below two cases are similar to above case
    if d3 == d4 and 2 * d3 == d2 and \
                    2 * distSq(p3, p2) == distSq(p3, p4):
        return True
 
    if d2 == d4 and 2 * d2 == d3 and \
                    2 * distSq(p2, p3) == distSq(p2, p4):
        return True
 
    return False
 
# Driver Code
if __name__=="__main__":
    p1 = Point(20, 10)
    p2 = Point(10, 20)
    p3 = Point(20, 20)
    p4 = Point(10, 10)
     
    if isSquare(p1, p2, p3, p4):
        print('Yes')
    else:
        print('No')
 
# This code is contributed by Mayank Chaudhary
# aka chaudhary_19


C#
// A C# program to check if four given points form a square or not.
using System;
 
class GFG
{
 
// Structure of a point in 2D space
class Point
{
    public int x, y;
 
    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
     
};
 
// A utility function to find square of distance
// from point 'p' to point 'q'
static int distSq(Point p, Point q)
{
    return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y);
}
 
// This function returns true if (p1, p2, p3, p4) form a
// square, otherwise false
static bool isSquare(Point p1, Point p2, Point p3, Point p4)
{
    int d2 = distSq(p1, p2); // from p1 to p2
    int d3 = distSq(p1, p3); // from p1 to p3
    int d4 = distSq(p1, p4); // from p1 to p4
 
    if (d2 == 0 || d3 == 0 || d4 == 0)   
        return false;
 
    // If lengths if (p1, p2) and (p1, p3) are same, then
    // following conditions must met to form a square.
    // 1) Square of length of (p1, p4) is same as twice
    // the square of (p1, p2)
    // 2) Square of length of (p2, p3) is same
    // as twice the square of (p2, p4)
    if (d2 == d3 && 2 * d2 == d4
        && 2 * distSq(p2, p4) == distSq(p2, p3))
    {
        return true;
    }
 
    // The below two cases are similar to above case
    if (d3 == d4 && 2 * d3 == d2
        && 2 * distSq(p3, p2) == distSq(p3, p4))
    {
        return true;
    }
    if (d2 == d4 && 2 * d2 == d3
        && 2 * distSq(p2, p3) == distSq(p2, p4))
    {
        return true;
    }
    return false;
}
 
// Driver code
public static void Main(String[] args)
{
    Point p1 = new Point(20, 10), p2 = new Point(10, 20),
        p3 = new Point(20, 20), p4 = new Point(10, 10);
    Console.WriteLine(isSquare(p1, p2, p3, p4) == true ? "Yes" : "No");
}
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:

Yes