Xinqi Bao's Git
6 #include "Configurations.hh"
9 Loop::Loop(Vec2d
& p
, uint32_t size
= 10) : completed(false)
13 minX
= p
.x
, maxX
= p
.x
;
14 minY
= p
.y
, maxY
= p
.y
;
17 bool Loop::isCompleted() const { return completed
; }
18 void Loop::add(double x
, double y
) { add(new Vec2d(x
, y
)); }
19 void Loop::add(Vec2d
* p
) { add(*p
); }
20 void Loop::add(Vec2d
& p
)
22 if (head
.front().equal(p
))
25 midX
= (minX
+ maxX
) / 2;
26 midY
= (minY
+ maxY
) / 2;
29 if (minX
> p
.x
) minX
= p
.x
;
30 if (maxX
< p
.x
) maxX
= p
.x
;
31 if (minY
> p
.y
) minY
= p
.y
;
32 if (maxY
< p
.y
) maxY
= p
.y
;
35 int Loop::size() const { return head
.size(); }
36 const Vec2d
& Loop::at(int i
) const { return head
.at(i
% head
.size()); }
37 const Vec2d
& Loop::front() const { return head
.front(); }
38 const Vec2d
& Loop::back() const { return head
.back(); }
39 Vec2d
& Loop::at(int i
) { return head
.at(i
% head
.size()); }
40 Vec2d
& Loop::front() { return head
.front(); }
41 Vec2d
& Loop::back() { return head
.back(); }
42 double Loop::getminX() const { return minX
; }
43 double Loop::getmaxX() const { return maxX
; }
44 double Loop::getminY() const { return minY
; }
45 double Loop::getmaxY() const { return maxY
; }
46 double Loop::getXsum() const { return xsum
; }
47 double Loop::getYsum() const { return ysum
; }
50 for (const auto& v
: head
)
58 if (head
.size() < 4) return;
59 Vec2d
p1(head
.back()); // position at -1, 0, 1
60 Vec2d
p2(head
.front());
62 if (fabs((p2
.x
- p1
.x
) * (p3
.y
- p1
.y
) - (p3
.x
- p1
.x
) * (p2
.y
- p1
.y
)) <
64 head
.erase(head
.begin());
66 for (int i
= 0; i
< head
.size() - 2; i
++)
67 { // position form 0, 1, 2 to end-2, end-1, end
71 if (fabs((p2
.x
- p1
.x
) * (p3
.y
- p1
.y
) -
72 (p3
.x
- p1
.x
) * (p2
.y
- p1
.y
)) < thr
)
74 head
.erase(head
.begin() + (i
+ 1));
79 p1
= head
.at(head
.size() - 2); // position at -2, -1, 0
82 if (fabs((p2
.x
- p1
.x
) * (p3
.y
- p1
.y
) - (p3
.x
- p1
.x
) * (p2
.y
- p1
.y
)) <
86 for (auto& lp
: subLoops
) lp
.optimize();
88 bool Loop::checkSubLoop(Loop
& lp
)
90 if (lp
.getminX() > minX
&& lp
.getmaxX() < maxX
&& lp
.getminY() > minY
&&
93 subLoops
.push_back(lp
);
94 for (auto& l
: lp
.subLoops
)
96 subLoops
.push_back(l
);
103 void Loop::print() const
105 if (head
.size() == 0)
111 for (int i
= 1; i
< head
.size(); i
++)
113 cout
<< " --> " << head
.at(i
);