首页 > 试题广场 >

给定三角形ABC和一点P(x,y,z),判断点P是否在ABC

[问答题]

给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码

不对啊,P点给的坐标是x,y,z,所以应该指的是三维空间里的三角形啊,为什么没人给出三维空间的解法呢,难道是我的理解有问题吗
发表于 2019-05-17 17:44:31 回复(3)
#include<iostream>
#include<math.h>
using namespace std;
struct point//三角形点的坐标
{
	float x;
	float y;
	float z;
};
float sum(point A,point B,point C ) {//计算面积
	float AB = sqrt(pow(A.x - B.x, 2) + pow(A.y - B.y, 2) + pow(A.z - B.z, 2));//计算三角形三边长
	float AC = sqrt(pow(A.x - C.x, 2) + pow(A.y - C.y, 2) + pow(A.z - C.z, 2));
	float BC = sqrt(pow(B.x - C.x, 2) + pow(B.y - C.y, 2) + pow(B.z - C.z, 2));
	float p = (AB + AC + BC) / 2;//海伦公式
	float S = sqrt(p * (p - AB) * (p - AC) * (p - BC));//面积
	return S;
}
int main() 
{
	float x,y,z;
	while(1){//测试
	cin >> x >> y >> z;
	point P = {x,y,z};
	point A = { 0, 0, 0 }, B = { 0, 6, 0 },C = { 7, 0, 0 };//设置一个简单的z值都为0的三角形,方便验证
	if ((sum(P, A, B) + sum(P, A, C) + sum(P, B, C)-sum(A, B, C))<0.001) cout << "P在三角形ABC之内\n";
	else cout << "P不在三角形ABC之内\n";
	}
}
面积法,假设都是三维坐标。因为类型转换会有误差,所以只要面积之差小于某一个小值(比如0.001)即可认为相等.
发表于 2021-03-21 17:46:48 回复(1)

∠APB+∠CPB+∠CPA=360?在:不在

编辑于 2019-07-03 17:10:33 回复(3)
使用三个夹角的1cos值符号进行判断:
1.若其中有一个值为01,则落在边上
2.否则,若其中存在正值,则落在外部
3.否则,落在内部
发表于 2019-05-09 00:22:20 回复(0)
利用面积法,如图所示,如果点P在三角形ABC的内部,则三个小三角形PAB, PBC, PAC的面积之和 = ABC的面积,反之则不相等。

发表于 2019-04-10 19:10:02 回复(0)

<p>点P如果在三角形内,则与任意其他两个顶点形成的角为直角或钝角,且三角和为360度</p>

编辑于 2020-05-19 07:14:37 回复(0)