题目描述:
给出一个三角形三个点的坐标 以及一个点的坐标
判断这个点是否在三角形内 包括三角形边缘
题目分析:
最直接的想法是 先求出三角形的面积 S
然后用给出的点和三角形两个顶点作为一个三角形 求出三个面积 s1 s2 s3
然后判断 s==s1+s2+s3
然而这样搞精度误差实在是太大(也可能是我算面积的姿势不太对
看了下书上的方法,是用矢量的叉积来做的
很明显 D 在 AB BC CA的左边 然后用矢量叉积判读即可
代码:
叉积法:
#include <cstdio>
#include <cmath>
using namespace std;
struct Point{
double x,y;
};
double distance(Point p1,Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
bool Cross_product(Point p0,Point p1,Point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)>=0;
}
int main()
{
Point d1,d2,d3,a;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&d1.x,&d1.y,&d2.x,&d2.y,&d3.x,&d3.y,&a.x,&a.y);
bool f1=Cross_product(d1,d2,a),f2=Cross_product(d2,d3,a),f3=Cross_product(d3,d1,a);
if(f1&&f2&&f3) printf("Yes\n");
else printf("No\n");
return 0;
}
面积法(不能过)
要是有哪个路过的大佬可以指导我一下
#include <cstdio>
#include <cmath>
using namespace std;
struct Point{
double x,y;
};
double distance(Point p1,Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double getmea(Point p1,Point p2,Point p3)
{
double a=distance(p1,p2),b=distance(p2,p3),c=distance(p1,p3);
double cosa=(b*b+c*c-a*a)/(2.0*b*c);
double s=0.5*b*c*(1.0-cosa*cosa);
return s;
}
int main()
{
Point d1,d2,d3,a;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&d1.x,&d1.y,&d2.x,&d2.y,&d3.x,&d3.y,&a.x,&a.y);
double s=getmea(d1,d2,d3);
double s1=getmea(d1,d2,a),s2=getmea(d1,d3,a),s3=getmea(d2,d3,a);
//s==s1+s2+s3?puts("Yes"):puts("No");
printf("%lf %lf %lf %lf %lf",s,s1,s2,s3,s1+s2+s3);
//printf("%.2lf",s);
return 0;
}
数据:
1 2
7 1
7 5
5 3 in
2 1
1 5
7 1
5 3 out