现在学了这个知识点还真是不错哈,,很满足呀, 虽然学了很长时间才弄懂,,不过弄懂就不错呀,,呵呵
还是高中的知识给力哈,,,判断一个点是不是在三角形内部,分两种做法.
当然第一种就是如果点在每条直线的同一侧,那就证明了在三角形的内部,反之,则不在.
第二种呢,也很简单就是判断,三角形的面积,是不是以此点为顶点而构成的三角形面积之和...
如果相等,那说明在三角形内部,如果不相等,那就不是在三角形内部,
来个算法,就是求三角形面积的公式, 就是 诶呀呀,,, 就是坐标按照从上到下,最后一项写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;
}