Точка и треугольник - C (СИ)
Формулировка задачи:
Суть задачи определить попадает ли точка в треугольник, координаты точки и вершин треугольника задаются пользователем.
не могу понять почему не работает. подозрения падают на сравнение площадей. подскажите, что может быть не так?
#include <stdio.h>
#include <locale.h>
#include <math.h>
main()
{
float x1,x2,x3,x4,y1,y2,y3,y4,AB,BC,AC,AD,BD,CD,p,p1,p2,p3,S,S1,s1,s2,s3;
setlocale(LC_ALL,"russian");
printf("введите координаты вершин треугольника ABC:\n");
printf("точка A\n");
scanf("%f\n",&x1);
scanf("%f",&y1);
printf("точка B\n");
scanf("%f\n",&x2);
scanf("%f",&y2);
printf("точка C\n");
scanf("%f\n",&x3);
scanf("%f",&y3);
printf("введите координаты точки D(точки,для которой необходимо решить задачу):\n");
scanf("%f\n",&x4);
scanf("%f",&y4);
/*определяем длины сторон треугольника*/
AB=pow( pow(x2-x1,2) + pow(y2-y1,2) ,1/2);
BC=pow( pow(x3-x2,2) + pow(y3-y2,2) ,1/2);
AC=pow( pow(x3-x1,2) + pow(y3-y1,2) ,1/2);
/*определяем его полупериметр*/
p=(AB+BC+AC)/2;
/*определяем дего площадь*/
S=pow(p*(p-AB)*(p-BC)*(p-AC),1/2);
/*определяем длины сторон с точкой D*/
AD=pow( pow(x4-x1,2) + pow(y4-y1,2) ,1/2);
BD=pow( pow(x4-x2,2) + pow(y4-y2,2) ,1/2);
CD=pow( pow(x4-x3,2) + pow(y4-y3,2) ,1/2);
/*определяем полупериметры треугольников ABD,ADC,BDC*/
p1=(AD+CD+AC)/2;
p2=(AB+BD+AD)/2;
p3=(BD+BC+CD)/2;
/*определяем их площади*/
s1=pow(p1*(p1-AD)*(p1-CD)*(p1-AC),1/2);
s2=pow(p2*(p2-AB)*(p2-BD)*(p2-AD),1/2);
s3=pow(p3*(p3-BD)*(p3-BC)*(p3-CD),1/2);
/*суммируем*/
S1=s1+s2+s3;
/*если площадь треугодьника ABC примерно равна сумме трех остальных, то точка попадает*/
if((S==S1<0,1)||(S-S1<-0,1))
printf("точка попадает в треугольник\n");
else
printf("точка не попадает в треугольник\n");
return 0;
}
в общем доделал до такой стадии. при попытке поставить разность между площадями и допустить погрешность 0.1 результат всегда неверный
setlocale(LC_ALL,"russian");
printf("введите координаты вершин треугольника ABC:\n");
printf("точка A\n");
scanf("%f\n",&x1);
scanf("%f",&y1);
printf("точка B\n");
scanf("%f\n",&x2);
scanf("%f",&y2);
printf("точка C\n");
scanf("%f\n",&x3);
scanf("%f",&y3);
printf("введите координаты точки D(точки,для которой необходимо решить задачу):\n");
scanf("%f\n",&x4);
scanf("%f",&y4);
/*определяем длины сторон треугольника*/
AB=sqrt(pow((x2-x1),2) + pow((y2-y1),2));
BC=sqrt(pow((x3-x2),2) + pow((y3-y2),2));
AC=sqrt(pow((x3-x1),2) + pow((y3-y1),2));
/*определяем его полупериметр*/
p=(AB+BC+AC)/2;
/*определяем его площадь по формуле Герона*/
S=sqrt(p*(p-AB)*(p-BC)*(p-AC));
/*определяем длины сторон с точкой D*/
AD=sqrt(pow((x4-x1),2) + pow((y4-y1),2));
BD=sqrt(pow((x4-x2),2) + pow((y4-y2),2));
CD=sqrt(pow((x4-x3),2) + pow((y4-y3),2));
/*определяем полупериметры треугольников ABD,ADC,BDC*/
p1=(AD+CD+AC)/2;
p2=(AB+BD+AD)/2;
p3=(BD+BC+CD)/2;
/*определяем их площади*/
s1=sqrt(p1*(p1-AD)*(p1-CD)*(p1-AC));
s2=sqrt(p2*(p2-AB)*(p2-BD)*(p2-AD));
s3=sqrt(p3*(p3-BD)*(p3-BC)*(p3-CD));
/*суммируем*/
S1=s1+s2+s3;
/*если площадь треугодьника ABC равна сумме трех остальных, то точка попадает*/
if(S==S1)
printf("точка попадает в треугольник\n");
else
printf("точка не попадает в треугольник\n");
return 0;
}
Решение задачи: «Точка и треугольник»
textual
Листинг программы
#include <stdio.h> struct Point { double x; double y; }; void GetData(char *str, struct Point *point); int inside(struct Point A, struct Point B, struct Point D, struct Point C); int main(void) { struct Point A, B, C, D; int c; puts("введите координаты вершин треугольника ABC"); GetData("точка А", &A); GetData("точка B", &B); GetData("точка C", &C); puts("введите координаты точки D"); GetData("точка D", &D); c = 0; if (inside(A, B, D, C)) c++; if (inside(B, C, D, A)) c++; if (inside(C, A, D, B)) c++; if (c==3) puts("точка попадает в треугольник"); else puts("точка не попадает в треугольник"); return 0; } void GetData(char *str, struct Point *point) { puts(str); printf("x = "); scanf("%lf", &point->x); printf("y = "); scanf("%lf", &point->y); } int inside(struct Point A, struct Point B, struct Point D, struct Point C) { struct Point M; double n1, n2, n3; M.x = A.x - B.x; M.y = A.y - B.y; if (M.x == 0) { if (C.x > A.x) if (C.x >= D.x && D.x >= A.x) return 1; if (A.x > C.x) if (A.x >= D.x && D.x >= C.x) return 1; } n1 = A.y - A.x * M.y / M.x; n2 = D.y - D.x * M.y / M.x; n3 = C.y - C.x * M.y / M.x; if (n3 > n1) if (n3 >= n2 && n2 >= n1) return 1; if (n1 > n3) if (n1 >= n2 && n2 >= n3) return 1; return 0; }
Объяснение кода листинга программы
- Ввод программы включает в себя объявление структуры Point, функцию GetData для ввода данных о точках и функцию inside для проверки принадлежности точки к треугольнику.
- В функции main создаются и инициализируются переменные A, B, C, D типа Point.
- Далее программа запрашивает координаты вершин треугольника ABC и точку D с помощью функции GetData.
- Затем происходит проверка принадлежности точки D к треугольнику ABC с помощью функции inside.
- Если точка D принадлежит треугольнику, то выводится сообщение
точка попадает в треугольник
, иначе выводится сообщениеточка не попадает в треугольник
. - Внутри функции GetData происходит вывод строки-запроса и считывание координат точки с помощью функции scanf.
- Внутри функции inside происходит вычисление образующей треугольника и проверка принадлежности точки D к треугольнику ABC по условию
стороны против часовой стрелки
. - Если условие выполняется, то возвращается 1, иначе возвращается 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д