Guest User

Untitled

a guest
Nov 19th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "math.h"
  3.  
  4. int main(int argc, char const *argv[])
  5. {
  6. // circle and line
  7. double cx, cy, r;
  8. double x, y, w, z;
  9.  
  10. scanf("%lf %lf %lf %lf", &x, &y, &w, &z);
  11. scanf("%lf %lf %lf", &cx, &cy, &r);
  12.  
  13. // y = m * (x - w) + z
  14. double m = ( z-y ) / ( w-x );
  15.  
  16. // ==> خطو در معادله دایره میزاریم
  17. // (x-cx)^2 + (y-cy)^2 = r^2
  18. // (x-cx)^2 + ( m * (x - w) + z - cy )^2 = r^2
  19. // x^2 - 2x*cx + cx^2 + m*x^2 + 2*(-m*w + z -cy)*m*x + (-m*w + z - cy)^2 - r^2 = 0
  20.  
  21. // x^2 * (1 + m) - x * (-2*cx + 2*m*(-m*w + 2*cy)) + (-m*w + z - cy)^2 - r^2 + cx^2 = 0
  22. double b = (-2*cx + 2*m*(-m*w + 2*cy));
  23. double a = 1 + m;
  24. double c = (-m*w + z - cy) * (-m*w + z - cy) - r*r + cx*cx;
  25.  
  26. double delta = b * b - 4 * a * c;
  27.  
  28. // delta > 0 ==> در دو نقطه قطع میکند
  29. // delta = 0 ==> در یک نقطه قطع می کند
  30. // delta < 0 ==> قطع نمیکند
  31.  
  32. if ( x > w ){
  33. double tmp = x;
  34. x = w;
  35. w = tmp;
  36.  
  37. tmp = y;
  38. y = z;
  39. z = tmp;
  40. }
  41. if ( y > z ){
  42. double tmp = y;
  43. y = z;
  44. z = tmp;
  45.  
  46. tmp = x;
  47. x = w;
  48. w = tmp;
  49. }
  50.  
  51. if ( delta < 0 ){
  52. printf("false");
  53. return 0;
  54. }
  55.  
  56. if ( delta == 0 ){
  57. double ix = -b / (2*a);
  58. double iy = m * (ix - w) + z;
  59.  
  60. // باید چک کنیم که نقطه قطع شده مطعلق به پاره خط است یا نه
  61. if ( ix <= w && ix >= x ){
  62. if ( iy <= z && iy >= y ){
  63. printf("true");
  64. return 0;
  65. }
  66. }
  67. printf("false");
  68.  
  69. } else if ( delta > 0 ){
  70. double ix1 = (-b + sqrt(delta)) / (2*a);
  71. double ix2 = (-b - sqrt(delta)) / (2 * a);
  72.  
  73. double iy1 = m * (ix1 - w) + z;
  74. double iy2 = m * (ix2 - w) + z;
  75.  
  76. // باید چک کنیم که نقطه قطع شده مطعلق به پاره خط است یا نه
  77. if ( (ix1 <= w && ix1 >= x && iy1 <= z && iy1 >= y) || (ix2 <= w && ix2 >= x && iy2 <= z && iy2 >= y) )
  78. {
  79. printf("true");
  80. return 0;
  81. }
  82. printf("false");
  83. }
  84.  
  85.  
  86. return 0;
  87. }
Add Comment
Please, Sign In to add comment