分享

如何判断点P是否在三角形ABC内?

 torony 2015-12-27

       本题最好不要用直线方程或线段夹角来判断,因为这涉及到分类与讨论,下面的算法是相对比较好的算法,代码如下:

  1. #include<iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4.   
  5. typedef struct point  
  6. {  
  7.     float x;  
  8.     float y;  
  9. }Point;  
  10.   
  11. float side(Point A, Point B)  
  12. {  
  13.     float xLen = A.x - B.x;  
  14.     float yLen = A.y - B.y;  
  15.     return sqrt(xLen * xLen + yLen * yLen);  
  16. }  
  17.   
  18. float area(Point A, Point B, Point C)  
  19. {  
  20.     float a = side(B, C);  
  21.     float b = side(A, C);  
  22.     float c = side(A, B);  
  23.     float p = (a + b + c)/ 2;  
  24.       
  25.     //海伦公式  
  26.     float s = sqrt(p * (p - a) * (p - b) * ( p - c));  
  27.     return s;  
  28. }  
  29.   
  30. bool isEqual(float x, float y)  
  31. {  
  32.     if(fabs(x - y) < 0.0001)  
  33.         return true;  
  34.   
  35.     return false;  
  36. }  
  37.   
  38. int main()  
  39. {  
  40.     Point A, B, C, P;  
  41.     //可以对A进行整体赋值,下面采用的是分步赋值  
  42.       
  43.     A.x = 0;  
  44.     A.y = 0;  // A(0, 0)  
  45.     B.x = 2;  
  46.     B.y = 0;  // B(2, 0)  
  47.     C.x = 1;  
  48.     C.y = 1;  // C(1, 1)  
  49.   
  50.     P.x = 0.5;  
  51.     P.y = 0.6; // P(0.5, 0.6)  
  52.   
  53.     float s  = area(A, B, C);  
  54.     float s1 = area(P, B, C);  
  55.     float s2 = area(P, A, C);  
  56.     float s3 = area(P, A, B);  
  57.   
  58.     if(isEqual(s1 + s2 + s3, s) && !isEqual(s1, 0) && !isEqual(s2, 0) && !isEqual(s3, 0))  
  59.         cout << "Point P lies in the triangle ABC" << endl;  
  60.     else  
  61.         cout << "Point P does not lie in the triangle ABC" << endl;  
  62.   
  63.     return 0;  
  64. }  




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多