С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5

принадлежность точки прямоугольнику

03.03.2011, 09:27. Показов 4482. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: определить,принадлежит ли точка прямоугольнику. Заданы координаты точки и вершин прямоугольника. Прямоугольник может располагаться не параллельно осям координат.
Почему-то при вычислении площадей дробных чисел не получается,что не так делаю?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x_m,y_m,x_a,y_a,x_b;// координаты вершин и точки М
    int y_b,x_c,y_c,x_d,y_d;
    double Samb,Sbmc,Scmd,Samd,Sabcd,a,b; // площади треугольников,из которых состоит ABCD и его стороны
 
    printf("x_m y_m x_a y_a x_b y_b x_c y_c x_d y_d\n");
    scanf_s("%d %d %d %d %d ",&x_m,&y_m,&x_a,&y_a,&x_b); // ввод координат 
    scanf_s("%d %d %d %d %d",&y_b,&x_c,&y_c,&x_d,&y_d);
    if ((x_a==x_b&&y_a==y_d&&x_c!=x_b&&y_c!=y_a)||(x_a==y_b&&x_b==y_a&&x_c==y_d&&y_c==x_d))
    // проверка прямоугольника на правильность
    {
        Samb=(abs(x_a*(y_m-y_b)+x_m*(y_b-y_a)+x_b*(y_a-y_m)))/2; // подсчёт площадей треугольников
        Sbmc=(abs(x_b*(y_m-y_c)+x_m*(y_c-y_b)+x_c*(y_b-y_m)))/2;
        Scmd=(abs(x_c*(y_m-y_d)+x_m*(y_d-y_c)+x_d*(y_c-y_m)))/2;
        Samd=(abs(x_a*(y_m-y_d)+x_m*(y_d-y_a)+x_d*(y_a-y_m)))/2;
        a=sqrt((double)pow((double)(x_b-x_a),2)+pow((double)(y_b-y_a),2)); //длина стороны AB
        b=sqrt((double)pow((double)(x_c-x_b),2)+pow((double)(y_c-y_b),2)); //длина стороны BC
        Sabcd=a*b; // площадь прямоугольника ABCD
        if (Samb+Sbmc+Scmd+Samd==Sabcd) // сумма площадей треугольников = площади ABCD
        {
            printf ("1");
        }
        else 
        {
            printf ("0");
        }
    }
    else
    {
        printf("Error. Invalid rectangle");
    }
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2011, 09:27
Ответы с готовыми решениями:

Принадлежность точки прямоугольнику
написать функцию для проверки принадлежности точки с координатами (x,y) прямоугольнику x

Принадлежность точки повернутому прямоугольнику
Всем привет! Вопрос не совсем про программирование, но прошу помочь мне с разъяснением кода. Я знаю, что принадлежность точки...

Опеределить принадлежность точки заданному прямоугольнику
(x1, y1) и (х2, y2) — координаты левой верхней и правой нижней вершин прямоугольника. Точка А(х, у) принадлежит прямоугольнику.Помогите...

6
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
03.03.2011, 15:51
Чтобы площади были действительными:
C++
1
 Samb=(fabs(1.0*(x_a*(y_m-y_b)+x_m*(y_b-y_a)+x_b*(y_a-y_m))))/2.0;
1
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5
03.03.2011, 20:48  [ТС]
IrineK, спасибо огромное! а я мучилась

Добавлено через 1 час 46 минут
Чёрт..я переделала немного. Теперь без длинного условия. Зато при координатах М(1,1),A(0,1),B(1,4),C(4,3),D(3,0) сумма площадей треугольников равна 10, а площадь прямоугольника - 10,000000000000002. Почему?..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x_m,y_m,x_a,y_a,x_b;// координаты вершин и точки М
    int y_b,x_c,y_c,x_d,y_d;
    double Samb,Sbmc,Scmd,Samd,Sabcd,a,b; // площади треугольников,из которых состоит ABCD и его стороны
 
    printf("x_m= "); // ввод координат точки
    scanf_s("%d",&x_m);
    printf("y_m= ");
    scanf_s("%d",&y_m);
    printf("x_a= "); // ввод координат вершин ABCD
    scanf_s("%d",&x_a);
    printf("y_a= ");
    scanf_s("%d",&y_a);
    printf("x_b= ");
    scanf_s("%d",&x_b);
    printf("y_b= ");
    scanf_s("%d",&y_b);
    printf("x_c= ");
    scanf_s("%d",&x_c);
    printf("y_c= ");
    scanf_s("%d",&y_c);
    printf("x_d= ");
    scanf_s("%d",&x_d);
    printf("y_d= ");
    scanf_s("%d",&y_d); 
    if (((x_b-x_a)*(x_c-x_b)+(y_b-y_a)*(y_c-y_b))==0) // проверка прямоугольника на правильность
    {
        Samb=(fabs(1.0*(x_a*(y_m-y_b)+x_m*(y_b-y_a)+x_b*(y_a-y_m))))/2.0; // подсчёт площадей треугольников,
        Sbmc=(fabs(1.0*(x_b*(y_m-y_c)+x_m*(y_c-y_b)+x_c*(y_b-y_m))))/2.0; // из которых состоит ABCD
        Scmd=(fabs(1.0*(x_c*(y_m-y_d)+x_m*(y_d-y_c)+x_d*(y_c-y_m))))/2.0;
        Samd=(fabs(1.0*(x_a*(y_m-y_d)+x_m*(y_d-y_a)+x_d*(y_a-y_m))))/2.0;
        a=sqrt((double)pow((double)(x_b-x_a),2.0)+pow((double)(y_b-y_a),2.0)); //длина стороны AB
        b=sqrt((double)pow((double)(x_c-x_b),2.0)+pow((double)(y_c-y_b),2.0)); //длина стороны BC
        Sabcd=a*b; // площадь прямоугольника ABCD
        if (Samb+Sbmc+Scmd+Samd==Sabcd) // если сумма площадей треугольников = площади ABCD
        {
            printf ("1"); // М принадлежит ABCD
        }
        else 
        {
            printf ("0"); // М не принадлежит ABCD
        }
    }
    else
    {
        printf("Error. Invalid rectangle");
    }
    _getch();
    return 0;
}
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
03.03.2011, 20:58
Cutted
crazy_, Попробуй эту
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <math.h>
 
typedef struct coord{
  double x,
  y;
}point;
 
int foo(point p[]){
  int a = (p[1].x - p[0].x) * (p[2].y - p[1].y) - (p[2].x - p[1].x) * (p[1].y - p[0].y),
  b = (p[2].x - p[0].x) * (p[3].y - p[2].y) - (p[3].x - p[2].x) * (p[2].y - p[0].y),
  c = (p[3].x - p[0].x) * (p[1].y - p[3].y) - (p[1].x - p[3].x) * (p[3].y - p[0].y);
 
  return (a >= 0 && b >= 0 && c >= 0) ||
         (a <= 0 && b <= 0 && c <= 0)? 1 : 0;
}
 
int prov(point p[]){
  return fabs((p[1].x - p[3].x) * (p[2].y - p[3].y) + (p[2].x - p[3].x) * (p[3].y - p[1].y))
  != 0;
}
 
int main(){
  const size_t n = 4;
  point p[n];
 
  printf("\n\nEnter coord point: ");
  for(size_t i = 0; i < n; ++i){
    if(i > 0)
      printf("\n\nEnter tringale coord %d : ", i);
 
    printf("\n\nx%d -> ", i);
    scanf("%lf", &p[i].x);
    printf("\n\ny%d -> ", i);
    scanf("%lf", &p[i].x);
  }
 
  if(prov(p))
    printf("\n\n%s", ( foo(p)? "YES" : "NO" ));
 
  else
    printf("\n\tTringale not found");
 
  return 0;
}

Оу, сорри, придвиделось что речь идет о треугольнику
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
03.03.2011, 23:36
Зато при координатах М(1,1),A(0,1),B(1,4),C(4,3),D(3,0) сумма площадей треугольников равна 10, а площадь прямоугольника - 10,000000000000002.
Действительные числа обрабатываются с определенной точностью, а именно - 15 цифр есть значащими. Поэтому операция == для действительных чисел, вообще говоря, неоднозначна. Рекомендуются строгие <,>.
В данном случае, это - недостаток вашего метода.
Можно придумать другой. Можно смириться с тем, что есть. Выбирайте.
1
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5
04.03.2011, 09:32  [ТС]
ура-ура! я нашла решение) просто вставляется строчка
C++
1
int round = int(Sabcd+0.5);
округление то есть) вроде теперь всё работает)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.03.2011, 04:18
Цитата Сообщение от asics
C
1
2
3
    printf("\n\ny%d -> ", i);
    scanf("%lf", &p[i].x);
  }
надо &p[i].y
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2011, 04:18
Помогаю со студенческими работами здесь

Определить расположение точки по отношению к прямоугольнику
Ребят, помогите пожалуйста с задачей, а то голова уже кипит. Пользователь введите высоту и ширину одно прямоугольника, а так же...

Определить расположение точки по отношению к заданному прямоугольнику
Доброе время суток! Помогите пожалуйста разобраться с задачей!!! Где не правильный ввод??? Задача основана на операторе - if ...

принадлежность точки
Нужно проверить принадлежность точки заштрихованной области. Не пойму как задавать, точнее что писать в ифе. Кто бы помог мне или...

Принадлежность точки N-угольнику.
Ребята, помогите, ПОЖАЛУЙСТА. На плоскости задается выпуклый N - угольник целочисленными координатами своих вершин в порядке обхода по...

Принадлежность точки рисунку
Разработать алгоритм и написать программу вычисления принадлежности точки с заданными координатами (x, y) заштрихованной об-ласти....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru