Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
crazy_
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5
03.03.2011, 09:27     принадлежность точки прямоугольнику #1
Задача: определить,принадлежит ли точка прямоугольнику. Заданы координаты точки и вершин прямоугольника. Прямоугольник может располагаться не параллельно осям координат.
Почему-то при вычислении площадей дробных чисел не получается,что не так делаю?
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2011, 09:27     принадлежность точки прямоугольнику
Посмотрите здесь:

C++ Принадлежность точки к отрезку.
принадлежность точки к кольцу C++
Принадлежность точки N-угольнику. C++
принадлежность точки C++
Принадлежность точки любому многоугольнику C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
03.03.2011, 15:51     принадлежность точки прямоугольнику #2
Чтобы площади были действительными:
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;
crazy_
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5
03.03.2011, 20:48  [ТС]     принадлежность точки прямоугольнику #3
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;
}
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
03.03.2011, 20:58     принадлежность точки прямоугольнику #4
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;
}

Оу, сорри, придвиделось что речь идет о треугольнику
IrineK
Заблокирован
03.03.2011, 23:36     принадлежность точки прямоугольнику #5
Зато при координатах М(1,1),A(0,1),B(1,4),C(4,3),D(3,0) сумма площадей треугольников равна 10, а площадь прямоугольника - 10,000000000000002.
Действительные числа обрабатываются с определенной точностью, а именно - 15 цифр есть значащими. Поэтому операция == для действительных чисел, вообще говоря, неоднозначна. Рекомендуются строгие <,>.
В данном случае, это - недостаток вашего метода.
Можно придумать другой. Можно смириться с тем, что есть. Выбирайте.
crazy_
0 / 0 / 0
Регистрация: 03.03.2011
Сообщений: 5
04.03.2011, 09:32  [ТС]     принадлежность точки прямоугольнику #6
ура-ура! я нашла решение) просто вставляется строчка
C++
1
int round = int(Sabcd+0.5);
округление то есть) вроде теперь всё работает)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2011, 04:18     принадлежность точки прямоугольнику
Еще ссылки по теме:

Принадлежность точки отрезку C++
C++ Принадлежность точки к фигуре
Принадлежность точки рисунку C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.03.2011, 04:18     принадлежность точки прямоугольнику #7
Цитата Сообщение от asics
C
1
2
3
    printf("\n\ny%d -> ", i);
    scanf("%lf", &p[i].x);
  }
надо &p[i].y
Yandex
Объявления
05.03.2011, 04:18     принадлежность точки прямоугольнику
Ответ Создать тему
Опции темы

Текущее время: 23:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru