Общее уравнение прямой

Всем привет! Стоит задача: Задача 3. Определить, лежат ли три точки с координатами (x1, y1), (x2, y2), (x3, y3) на одной прямой. Если не лежат, вычислить расстояния до каждой точки из начала координат. Если лежат, получить общее уравнение этой прямой вида Ax+By+C = 0, где A  0. На первый взгляд ничего сложного, но после появились трудности. Написал код, но после проверки преподавателя-практика, оказалось, что программа не выдает общее уравнение прямой для точек (3,2) (8,2) (12,2). Как это исправить, пока не понимаю, но головной штурм у себя не останавливаю. Буду рад вашим подсказкам

#include <stdio.h>
#include <locale.h>
#include <math.h>
#define EPSILON 0.00000000000001
int main()
{
    setlocale(LC_ALL, "Russian");
    double x1, x2, x3, y1, y2, y3, ras1, ras2, ras3;
    printf("Введите координаты первой точки:\n");
    scanf_s("%lf%lf", &x1, &y1);
    printf("Введите координаты второй точки:\n");
    scanf_s("%lf%lf", &x2, &y2);
    printf("Введите координаты третьей точки:\n");
    scanf_s("%lf%lf", &x3, &y3);
    int a = (y2 - y1), b = (x1 - x2), c = ((x1 * -1) * y2 + y1 * x2);

    if (((x3 - x1) / (x2 - x1) == (y3 - y1) / (y2 - y1)) || (x1 == x2 && x2 == x3) || (y1 == y2 || y2 == y3)) {
        printf("Точки лежат на одной прямой.");
        if (a >= EPSILON && b >= EPSILON) {
            printf("Общее уравнение прямой имеет вид:%d+%d+%d=0", a, b, c);
        }
        else {
            printf("Общее уравнение прямой нельзя вывести, так как параметры а и b должны быть >=0");
        }
    }
    else {
        printf("Точки не лежат на одной прямой, но:\n");
        ras1 = sqrt(fabs(x1 * x1 + y1 * y1));
        printf("Расстояние от начала координат до первой точки: %.2lf\n", ras1);
        ras2 = sqrt(fabs(x2 * x2 + y2 * y2));
        printf("Расстояние от начала координат до второй точки: %.2lf\n", ras2);
        ras3 = sqrt(fabs(x3 * x3 + y3 * y3));
        printf("Расстояние от начала координат до третьей точки: %.2lf\n", ras3);
    }
    return 0;
}

Котят в прошлом вопросе я раздал, теперь каждому ответившему щенок в подарок


Ответы (1 шт):

Автор решения: MBo
int a = (y2 - y1), b = (x1 - x2), c = ((x1 * -1) * y2 + y1 * x2);

Общее уравнение прямой получено правильно.

Но зачем дальше писать эту :

 ((x3 - x1) / (x2 - x1) == (y3 - y1)) / (y2 - y1))

которая не будет работать для вертикальных или горизонтальных сегментов из-за деления на 0?

Достаточно проверить, что расстояние от третьей точки до прямой равно нулю

a*x3+b*y3+c==0

или, если точки вещественные будут использоваться, сравнивать с учетом погрешности

fabs(a*x3+b*y3+c) < EPS * sqrt(a*a+b*b)
→ Ссылка