Найти пересечение двух ОТРЕЗКОВ каждый из которых ограничен двумя точками - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Написал подобную программу для нахождения пересечения прямых а для пересечения отрезков не понимаю как сделать.буду признателен если подскажете как изменить мою прогу для нахождения пересечения.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
int main()
{
    setlocale(LC_ALL, "rus");
    double x1,y1,x2,y2,x3,y3,x4,y4;
    double a1, b1, c1,a2,b2,c2;
    double x,y;
    printf("введите координаты начала и конца отрезка\n");
    scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
    printf("второго отрезка\n");
    scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4);
    /*коэффициэнты первой прямой*/
    a1=y1-y2;
    b1=x2-x1;
    c1=x1*y2-y1*x2;
    printf("%lf %lf %lf\n",a1,b1,c1);
    /*коэффициэнты второй прямой*/
    a2=y3-y4;
    b2=x4-x3;
    c2=x3*y4-y3*x4;
    printf("%lf %lf %lf\n",a2,b2,c2);
    
    x=-(c1*b2 - b1*c2)/(a1*b2 - b1*a2);
    y=-(a1*c2 - c1*a2)/(a1*b2 - b1*a2);
    printf("%lf %lf",x,y);
    system("PAUSE");
    return 0;
}

Решение задачи: «Найти пересечение двух ОТРЕЗКОВ каждый из которых ограничен двумя точками»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
 
float line_equation_x(float x1, float x2,float x3, float x4, float y1, float y2, float y3, float y4){
    return -((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
}
float line_equation_y(float x3, float x4, float y3, float y4, float x){
    return (x*(y4-y3)-(x3*y4-x4*y3))/(x4-x3);
}
float factor(float x1, float x2, float y1, float y2){
    return (x2-x1)/(y2-y1);
}
int check_dot(float x, float y , float x1 , float y1 , float x2 , float y2){
    return ((y-y1)*(x2-x1)-(x-x1)*(y2-y1));
}
main()
{
    float x,y,x1,x2,x3,x4,y1,y2,y3,y4;
    printf("Insert X1=");
    scanf("%f",&x1);
    printf("Insert Y1=");
    scanf("%f",&y1);
    printf("Insert X2=");
    scanf("%f",&x2);
    printf("Insert Y2=");
    scanf("%f",&y2);
    printf("Insert X3=");
    scanf("%f",&x3);
    printf("Insert Y3=");
    scanf("%f",&y3);
    printf("Insert X4=");
    scanf("%f",&x4);
    printf("Insert Y4=");
    scanf("%f",&y4);
    if (factor(x1,x2,y1,y2) == factor(x3,x4,y3,y4)){
        printf("Lines are parallel");
        return 0;
    }
    else{
        x = line_equation_x(x1,x2,x3,x4,y1,y2,y3,y4);
        y = line_equation_y(x3,x4,y3,y4,x);
        printf("Lines Intersect in X=%.1f Y=%.1f\n",x,y);
        if ((check_dot(x,y,x1,y1,x2,y2)-check_dot(x,y,x3,y3,x4,y4)) < 0.2)// 0.2 - погрешность (большая, ну это на скорую руку и на глаз поставил)
            printf("This segments are intersected");
        else printf("This segments are not intersected");
    }
}

Объяснение кода листинга программы

Код выполняет следующие действия:

  1. Определяет функцию line_equation_x, которая вычисляет уравнение прямой по координатам четырех точек.
  2. Определяет функцию line_equation_y, которая вычисляет уравнение прямой по координатам четырех точек.
  3. Определяет функцию factor, которая вычисляет коэффициент наклона прямой, проходящей через две точки.
  4. Определяет функцию check_dot, которая проверяет, являются ли две прямые параллельными, используя метод векторного произведения.
  5. В функции main считывает координаты четырех точек с помощью функции scanf.
  6. Проверяет, являются ли две прямые параллельными, используя функцию factor. Если да, выводит сообщение Lines are parallel и завершает выполнение программы.
  7. Если прямые не параллельны, вычисляет точку пересечения с помощью функций line_equation_x и line_equation_y.
  8. Проверяет, является ли точка пересечения близкой к одной из точек сегмента, используя функцию check_dot и сравнивая результат с заданной погрешностью.
  9. Если точка пересечения близка к одной из точек сегмента, выводит сообщение This segments are intersected. В противном случае выводит сообщение This segments are not intersected.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы