之前做笔试题的时候,忘了怎么计算点是否在三角形的内部,写个博客记录一下。
基础知识
使用结构体保存点的坐标
// 用一个结构体去表示点
struct point{
float x;
float y;
};
坐标系中两个点的距离
|AB| ^ 2 = (x1-x2) ^ 2 + (y1-y2) ^ 2
// 两个点之间的距离
double getInstance(point p1,point p2){
double res = 0;
res = sqrt(pow(p1.y-p2.y,2)+pow(p1.x-p2.x,2));
return res;
}
三个点组成的三角形面积
// 三个点组成的三角形面积
double getArea(point p1,point p2,point p3){
double a = getInstance(p1,p2);
double b = getInstance(p1,p3);
double c = getInstance(p3,p2);
double res = 0;
double s = 0.5*(a+b+c);
res = sqrt(s*(s-a)*(s-b)*(s-c));
return res;
}
判断点是否在三角形内部
使用面积法
判断三角形ABD、ACD、BCD的面积之和是否等于三角形ABC的面积之和
// 采用面积法
double ABC = getArea(p[0],p[1],p[2]);
double ABD = getArea(p[0],p[1],p[3]);
double ACD = getArea(p[0],p[2],p[3]);
double BCD = getArea(p[1],p[2],p[3]);
// float判断类型
if(abs(ABC-(ABD+ACD+BCD))<err){
cout<<"内部"<<endl;
}else{
cout<<"2"<<endl;
}
整体代码
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
const float err = 0.000001;
// 判断一个点是否在一个三角形中
// 用一个结构体去表示点
struct point{
float x;
float y;
};
// double和float使用 哪一个比较好
// 两个点之间的距离
double getInstance(point p1,point p2){
double res = 0;
res = sqrt(pow(p1.y-p2.y,2)+pow(p1.x-p2.x,2));
return res;
}
// 三个点组成的三角形面积
double getArea(point p1,point p2,point p3){
double a = getInstance(p1,p2);
double b = getInstance(p1,p3);
double c = getInstance(p3,p2);
double res = 0;
double s = 0.5*(a+b+c);
res = sqrt(s*(s-a)*(s-b)*(s-c));
return res;
}
int main() {
// 输入四个点
struct point p[4];
// 类的初始化
for(int i=0;i<4;++i){
cin>>p[i].x>>p[i].y;
}
// code
// 采用面积法
double ABC = getArea(p[0],p[1],p[2]);
double ABD = getArea(p[0],p[1],p[3]);
double ACD = getArea(p[0],p[2],p[3]);
double BCD = getArea(p[1],p[2],p[3]);
// float判断类型
if(abs(ABC-(ABD+ACD+BCD))<err){
cout<<"内部"<<endl;
}else{
cout<<"2"<<endl;
}
return 0;
}