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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дз по инфе (Игра на торе 2) Помогите срочно! http://www.cyberforum.ru/cpp-beginners/thread570210.html
Нам в школе задали задачу для тренировки к ЕГЭ в разделе С4 Помогите, народ, пожалуйста!! я и так в пердах Маленький Петя научился играть в шахматы. Он даже умеет ставить мат двумя ладьями! И...
C++ Написание драйверов Есть ли какэто книги что бы можно было научиться писать драйвера, и ваше стоит ли программировать драйвера http://www.cyberforum.ru/cpp-beginners/thread570202.html
C++ Не работает программа, не дает ошибку при анализе
возможно проблема компиляции #include <iostream.h> #include <math.h> #include <stdlib.h> const double pi=3.14159; int menu(); void SimetricCharagaytich();
Является ли произведение чисел четным числом C++
Ввести 3 числа. Вывести сообщение является ли произведение чисел четным числом или нет.
C++ Дана матрица размера http://www.cyberforum.ru/cpp-beginners/thread570170.html
Дана матрица размера МхN. Вывести ее элементы,расположенные в столбцах с нечетными номерами (1,3,...). Вывод элементов производить по столбцам,условный оператор не использовать.
C++ Дана матрица размера Дана матрица размера MxN.Вывести ее элементы,расположенные в столбцах с нечетными номерами(1,3,...).Вывод элементов производить по столбцам,условный оператор не использовать. подробнее

Показать сообщение отдельно
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517

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

10.05.2012, 15:11. Просмотров 354. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru