欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 如何判斷四個(gè)點(diǎn)是否構(gòu)成正方形

 更新時(shí)間:2021年03月25日 15:39:19   作者:蹊言君  
這篇文章主要介紹了C++ 如何判斷四個(gè)點(diǎn)是否構(gòu)成正方形的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

判斷方法分為兩步:

1.判斷四條邊是否相等;

2.判斷是否有一個(gè)角為直角;

求解兩點(diǎn)之前距離的函數(shù):

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

判斷三點(diǎn)連續(xù)構(gòu)成的角是否為直角,第一個(gè)點(diǎn)參數(shù)為頂點(diǎn):

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;
//直接調(diào)用IsSquare函數(shù),輸入為四個(gè)點(diǎn)的坐標(biāo),輸出為true or false;
//求兩點(diǎn)間的距離
double Distance(int x1,int y1,int x2,int y2){
  return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
//判斷三個(gè)點(diǎn)是否構(gòu)成直角,第一個(gè)參數(shù)點(diǎn)是頂點(diǎn)
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;
}

測(cè)試用例:

0 1 1 0 1 1 0 0

輸出結(jié)果為1(true)

補(bǔ)充:判斷四個(gè)點(diǎn)是否可以構(gòu)成矩形(優(yōu)雅的解法?。。。?/strong>

首先我們需要先檢查輸入的四個(gè)點(diǎn)是不是有重復(fù)。然后判斷四個(gè)角是不是直角即可。

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)

一個(gè)更加巧妙地回答,我們可以先計(jì)算中點(diǎn)的位置

然后再計(jì)算中點(diǎn)到四個(gè)點(diǎn)的距離是不是一樣即可。

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • C++使用宏實(shí)現(xiàn)動(dòng)態(tài)庫加載

    C++使用宏實(shí)現(xiàn)動(dòng)態(tài)庫加載

    開發(fā)的時(shí)候,有些項(xiàng)目不能靜態(tài)鏈接動(dòng)態(tài)庫,需要程序運(yùn)行時(shí)加載動(dòng)態(tài)庫。本文將使用宏來實(shí)現(xiàn)動(dòng)態(tài)庫的加載,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • OpenCV實(shí)現(xiàn)圖像連通域

    OpenCV實(shí)現(xiàn)圖像連通域

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像連通域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 利用C/C++二進(jìn)制讀寫png文件的方法示例

    利用C/C++二進(jìn)制讀寫png文件的方法示例

    最近在做項(xiàng)目的時(shí)候遇到了這個(gè)問題,所以想著總結(jié)下,方法自己和有需要的朋友,下面這篇文章主要介紹了利用C/C++二進(jìn)制讀寫png文件的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C語言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    C語言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 利用C++實(shí)現(xiàn)雙鏈表基本接口示例代碼

    利用C++實(shí)現(xiàn)雙鏈表基本接口示例代碼

    雙鏈表:在單鏈表的每個(gè)結(jié)點(diǎn)中,再設(shè)置一個(gè)指向其前驅(qū)結(jié)點(diǎn)的指針域,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)雙鏈表基本接口的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法

    詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法

    這篇文章主要介紹了C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法,演示了使用JsonCpp生成和解析JSON的方法,以及C++通過JSON方式的socket通信示例,需要的朋友可以參考下
    2016-03-03
  • 最大子矩陣問題實(shí)例解析

    最大子矩陣問題實(shí)例解析

    這篇文章主要介紹了最大子矩陣問題實(shí)例解析,分別列舉了Java和C語言的相關(guān)實(shí)現(xiàn),需要的朋友可以參考下
    2015-08-08
  • 復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • 詳解C語言中的動(dòng)態(tài)內(nèi)存管理

    詳解C語言中的動(dòng)態(tài)內(nèi)存管理

    對(duì)于數(shù)據(jù)的存儲(chǔ)我們可以靜態(tài)存儲(chǔ),也可以動(dòng)態(tài)存儲(chǔ),兩種方式都有自己特有的好處,這篇文章教我們?nèi)绾瓦M(jìn)行動(dòng)態(tài)的數(shù)據(jù)存儲(chǔ)?。。?!感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C++ Boost.Range與Adapters庫使用詳解

    C++ Boost.Range與Adapters庫使用詳解

    這篇文章主要介紹了C++ Boost.Range與Adapters庫使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-11-11

最新評(píng)論