现在的位置: 首页 > 综合 > 正文

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

2013年01月03日 ⁄ 综合 ⁄ 共 1591字 ⁄ 字号 评论关闭

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

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

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

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

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

来个算法,就是求三角形面积的公式, 就是 诶呀呀,,, 就是坐标按照从上到下,最后一项写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;
}

抱歉!评论已关闭.