判断一个点是否在三角形内部

博客围绕判断一个点是否在三角形内部展开。在二维坐标系中,三角形由3个点代表,给定三角形三点和另一点(x, y),需判断该点是否在三角形内。介绍了输入输出格式,还提及题解思路与判断点在矩形内类似,要处理输入乱序情况。
判断一个点是否在三角形内部

题目描述

在二维坐标系中,所有的值都是double类型,那么一个三角形可以由3个点来代表,给定3个点代表的三角形,再给定一个点(x, y),判断(x, y)是否在三角形中

输入描述:

输入有四行,每行两个浮点数。

前三行的6个数分别代表三角形的三个顶点的坐标

最后两个数分别表示(x, y)

输出描述:

若(x, y)在三角形中,输出"Yes",否则输出"No"

示例1
输入
-1.00 0.00
1.50 3.50
2.73 -3.12
1.23 0.23
输出
Yes
说明

在这里插入图片描述

示例2
输入
-1.00 0.00
1.50 3.50
2.73 -3.12
2333.33 233333.33
输出
No
备注:

− 2 ∗ 1 0 10 ⩽ x i , y i , x , y ⩽ 2 ∗ 1 0 10 −2∗10^{10} \leqslant x_i,y_i,x,y \leqslant 2∗10^{10} 21010xi,yi,x,y21010


题解:

判断一个点是否在矩形内部 解法一致,并且这题可以循环进行判断,不至于一个个枚举判断。但是,此题的输入顺序不知道,可能乱序,需要处理一下乱序的情况。

代码:
#include <cstdio>
#include <algorithm>

using namespace std;

double x[4], y[4];

inline double cross_product( int i, int j, int k ) {
    return (x[k] - x[i]) * (y[j] - y[i]) - (x[j] - x[i]) * (y[k] - y[i]);
}

int main(void) {
    for ( int i = 0; i < 4; ++i )
        scanf("%lf%lf", x + i, y + i);
    if ( cross_product( 0, 2, 1 ) > 0 ) {
        swap( x[1], x[2] );
        swap( y[1], y[2] );
    }
    for ( int i = 0; i < 3; ++i ) {
        if ( cross_product(i, (i + 1) % 3, 3) < 0 ) return 0 * puts("No");
    }
    return 0 * puts("Yes");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值