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

Геометрическая программа - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
09.06.2011, 15:02     Геометрическая программа #1
С ООП не знаком, помогите решить.
На плоскости задано множество прямоугольников. Определить, имеется ли прямоугольник, содержащий внутри себя все оставшиеся прямоугольники.
Понятно что это можно сделать и без принципов ООП, но нужно бы был хотя бы один класс наследник.
Во вложении что то примерно такое.
Миниатюры
Геометрическая программа  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.06.2011, 13:22     Геометрическая программа #21
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
Имею введу где сравнивать, не в FormPaint?
Да не, в формпейнт не надо. Забабахай, например, кнопку и после ввода координат прямоугольников производи расчёты по нажатию на неё.

Опять же, придумай, как будешь вводить координаты. Считывать их с клавиатуры или может быть замутить что-то типа рисования мышью)) Билдер всё-таки, думаю не так это будет сложно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 14:22  [ТС]     Геометрическая программа #22
dihlofos, ох, с горем пополам.. сделал программу которая анализирует два прямоугольника - их координаты, если координаты одного больше другого то выводится форма с сообщением.
но прямоугольников то у меня больше, как мне правильно сравнить их? такое условие уже не подходит.
выложу файл проекта, вроде все норм для двух фигур.
А так же код, своего условия для двух прямоугольников:
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
57
58
59
60
61
62
63
64
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
using namespace std;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
        int x1E = 10;
        int y1E = 10;
        int x2E = 400;
        int y2E = 400;
        Form1->Canvas->Rectangle(x1E,y1E,x2E,y2E);
 
        int x1C = 35;
        int y1C = 35;
        int x2C = 55;
        int y2C = 55;
        Form1->Canvas->Rectangle(x1C,y1C,x2C,y2C);
 
        int x1D = 75;
        int y1D = 75;
        int x2D = 50;
        int y2D = 50;
        Form1->Canvas->Rectangle(x1D,y1D,x2D,y2D);
 
        int x1 = 80;
        int y1 = 80;
        int x2 = 120;
        int y2 = 120;
        Form1->Canvas->Rectangle(x1,y1,x2,y2);
}
 
//---------------------------------------------------------------------------
 
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
           bool a;
           int x1; int a1; int x2; int a2; int y1; int b1; int y2; int b2;
           for(int i = 0; i <= 400; i++)
          {
         if(x1 < a1 && x2 < a2 && y1 < b1 && y2 < b2)
             a = 1;
          }
         if (a == 1) Form3->Show(); else Form2->Show();
 
}
//---------------------------------------------------------------------------
Вложения
Тип файла: rar 10.rar (361.6 Кб, 6 просмотров)
dihlofos
Бродяга
 Аватар для dihlofos
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.06.2011, 16:17     Геометрическая программа #23
Чтобы много прямоугольников сравнивать, нужно создать класс или структуру, для хранения координат. Потом создать массив объектов этого класса, и сравнивать координаты прямоугольников внутри цикла.

Я вот тут набыдлокодил малость, можешь глянуть. Возможно лучше будет обратиться в раздел по билдеру, чтоб красивше получилось
Вложения
Тип файла: rar Builder.rar (4.4 Кб, 8 просмотров)
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 23:21  [ТС]     Геометрическая программа #24
Цитата Сообщение от dihlofos Посмотреть сообщение
Чтобы много прямоугольников сравнивать, нужно создать класс или структуру, для хранения координат. Потом создать массив объектов этого класса, и сравнивать координаты прямоугольников внутри цикла.
вот с этим проблема... с этим не разобрался...

Добавлено через 6 часов 48 минут
ребят подскажите как сделать для всех фигур, хотя бы для 4-5 прямоугольников..
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.06.2011, 23:49     Геометрическая программа #25
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
вот с этим проблема... с этим не разобрался...
что ж тут непонятного, создаете класс/структуру в котой храните координаты
создаете массив объектов созданой структуры/класса и тупенько проверяете координаты
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 23:57  [ТС]     Геометрическая программа #26
Maxwe11, вы не поняли, я не знаю как это на этих формах делать...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
16.06.2011, 01:43     Геометрическая программа #27
Цитата Сообщение от dihlofos Посмотреть сообщение
Если сравнивать в цикле поочерёдно координаты всех прямоугольников, можно найти тот, который включает в себя все остальные.
Можно найти крайнюю левую, правую, верхнюю и нижнюю координаты. Если они все принадлежат одному прямоугольнику, и только ему - значит все остальные внутри него.
dihlofos
Бродяга
 Аватар для dihlofos
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
16.06.2011, 06:05     Геометрическая программа #28
Цитата Сообщение от easybudda Посмотреть сообщение
Можно найти крайнюю левую, правую, верхнюю и нижнюю координаты. Если они все принадлежат одному прямоугольнику, и только ему - значит все остальные внутри него.
Согласен, так будет конечно, лучше. Вот только с кодом у меня почему-то напряг вышел - получился вот такой слабочитабельный кусок:
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
   int maxx; // крайняя левая координата x
   int minx; // крайняя правая координата x
   int maxy; // крайняя нижняя координата y
   int miny; // крайняя верхняя координата y
   int i_maxx=0, i_minx=0, i_maxy=0, i_miny=0; // индексы прям-ков, которым они принадлежат
 
   maxx = minx = vec[0]->x1;
   maxy = miny = vec[0]->y1;
 
   for(int i = 0; i < vec.size(); ++i)
   {
        if(vec[i]->x1 > maxx) {maxx = vec[i]->x1; i_maxx = i;}
        else if(vec[i]->x1 < minx) {minx = vec[i]->x1; i_minx = i;}
 
        if(vec[i]->x2 > maxx) {maxx = vec[i]->x2; i_maxx = i;}
        else if(vec[i]->x2 < minx) {minx = vec[i]->x2; i_minx = i;}
 
        if(vec[i]->y1 > maxy) {maxy = vec[i]->y1; i_maxy = i;}
        else if(vec[i]->y1 < miny) {miny = vec[i]->y1; i_miny = i;}
 
        if(vec[i]->y2 > maxy) {maxy = vec[i]->y2; i_maxy = i;}
        else if(vec[i]->y2 < miny) {miny = vec[i]->y2; i_miny = i;}
   }
   // если все индексы совпали, то точки принадлежат одному прям-ку
   if(i_maxx == i_minx && i_maxx == i_maxy && i_maxx == i_miny)
        return i_maxx;
 
   return -1;
Может изначальная проблема в том, как я храню координаты (т.е. координаты двух противолежащих вершин - x1, y1 и x2, y2)? Может стоит хранить все 4 точки? Или создать структуру типа точка(x,y)?
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
16.06.2011, 09:10  [ТС]     Геометрическая программа #29
dihlofos, в какой кусок мне то это вставлять? o-0.. и я так понял что это надо сделать функцией, и из какой то формы писать координаты и передавать в эту функцию.. мне немного проще надо - предположим мы знаем уже все координаты прямоугольников какие у них есть, мы их так сказать уже нарисовали - и теперь только осталось определить, есть ли тот в котором лежат все остальные
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2011, 11:18     Геометрическая программа
Еще ссылки по теме:

C++ Геометрическая фигура круг
C++ Геометрическая фигура
Геометрическая задача C++
C++ Геометрическая прогрессия из 3х чисел
Геометрическая задача по программированию (C++) C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
16.06.2011, 11:18     Геометрическая программа #30
Цитата Сообщение от dihlofos Посмотреть сообщение
Может изначальная проблема в том, как я храню координаты (т.е. координаты двух противолежащих вершин - x1, y1 и x2, y2)? Может стоит хранить все 4 точки? Или создать структуру типа точка(x,y)?
Двух точек вполне достаточно. Если x1y1 - левый верхний угол, а x2y2 - правый нижний, то левый нижний это x1y2. А структура, а то и класс point действительно был бы кстати...
Yandex
Объявления
16.06.2011, 11:18     Геометрическая программа
Ответ Создать тему
Опции темы

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