判断一个点是不是在三角形里面

现在学了这个知识点还真是不错哈,,很满足呀, 虽然学了很长时间才弄懂,,不过弄懂就不错呀,,呵呵

还是高中的知识给力哈,,,判断一个点是不是在三角形内部,分两种做法.

当然第一种就是如果点在每条直线的同一侧,那就证明了在三角形的内部,反之,则不在.

第二种呢,也很简单就是判断,三角形的面积,是不是以此点为顶点而构成的三角形面积之和...

如果相等,那说明在三角形内部,如果不相等,那就不是在三角形内部,



来个算法,就是求三角形面积的公式, 就是 诶呀呀,,, 就是坐标按照从上到下,最后一项写1 的一个 3*3的矩阵...

呜呜..

第一种还是没有实现了,,一会我看看哈,,,高中判断的方法给忘了,,,得回想回想.


也想明白了那个叉乘的算法了,,其实就是利用叉乘的方向,也就是右手螺旋法则的运用,,如果再里面的话,,你四指指向3条边(当然要同一个方向,,都是顺时针,或都是逆时针,然后弯向点的方向,,大拇指所指的方向都相同的话,那么就在内部,反之则在外部....呼呼)


啊啦啦..啊哦哦

贴出代码:

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

using namespace std;

const double eps = 1e-9;

double max_2(double x0, double x1)
{
	return x0 > x1 ? x0 : x1;
}

double max_3(double x0, double x1, double x2)
{
	return x2 > max_2(x0, x1) ? x2 : max_2(x0, x1);
}

double min_2(double x0, double x1)
{
	return x0 < x1 ? x0 : x1;
}

double min_3(double x0, double x1, double x2)
{
	return x2 < min_2(x0, x1) ? x2 : min_2(x0, x1);
}

	

double are_2(double x0, double y0, double x1, double y1, double x2, double y2)
{
	return fabs(x0 * y1 + y0 * x2 + x1 * y2 - (x2 * y1 + x1 * y0 + x0 * y2));
}


int main()
{
	double x0, y0, x1, y1, x2, y2;
	while (cin >> x0 >> y0 >> x1 >> y1 >> x2 >> y2)
	{
		// A(x0, y0) B(x1, y1) C(x2, y2);
		int Min_x = (int )floor(min_3(x0, x1, x2));
		cout << "Min_x = " << Min_x << endl;
		int Max_x = (int )ceil(max_3(x0, x1, x2));
		cout << "Max_x = " << Max_x << endl;
		int Min_y = (int )floor(min_3(y0, y1, y2));
		cout << "Min_y = " << Min_y << endl;
		int Max_y = (int )ceil(max_3(y0, y1, y2));
		cout << "max_y = " << Max_y << endl;
		double Are_2 = are_2(x0, y0, x1, y1, x2, y2);
		cout << "Are_2 = " << Are_2 << endl; 
		int count = 0;
		for (int i = Min_x; i <= Max_x; i++)
		{
			for (int j = Min_y; j <= Max_y; j++)
			{
				double sum = are_2(i, j, x0, y0, x1, y1) + are_2(i, j, x1, y1, x2, y2) + are_2(i, j, x2, y2, x0, y0);
				if (fabs(Are_2 - sum) < eps)
				{
					count++;
				}
			}
		}
		cout << "一共有 " << count << "个" << endl;
	}		
	system("pause");
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值