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

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

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

判斷方法分為兩步:

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

2.判斷是否有一個角為直角;

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

    C++使用宏實現(xiàn)動態(tài)庫加載

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

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

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

    利用C/C++二進制讀寫png文件的方法示例

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

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

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

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

    雙鏈表:在單鏈表的每個結(jié)點中,再設(shè)置一個指向其前驅(qū)結(jié)點的指針域,下面這篇文章主要給大家介紹了關(guān)于利用C++實現(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
  • 最大子矩陣問題實例解析

    最大子矩陣問題實例解析

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

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

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

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

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

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

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

最新評論