当前位置:   article > 正文

hdu2528 Area 直线与多边形交点_计算直线与多边形的交点

计算直线与多边形的交点

点击打开hdu2528

这个题目看完题目后就应该知道是要求渠道与校区的交点,也就是求一条直线与多边形的交点,题目有一个重要的信息的——渠道一定会通过校园,那么题目就不用考虑特殊情况,

直接求直线与多边形交点就可以过。

求的时候,先要判断线段与直线是否相交,再求交点,这里的线段就是多边形的每条边。判断的话可以利用直线与线段求交点的模板。我这里是利用直线的方向向量,就是题目给出的两个点,这里记作向量ab,先用向量ab与多边形的每一对相邻的点求叉乘,因为相邻的两个点求出的叉乘相乘为负数,那么肯定该线段与直线相交,在求交点。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. using namespace std;
  7. const double eps=1e-8;
  8. const int maxn = 505;
  9. struct point
  10. {
  11. double x,y;
  12. };
  13. struct ploy
  14. {
  15. point node[ maxn ];
  16. int n;
  17. };
  18. point left,right,s;
  19. ploy p,p1,p2;
  20. double cross( point a,point b,point c )
  21. { ///叉乘
  22. return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
  23. }
  24. double ploy_area( ploy res ){///求多边形面积
  25. double ans=0;
  26. res.node[ res.n ]=res.node[0];
  27. for( int i=0;i<res.n;i++ ){
  28. ans+=cross( s,res.node[i],res.node[i+1] );
  29. }
  30. return ans;
  31. }
  32. int dblcmp(double a) {return a<-eps?-1:a>eps?1:0;}///精度判断
  33. ploy cut( ploy p,point s,point e )
  34. {
  35. point tmp;
  36. ploy bb;
  37. int cnt=0;
  38. for( int i=0;i<p.n;i++ )
  39. {
  40. int d1,d2;
  41. double s1,s2;
  42. d1=dblcmp(s1=cross( p.node[i],s,e ));//跨立
  43. d2=dblcmp(s2=cross( p.node[i+1],s,e ));//跨立
  44. if( d1>=0 )
  45. {
  46. bb.node[ cnt ]=p.node[ i ];
  47. cnt++;
  48. }
  49. if( d1*d2<0 )
  50. {
  51. tmp.x=(s2*p.node[i].x-s1*p.node[i+1].x)/(s2-s1);
  52. tmp.y=(s2*p.node[i].y-s1*p.node[i+1].y)/(s2-s1);
  53. bb.node[ cnt ]=tmp;
  54. cnt++;
  55. }
  56. }
  57. bb.n=cnt;
  58. bb.node[ cnt ]=bb.node[ 0 ];
  59. return bb;
  60. }
  61. int main()
  62. {
  63. while( scanf("%d",&p.n),p.n )
  64. {
  65. for( int i=0;i<p.n;i++ )
  66. {
  67. scanf("%lf%lf",&p.node[ i ].x,&p.node[ i ].y);
  68. }
  69. p.node[ p.n ]=p.node[ 0 ];
  70. scanf("%lf%lf%lf%lf",&left.x,&left.y,&right.x,&right.y);
  71. s.x=s.y=0;
  72. p1=cut( p,left,right );
  73. p2=cut( p,right,left );
  74. int res1,res2;
  75. res1=int(fabs(ploy_area( p1 ))/2+0.5);
  76. res2=int(fabs(ploy_area( p2 ))/2+0.5);
  77. printf("%d %d\n",res1>res2?res1:res2,res1>res2?res2:res1);
  78. }
  79. return 0;
  80. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/979277
推荐阅读
相关标签
  

闽ICP备14008679号