C# 如何检查给定的四个点是否形成一个正方形(How to check if given four points form a square)

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

要检查正方形,我们需要检查以下内容:

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 相同。

以下是上述想法的实现:

// 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

输出:

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

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

扩展: 检查四个线段是否形成一个矩形

JavaScript:https://blog.csdn.net/hefeng_aspnet/article/details/145686594

C#:https://blog.csdn.net/hefeng_aspnet/article/details/145686569

Python:https://blog.csdn.net/hefeng_aspnet/article/details/145686543

Java:https://blog.csdn.net/hefeng_aspnet/article/details/145686509

C++:https://blog.csdn.net/hefeng_aspnet/article/details/145686317

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
PPPPPaPeR.7 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
看我干嘛!7 小时前
python第五次作业
算法
历程里程碑7 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun7 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon7 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
wxin_VXbishe7 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
生锈的键盘7 小时前
推荐算法实践:交叉特征的理解
算法
乌萨奇也要立志学C++7 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米7 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)8 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法