Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gepar
1178 / 534 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Хранение площадей перекрывающихся фигур - C++

10.05.2012, 15:11. Просмотров 366. Ответов 0
Метки нет (Все метки)

Перефразирую свою старую тему, видать намудрил я там с описанием.

Задача: как-нибудь (вообще как-угодно, лишь бы побыстрее работало) в классе хранить площади фигур которые нам дают через функцию Add. У каждой фигуры, кроме координат, есть свой номер (ID).
Часть координат будут давать в виде структуры (чтобы меньше параметров передавать).
C++
1
2
3
4
5
struct CCoord
{
    int   m_X;
    int   m_Y;
};
Возможные фигуры:
CRectangle ( int ID, int x1, int y1, int x2, int y2 ) - координаты противоположных углов
CCircle ( int ID, int x, int y, int r) - середина и радиус
CTriangle ( int ID, CCoord a, CCoord b, CCoord c) - треугольник, 3 вершины
CPolygon ( int ID, int n, const CCoord * v ) , многоугольник, n вершин, координаты вершин дают в массиве v.

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

Формально нужно хранить это всё так чтобы можно было потом по координате x,y определить что пересекает эту точку (нужно вернуть ID фигуры что пересекает). Any ideas?

Теоретически получается что когда вызывают метод Add и дают фигурку можно даже не заморачиваться с хранением оригинала, нужно только как-то запомнить те координаты что она накрывает и пометить эти координаты её ID, но как это сделать ... Или же можно хранить оригиналы и как-то пересчитывать потом накрывают ли они какую точку ... желательно ещё чтобы это всё работало быстро.

Тоже самое что я написал, но в виде кода (написаны сами классы, метод Add ничего никуда не добавляет так как не решился как это всё хранить):
код

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <string>
using namespace std;
 
struct CCoord
{
    CCoord (int x = 0,int y = 0 )
    : m_X(x), m_Y(y) {}
 
    int   m_X;
    int   m_Y;
};
 
//базовый класс для фигур
class CObject
{
public:
    CObject(int _id)
    :ID(_id) {}
 
    int ID;
};
 
class CRectangle: public CObject
{
public:
    CRectangle(int ID,int _x1,int _y1,int _x2,int _y2)
    :CObject(ID), x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
 
private:
    //верхняя левая координата
    int x1;
    int y1;
 
    //нижняя правая коордианата
    int x2;
    int y2;
};
 
class CCircle: public CObject
{
public:
    CCircle(int ID, int _x, int _y, int _r)
    :CObject(ID), x(_x), y(_y), r(_r) {}
 
private:
    //координата центра
    int x;
    int y;
 
    //радиус круга
    int r;
};
 
class CTriangle: public CObject
{
public:
    CTriangle(int ID, CCoord _a, CCoord _b, CCoord _c)
    : CObject(ID), a(_a), b(_b), c(_c) {}
 
private:
    CCoord a;//левая
    CCoord b;//средняя
    CCoord c;//правая
};
 
class CPolygon: public CObject
{
public:
    CPolygon(int ID, int n, const CCoord* v)
    : CObject(ID),size(n), coord(new CCoord[size])
    {
        for(int i=0;i<size;i++)
         coord[i]= v[i];
    }
 
    CPolygon(const CPolygon& right)
    :CObject(right.ID), size(right.size), coord(new CCoord[size])
    {
        for(int i=0;i<size;i++)
         coord[i]=right.coord[i];
    }
 
    virtual CObject* clone()
    {
        return new CPolygon(*this);
    }
 
private:
    int size;//сколько координат
 
    //указатель на массив координат. Координаты располагаются от левой до правой
    CCoord* coord;
};
 
 
class CScreen
{
public:
    Add(CObject* toAdd)//должна хранить как-то координаты фигуры что дают
    {
 
    }
 
    //должна вернуть сколько(resLen) фигур пересекают точку x,y и их id(массив res)
    void Test(int x, int y, resLen, int res* )
    {
 
    }
 
 
private:
};
 
int main()
{
    CScreen  S1;
    S1 . Add ( CCircle ( 1, 10, 10, 15 ) );
    S1 . Add ( CCircle ( 2, 30, 10, 15 ) );
    S1 . Add ( CCircle ( 3, 20, 20, 15 ) );
    S1 . Optimize();
    S1 . Test ( 0, 0, resLen, res );
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2012, 15:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение площадей перекрывающихся фигур (C++):

Вычисление площадей геометрических фигур - C++
Программа на языке C++. Вводятся длины сторон прямоугольника, найти его площадь и периметр. Эта программа находит площадь и периметр....

Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических фигур - C++
Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических фигур пожалуйста ребят)

Дружественная функция подсчета площадей - C++
В общем простенькую программу для подсчета площадей написал, а вот как переделать с дружественной функцией - не совсем понял, пробовал,...

Разработать программу «Вычислитель площадей» - C++
помогите прошу Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических фигур

Разработать программу «Вычислитель площадей» - C++
помогите пожалуйста Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических фигур

Нахождение площадей пересечения случайных прямоугольников - C++
Предположим у меня есть некоторое количество прямоугольников (точек x;y которые образуют прямоугольники, а так же точки пересечения...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2012, 15:11
Привет! Вот еще темы с ответами:

Написать программу вывода площадей колец - C++
с++ builder Нужно написать программу вывода площадей колец.Программа должна проверять правильность исходных данных т.е радиус кольца...

Определить разницу площадей круга и квадрата - C++
Задан радиус круга К. Определить разницу площадей круга и квадрата, вписанного в этот круг. Заданий радіус кола К Визначити різницю...

Найти сумму площадей всех треугольников отдельно - C++
помогите решить: В текстовом файле хранятся записи вида: T abc - стороны треугольника (условие существования треугольника выполняется)....

Произвести рассчет площадей комнат и стоимости квартир - C++
Вы являетесь одним из разработчиков программного обеспечения для агентства недвижимости. Вам следует реализовать различные статистические...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.