fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int position(double x ,double y, double windows[]){
  5. if(x<windows[0]){
  6. if( y<windows[1] )
  7. return 5;
  8. else if( y>=windows[1] && y<=windows[3])
  9. return 4;
  10. else if( y>windows[3] )
  11. return 3;
  12. }
  13. else if(x>=windows[0] && x<=windows[2] ){
  14. if( y<windows[1] )
  15. return 2;
  16. else if( y>=windows[1] && y<=windows[3])
  17. return 0;
  18. else if( y>windows[3] )
  19. return 1;
  20. }
  21. else if(x>windows[2]){
  22. if( y<windows[1] )
  23. return 8;
  24. else if( y>=windows[1] && y<=windows[3])
  25. return 7;
  26. else if( y>windows[3] )
  27. return 6;
  28. }
  29. return -1;
  30. }
  31.  
  32. int main() {
  33. double xl=0, yd=0, xr=0, yu=0;
  34. cin>>xl>>yd>>xr>>yu;
  35. double windows[4] = {xl, yd, xr, yu};
  36. int m;
  37. cin>>m;
  38. for(int i=1;i<=m;i++){
  39. double x1, y1, x2, y2;
  40. //第一步,排除性测试
  41. if( x1<xl && x2<xl )
  42. { cout<<"null"; break; }
  43. else if ( x1>xr && x2>xr )
  44. { cout<<"null"; break; }
  45. else if ( y1<yd && y2<yd )
  46. { cout<<"null"; break; }
  47. else if ( y1>yu && y2>yu )
  48. { cout<<"null"; break; }
  49. //第二步,判断线段是否完全在区域内
  50. int pos1 = position(x1,y1,windows);
  51. int pos2 = position(x2,y2,windows);
  52. if (pos1 == 0 && pos2 == 0)
  53. {cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2; break;}
  54. //第三步,若A点在xl左侧,将A一侧裁减掉
  55. if( x1<xl ){
  56. double y;
  57. y1 == y2 ? y = y1 : y = y1 + (xl-x1)*(y2-y1)/(x2-x1);
  58. if ( y>=yd && y<=yu)
  59. { x1 = xl; y1 = y;}
  60. else if (pos1 == 4)
  61. { cout<<"null"; break; }
  62. else if (pos1 == 5){
  63. double x = x1 +(yd-y1)*(x2-x1)/(y2-y1);
  64. if ( x<=xr && x>=xl)
  65. { x1 = x; y1 = yd;}
  66. else
  67. { cout<<"null"; break; }
  68. }
  69. else if (pos1 == 3){
  70. double x = x1 +(yu-y1)*(x2-x1)/(y2-y1);
  71. if ( x<=xr && x>=xl)
  72. { x1 = x; y1 = yu;}
  73. else
  74. { cout<<"null"; break; }
  75. }
  76. }
  77. pos1 = position(x1,y1,windows);
  78. pos2 = position(x2,y2,windows);
  79. if (pos1 == 0 && pos2 == 0)
  80. {cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2; break;}
  81. //第四步,若B点在xr右侧,将B一侧裁减掉
  82. if( x2>xr ){
  83. double y;
  84. y1 == y2 ? y = y1 : y = y1 + (xr-x1)*(y2-y1)/(x2-x1);
  85. if ( y>=yd && y<=yu)
  86. { x2 = xr; y2 = y;}
  87. else if (pos2 == 7)
  88. { cout<<"null"; break; }
  89. else if (pos1 == 8){
  90. double x = x1 +(yd-y1)*(x2-x1)/(y2-y1);
  91. if ( x<=xr && x>=xl)
  92. { x2 = x; y2 = yd;}
  93. else
  94. { cout<<"null"; break; }
  95. }
  96. else if (pos1 == 6){
  97. double x = x1 +(yu-y1)*(x2-x1)/(y2-y1);
  98. if ( x<=xr && x>=xl)
  99. { x2 = x; y2 = yu;}
  100. else
  101. { cout<<"null"; break; }
  102. }
  103. }
  104. pos1 = position(x1,y1,windows);
  105. pos2 = position(x2,y2,windows);
  106. if (pos1 == 0 && pos2 == 0)
  107. {cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2; break;};
  108. //第五步,减去两端之后,如果还没有完成,说明两个点都在中间0,1,2,里面:
  109. if(y1>=yu){
  110. double x ;
  111. x1 == x2 ? x = x1 :x = x1 +(yu-y1)*(x2-x1)/(y2-y1);
  112. x1 = x; y1 = yu;
  113. };
  114. if(y1<=yd){
  115. double x ;
  116. x1 == x2 ? x = x1 :x = x1 +(yd-y1)*(x2-x1)/(y2-y1);
  117. x1 = x; y1 = yd;
  118. };
  119. if(y2>=yu){
  120. double x ;
  121. x1 == x2 ? x = x1 :x = x1 +(yu-y1)*(x2-x1)/(y2-y1);
  122. x1 = x; y2 = yu;
  123. };
  124. if(y2<=yd){
  125. double x ;
  126. x1 == x2 ? x = x1 :x = x1 +(yd-y1)*(x2-x1)/(y2-y1);
  127. x1 = x; y2 = yd;
  128. };
  129. pos1 = position(x1,y1,windows);
  130. pos2 = position(x2,y2,windows);
  131. if (pos1 == 0 && pos2 == 0)
  132. {cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2; break;}
  133. cout<<"Fail";
  134. }
  135. return 0;
  136. }
Success #stdin #stdout 0s 4932KB
stdin
1 1 5 5
2
0 0 3 4
2 2 3 3 
stdout
null