C++ 如何判斷四個(gè)點(diǎn)是否構(gòu)成正方形
判斷方法分為兩步:
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語(yǔ)言利用system調(diào)用系統(tǒng)命令行詳情
這篇文章主要介紹了C語(yǔ)言利用system調(diào)用系統(tǒng)命令行詳情,system就是調(diào)用系統(tǒng)命令行,輸入為字符串,然后把這個(gè)字符串輸出給命令行,讓命令行執(zhí)行。下文的具體內(nèi)容,需要的小伙伴可以參考一下2022-01-01
C語(yǔ)言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解
這篇文章主要為大家介紹了C語(yǔ)言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
C語(yǔ)言volatile關(guān)鍵字的作用與示例
這篇文章主要介紹了C語(yǔ)言volatile關(guān)鍵字的作用,volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)2023-04-04

