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

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

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
10.05.2012, 15:11     Хранение площадей перекрывающихся фигур #1
Перефразирую свою старую тему, видать намудрил я там с описанием.

Задача: как-нибудь (вообще как-угодно, лишь бы побыстрее работало) в классе хранить площади фигур которые нам дают через функцию 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 );
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2012, 15:11     Хранение площадей перекрывающихся фигур
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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