-
Notifications
You must be signed in to change notification settings - Fork 0
/
process.cpp
107 lines (92 loc) · 3.54 KB
/
process.cpp
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
#include "totalpreprocess.hpp"
#include "process.hpp"
const int SCALES[] = {8, 16, 32, 64, 128, 256};
#define locsame(nj, nk) (nj >= 0 && nj < sheight && nk >= 0 && nk < swidth && target.at(nj, nk).vaild > 0.5 && index.at(j, k) == index.at(nj, nk))
#define crosssame(nj, nk) (target2.at(nj, nk).vaild > 0.5 && index.at(j, k) == index2.at(nj, nk))
#define dolocsame(m, nj, nk) target.at(j, k).inlayer[m] = locsame(nj, nk) ? 1.0 : 0.0
#define docrosssame(m, nj, nk) target.at(j, k).crosslayer[m] = crosssame(nj, nk) ? 1.0 : 0.0
void Preprocess::process(int height, int width, const char *filename)
{
if (height % SCALES[NUMSCALES - 1] != 0 || width % SCALES[NUMSCALES - 1] != 0)
throw "size error";
this->height = height;
this->width = width;
polygons.clear();
std::ifstream ifs{filename, std::ifstream::in};
std::vector<Polygon> ps = loadfile(ifs);
polygons.reserve(ps.size());
for (const Polygon &p : ps)
{
polygons.emplace_back();
process_polygon &polygon = polygons.back();
polygon.bounding = p;
polygon.init_segments(height, width);
}
for (int i = 0; i < NUMSCALES; i++)
{
const int scale = SCALES[i];
const int sheight = height / SCALES[i];
const int swidth = width / SCALES[i];
const double zeropoint = (scale - 1) / 2.0;
targets[i].create(sheight, swidth);
indexs[i].create(sheight, swidth);
for (int j = 0; j < sheight; ++j)
{
double y = j * scale + zeropoint;
for (int k = 0; k < swidth; ++k)
{
double x = k * scale + zeropoint;
auto &target = targets[i].at(j, k);
auto &index = indexs[i].at(j, k);
for (int l = 0; l < (int)polygons.size(); ++l)
{
process_point temp;
bool succeeded = polygons[l].process(x, y, scale, temp);
if (succeeded)
{
target.vaild = 1;
target.height = temp.height;
target.width = temp.width;
target.deltax = temp.deltax;
target.deltay = temp.deltay;
target.angle = temp.angle;
target.curvature = temp.curvature;
index = l;
break;
}
else
{
target.vaild = 0;
}
}
}
}
auto &target = targets[i];
auto &index = indexs[i];
for (int j = 0; j < sheight; ++j)
{
for (int k = 0; k < swidth; ++k)
{
if (target.at(j, k).vaild < 0.5)
continue;
dolocsame(0, j - 1, k - 1);
dolocsame(1, j, k - 1);
dolocsame(2, j + 1, k - 1);
dolocsame(3, j + 1, k);
dolocsame(4, j + 1, k + 1);
dolocsame(5, j, k + 1);
dolocsame(6, j - 1, k + 1);
dolocsame(7, j - 1, k);
if (i != 0)
{
auto &target2 = targets[i - 1];
auto &index2 = indexs[i - 1];
docrosssame(0, 2 * j, 2 * k);
docrosssame(1, 2 * j + 1, 2 * k);
docrosssame(2, 2 * j, 2 * k + 1);
docrosssame(3, 2 * j + 1, 2 * k + 1);
}
}
}
}
}