计算几何工具算法-判断点是否在三角形内

51 篇文章 1 订阅
15 篇文章 0 订阅

题目描述:

给出一个三角形三个点的坐标 以及一个点的坐标
判断这个点是否在三角形内 包括三角形边缘

题目分析:

最直接的想法是 先求出三角形的面积 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值