问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C# 如何检查给定的四个点是否形成一个正方形

创作时间:
作者:
@小白创作中心

C# 如何检查给定的四个点是否形成一个正方形

引用
CSDN
1.
https://blog.csdn.net/hefeng_aspnet/article/details/145686008

给定平面上四个点的坐标,判断这四个点是否形成正方形。

要检查正方形,我们需要检查以下内容:
a) 由点形成的所有四条边都相同。
b) 任何两条边之间的角度都是 90 度。(此条件是必需的,因为菱形 也有相同的边)
c) 检查两条对角线的距离是否相同.

例子:

输入: p1 = { 20, 10 }, p2 = { 10, 20 }, p3 = { 20, 20 }, p4 = { 10, 10 }
输出: 是
解释:

输入: p1 = { 20, 20 }, p2 = { 10, 20 }, p3 = { 20, 20 }, p4 = { 10, 10 }
输出: 否

方法:
思路是选取任意一点并计算其与其余点的距离。设选取的点为“p”。要形成正方形,两个点与“p”的距离必须相同,设该距离为 d。与一个点的距离必须不同于 d,并且必须等于 d 的 2 倍。设距离不同的这个点为“q”。

上述条件还不够好,因为距离不同的点可能在另一侧。我们还需要检查 q 是否与其他 2 个点的距离相同,并且该距离与 d 相同。

以下是上述想法的实现:

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");  
    }  
}  

输出:

时间复杂度:O(1),所有操作都在 O(1) 常数时间内执行。

辅助空间:O(1),不需要额外空间

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号