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