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
|
#include "Room.h"
#include "LevelEdge.h"
const Room& Room::operator=(const Room &room) {
polygon.clear();
edges.clear();
name = room.name;
height = room.height;
for(Polygon::const_iterator v = room.polygon.begin(); v != room.polygon.end(); v++)
addVertex(*v);
return room;
}
void Room::addVertex(Vertex v) {
polygon.push_back(v);
if(polygon.size() < 2)
return;
if(polygon.size() == 2) {
LevelVertex v1(this, 0, this), v2(this, 1, this);
edges.push_back(Edge(v1, v2));
edges.push_back(Edge(v2, v1));
return;
}
edges.pop_back();
LevelVertex v1(edges.back().getVertex2());
LevelVertex v2(this, polygon.size()-1, this);
LevelVertex v3(edges.front().getVertex1());
edges.push_back(Edge(v1, v2));
edges.push_back(Edge(v2, v3));
}
std::vector<SharedPtr<LevelObject> > Room::getChildren() {
std::vector<SharedPtr<LevelObject> > children;
for(size_t i = 0; i < polygon.size(); i++)
children.push_back(SharedPtr<LevelObject>(new LevelVertex(this, i, this)));
for(size_t i = 0; i < edges.size(); i++)
children.push_back(SharedPtr<LevelObject>(new LevelEdge(this, i, this)));
return children;
}
void Room::rotate(Vertex m, float a) {
float s = sinf(a);
float c = cosf(a);
for(Polygon::iterator v = polygon.begin(); v != polygon.end(); v++) {
*v -= m;
v->setLocation(c*v->getX() - s*v->getY(), c*v->getY() + s*v->getX());
*v += m;
}
}
|