c++之判断一个点是否在三角形内

#include<iostream>
#include<math.h>

using namespace std;

#define err 0.0001

struct Node
{
	float x;
	float y;
};

float TriangleArea(Node p1, Node p2, Node p3)//海伦公式
{
	float AB, BC, AC,P;
	AB = sqrt(pow(p2.x - p1.x,2)+ pow(p2.y - p1.y, 2));
	AC = sqrt(pow(p3.x - p1.x, 2) + pow(p3.y - p1.y, 2));
	BC = sqrt(pow(p3.x - p2.x, 2) + pow(p3.y - p2.y, 2));
	P = (AB + AC + BC) / 2;

	return sqrt(P*(P-AB)*(P-AC)*(P-BC));
}

bool IsInTriangle(Node A, Node B, Node C, Node D)
{
	float S1, S2, S3, Ssum;
	S1 = TriangleArea(A, B, D);
	S2 = TriangleArea(A, C, D);
	S3 = TriangleArea(B, C, D);
	Ssum = TriangleArea(A,B,C);

	if (err > fabs(Ssum - S1 - S2 - S3))//注意绝对值
		return true;
	else
		return false;
}

int main()
{
	Node A, B, C,D;
	A.x = 1; A.y = 0;
	B.x = 3; B.y = 0;
	C.x = 0; C.y = 3;
	D.x = 2; D.y = 0.5;
	cout << "是否在三角形内:" << IsInTriangle(A, B, C, D) << endl;

	system("pause");
	return 0;
}
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这里是一个简单的 C 代码来判断一个点是否在多边形内: ``` bool isInside(double x, double y, double polyX[], double polyY[], int polySides) { int i, j=polySides-1 ; bool oddNodes=0; for (i=0; i<polySides; i++) { if (polyY[i]<y && polyY[j]>=y || polyY[j]<y && polyY[i]>=y) { if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) { oddNodes=!oddNodes; } } j=i; } return oddNodes; } ``` 在这段代码中,函数 isInside 接受 4 个参数:点的 x 坐标、y 坐标,以及多边形的顶点坐标数组 polyX 和 polyY 以及边数 polySides。它返回一个布尔值,表示给定的点是否在多边形内。 请注意,这是一个简单的算法,可能不能在所有情况下都能正确判断点的位置。 ### 回答2: 判断一个点是否在多边形内可以使用射线法。具体实现如下: 1. 首先,定义一个数组来存储多边形的各个顶点坐标,数组中的每个元素是一个点的坐标,例如point[n],其中n为多边形的顶点个数。 2. 给定一个点P(x, y),将其与多边形每条边作一条射线,判断射线与多边形的交点个数。 - 若交点个数为奇数,点P在多边形内部; - 若交点个数为偶数,点P在多边形外部。 3. 判断射线与多边形边的交点个数可以使用如下方法: - 以点P为起点,假设点P的y坐标不变,取一个足够大的x值(例如999999),依次遍历多边形的各个边,计算射线与边的交点。 - 如果射线与某条边重合,将交点个数+1; - 如果射线与边没有交点,继续遍历下一条边。 需要注意的是,如果多边形存在自交(即多边形边之间相交),那么射线法不能正确判断点P是否在多边形内部。 以上是使用C语言实现判断一个点是否在多边形内的基本逻辑。具体实现需要根据具体的编程环境和需求进行适当调整和扩展。 ### 回答3: 要用C语言编写一个判断一个点是否在多边形内的代码,通常可以采用射线法或者封闭线段法。以下是使用射线法的示例代码: ```c #include <stdio.h> #include <stdbool.h> // 定义点的结构体 typedef struct { double x; double y; } Point; // 判断是否在多边形内 bool isPointInPolygon(Point p, Point polygon[], int n) { int count = 0; // 记录与射线相交的边数 // 遍历多边形的每一条边 for (int i = 0, j = n - 1; i < n; j = i++) { // 判断点与边的相对位置 if (((polygon[i].y > p.y) != (polygon[j].y > p.y)) && (p.x < (polygon[j].x - polygon[i].x) * (p.y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) { count++; } } // 如果边的数量为奇数,点在多边形内部 return (count % 2 == 1); } // 测试代码 int main() { // 定义一个多边形,假设为一个三角形 Point polygon[] = {{0, 0}, {4, 0}, {2, 4}}; int n = sizeof(polygon) / sizeof(polygon[0]); // 测试点 Point p = {2, 2}; // 判断是否在多边形内 if (isPointInPolygon(p, polygon, n)) { printf("点在多边形内\n"); } else { printf("点不在多边形内\n"); } return 0; } ``` 以上代码使用射线法判断一个点是否在多边形内。可以自定义多边形的顶点数量和坐标,在测试代码部分,设定一个三角形多边形,通过调整测试点的坐标来进行测试。如果点在多边形内部,输出"点在多边形内",否则输出"点不在多边形内"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值