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++使用宏實(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-12C語言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法
這篇文章主要介紹了C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法,演示了使用JsonCpp生成和解析JSON的方法,以及C++通過JSON方式的socket通信示例,需要的朋友可以參考下2016-03-03復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10