Общее уравнение прямой
Всем привет! Стоит задача: Задача 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 шт):
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)