通過C++實現判斷點與多邊形的關係和兩點之間的距離
阿新 • • 發佈:2019-01-22
1.判斷兩點之間的距離
#include<math.h>
//計算兩點之間的距離
double calculateDistence(double* p0,double* p){
double tempx = p[0] - p0[0];
double tempy = p[1] - p0[1];
double tempz = p[2] - p0[2];
//pow(x,y)--x的y次方
double radius2 = pow(tempx,2)+pow(tempy,2)+pow(tempz,2);
return sqrt(radius2);
}
2.判斷點是是否在多邊形內
#include<vector>
#include<math.h>
struct Point2D{
double x;
double y;
Point2D(double _x,double _y){
x = _x;
y = _y;
}
};
bool pointInPolygon11(double* _p,std::vector<double*>& _polygon){
int numCrossPoint = 0;
for(int i=0; i<_polygon.size(); i++){
double * p1 = _polygon.at(i);
//(i+1)/polygon.size()--處理最後一點與第一點相連線
double* p2 = _polygon.at((i+1)%_polygon.size());
//這是一條水平線
if(p2[1] == p1[1]){
if(p1[1] == _p[1]){
if(_p[0] <= fmax(p1[0],p2[0]) && _p[0] >= fmin(p1[0],p2[0])){
return 1;
}else{
continue;
}
}else{
continue;
}
}
if(_p[1] < fmin(p1[1],p2[1]) || _p[1] > fmax(p1[1],p2[1])){
continue;
}
//求點的水平射線與邊的交點,通過直線的兩點式方程
double x = (_p[1]-p1[1])*(p2[0]-p1[0])/(p2[1]-p1[1]) + p1[0];
//只統計與右射線的交點
if(x>=_p[0]){
++numCrossPoint;
}
}
return (numCrossPoint%2 == 1);//0外
}