C++ 如何判断四个点是否构成正方形

 更新时间:2021年03月25日 15:39:19   作者:蹊言君  
这篇文章主要介绍了C++ 如何判断四个点是否构成正方形的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

判断方法分为两步:

1.判断四条边是否相等;

2.判断是否有一个角为直角;

求解两点之前距离的函数:

double Distance(int x1,int y1,int x2,int y2){
  return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}

判断三点连续构成的角是否为直角,第一个点参数为顶点:

bool IsRightAngle(int x1,int y1,int x2,int y2,int x3,int y3){
  if((x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)==0)
    return true;
  return false;
}

完整的程序:

#include <iostream>
#include <math.h>
using namespace std;
//直接调用IsSquare函数,输入为四个点的坐标,输出为true or false;
//求两点间的距离
double Distance(int x1,int y1,int x2,int y2){
  return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
//判断三个点是否构成直角,第一个参数点是顶点
bool IsRightAngle(int x1,int y1,int x2,int y2,int x3,int y3){
  if((x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)==0)
    return true;
  return false;
}
bool IsSquare(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){
  if(x1==x2&&x2==x3)
    return false;
  double s12=Distance(x1,y1,x2,y2);
  double s13=Distance(x1,y1,x3,y3);
  double s14=Distance(x1,y1,x4,y4);
  double s23=Distance(x2,y2,x3,y3);
  double s24=Distance(x2,y2,x4,y4);
  double s34=Distance(x3,y3,x4,y4);
  if(s12==s13&&s24==s34&&s12==s24){
    if(IsRightAngle(x1,y1,x2,y2,x3,y3)) return true;
    else return false;
  }
  if(s12==s14&&s23==s34&&s12==s23){
    if(IsRightAngle(x1,y1,x2,y2,x4,y4)) return true;
    else return false;
  }
  if(s13==s14&&s23==s24&&s13==s23){
    if(IsRightAngle(x1,y1,x3,y3,x4,y4)) return true;
    else return false;
  }
  return false;
}
int main(){
  int x1,y1,x2,y2,x3,y3,x4,y4;
  cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
  cout<<IsSquare(x1,y1,x2,y2,x3,y3,x4,y4)<<endl;
  return 0;
}

测试用例:

0 1 1 0 1 1 0 0

输出结果为1(true)

补充:判断四个点是否可以构成矩形(优雅的解法!!!)

首先我们需要先检查输入的四个点是不是有重复。然后判断四个角是不是直角即可。

def isOrthogonal(p1, p2, p3):
  return (p2[0] - p1[0]) * (p2[0] - p3[0]) + (p2[1] - p1[1]) * (p2[1] - p3[1]) == 0
def _isRectangle(p1, p2, p3, p4):
  return self.isOrthogonal(p1, p2, p3) and self.isOrthogonal(p2, p3, p4) and self.isOrthogonal(p3, p4, p1)
def isRectangle(p1, p2, p3, p4):
  return self._isRectangle(p1, p2, p3, p4) or self._isRectangle(p2, p3, p1, p4) or self._isRectangle(p1, p3, p2, p4)

一个更加巧妙地回答,我们可以先计算中点的位置

然后再计算中点到四个点的距离是不是一样即可。

def dis(p1, p2):
  return (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2
def isRectangle(p1, p2, p3, p4):
  x_c = (p1[0] + p2[0] + p3[0] + p4[0])/4
  y_c = (p1[1] + p2[1] + p3[1] + p4[1])/4
  d1 = dis(p1, (x_c,y_c))
  d2 = dis(p2, (x_c,y_c))
  d3 = dis(p3, (x_c,y_c))
  d4 = dis(p4, (x_c,y_c))
  return d1 == d2 and d1 == d3 and d1 == d4

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 解决gcc编译报错unknown type name ‘bool‘问题

    解决gcc编译报错unknown type name ‘bool‘问题

    这篇文章主要介绍了解决gcc编译报错unknown type name ‘bool‘问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C与C++ 无参函数的区别解析

    C与C++ 无参函数的区别解析

    在《C++ 编程思想》:“关于无参函数声明,C与C++有很大的差别。在C语言中,声明int fun1(),意味着一个可以有任意数目和类型的函数;而在C++中,指的却是一个没有参数的函数”
    2013-07-07
  • C++实现高性能转换大小写算法示例

    C++实现高性能转换大小写算法示例

    大小写转换是我们作为一名程序员经常会遇到,也必须要会的一个功能,下面这篇文章主要给大家介绍了关于C++实现高性能转换大小写算法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-01-01
  • C语言实现一个多线程委托模型的示例详解

    C语言实现一个多线程委托模型的示例详解

    这篇文章主要介绍了C语言实现一个多线程委托模型,这就是一个使用C语言实现多线程委托模型的例子,其中包含boss线程和worker线程,可以处理工作线程的异常情况,需要的朋友可以参考下
    2023-06-06
  • 使用C语言如何输出逆序数

    使用C语言如何输出逆序数

    逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?下面这篇文章主要给大家介绍了关于使用C语言如何输出逆序数的相关资料,需要的朋友可以参考下
    2022-01-01
  • 浅谈C语言中include

    浅谈C语言中include""与include<>的区别

    C语言中包含文件有两种包含符号,一个是<>尖括号,另一个是""双引号。那么这两个有什么区别呢?本文就详细的介绍一下,感兴趣的可以了解一下
    2021-06-06
  • C++为什么不能修改set里的值?非要修改怎么办?

    C++为什么不能修改set里的值?非要修改怎么办?

    因为之前的文章有说过C++中 set的介绍及用法,今天这篇文章我们就来说说C++为什么不能修改set里的值,如果非要修改的话应该怎么办,下面我们一起进入文章看看下面内容,需要的朋友可以参考以下,希望对你有所帮助
    2021-11-11
  • C++模板二段名字查找方法

    C++模板二段名字查找方法

    下面小编就为大家带来一篇C++模板二段名字查找方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Unity3D实现经典小游戏Pacman

    Unity3D实现经典小游戏Pacman

    这篇文章主要介绍了基于Unity3D制作一做个经典小游戏Pacman,文中的示例代码讲解详细,对我们学习Unity3D有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C语言菜鸟基础教程之条件判断

    C语言菜鸟基础教程之条件判断

    本文给大家简单介绍了下C语言中的条件判断语句的语法和用法示例,非常简洁实用,有需要的小伙伴可以参考下
    2017-10-10

最新评论