Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "math.h"
- int main(int argc, char const *argv[])
- {
- // circle and line
- double cx, cy, r;
- double x, y, w, z;
- scanf("%lf %lf %lf %lf", &x, &y, &w, &z);
- scanf("%lf %lf %lf", &cx, &cy, &r);
- // y = m * (x - w) + z
- double m = ( z-y ) / ( w-x );
- // ==> خطو در معادله دایره میزاریم
- // (x-cx)^2 + (y-cy)^2 = r^2
- // (x-cx)^2 + ( m * (x - w) + z - cy )^2 = r^2
- // x^2 - 2x*cx + cx^2 + m*x^2 + 2*(-m*w + z -cy)*m*x + (-m*w + z - cy)^2 - r^2 = 0
- // x^2 * (1 + m) - x * (-2*cx + 2*m*(-m*w + 2*cy)) + (-m*w + z - cy)^2 - r^2 + cx^2 = 0
- double b = (-2*cx + 2*m*(-m*w + 2*cy));
- double a = 1 + m;
- double c = (-m*w + z - cy) * (-m*w + z - cy) - r*r + cx*cx;
- double delta = b * b - 4 * a * c;
- // delta > 0 ==> در دو نقطه قطع میکند
- // delta = 0 ==> در یک نقطه قطع می کند
- // delta < 0 ==> قطع نمیکند
- if ( x > w ){
- double tmp = x;
- x = w;
- w = tmp;
- tmp = y;
- y = z;
- z = tmp;
- }
- if ( y > z ){
- double tmp = y;
- y = z;
- z = tmp;
- tmp = x;
- x = w;
- w = tmp;
- }
- if ( delta < 0 ){
- printf("false");
- return 0;
- }
- if ( delta == 0 ){
- double ix = -b / (2*a);
- double iy = m * (ix - w) + z;
- // باید چک کنیم که نقطه قطع شده مطعلق به پاره خط است یا نه
- if ( ix <= w && ix >= x ){
- if ( iy <= z && iy >= y ){
- printf("true");
- return 0;
- }
- }
- printf("false");
- } else if ( delta > 0 ){
- double ix1 = (-b + sqrt(delta)) / (2*a);
- double ix2 = (-b - sqrt(delta)) / (2 * a);
- double iy1 = m * (ix1 - w) + z;
- double iy2 = m * (ix2 - w) + z;
- // باید چک کنیم که نقطه قطع شده مطعلق به پاره خط است یا نه
- if ( (ix1 <= w && ix1 >= x && iy1 <= z && iy1 >= y) || (ix2 <= w && ix2 >= x && iy2 <= z && iy2 >= y) )
- {
- printf("true");
- return 0;
- }
- printf("false");
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment