Точка и треугольник - 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;
}

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

  1. Ввод программы включает в себя объявление структуры Point, функцию GetData для ввода данных о точках и функцию inside для проверки принадлежности точки к треугольнику.
  2. В функции main создаются и инициализируются переменные A, B, C, D типа Point.
  3. Далее программа запрашивает координаты вершин треугольника ABC и точку D с помощью функции GetData.
  4. Затем происходит проверка принадлежности точки D к треугольнику ABC с помощью функции inside.
  5. Если точка D принадлежит треугольнику, то выводится сообщение точка попадает в треугольник, иначе выводится сообщение точка не попадает в треугольник.
  6. Внутри функции GetData происходит вывод строки-запроса и считывание координат точки с помощью функции scanf.
  7. Внутри функции inside происходит вычисление образующей треугольника и проверка принадлежности точки D к треугольнику ABC по условию стороны против часовой стрелки.
  8. Если условие выполняется, то возвращается 1, иначе возвращается 0.

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


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

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

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