25 {
28
30 int numNodes = 4 <<
t;
31
32 innerPolygonCoef[
t] = 0.5 / std::cos(2.0*
M_PI / numNodes);
33 double c1x = (c0x + c2x) * innerPolygonCoef[t];
34 double c1y = (c0y + c2y) * innerPolygonCoef[t];
37 if (tx * tx + ty * ty <=
rr) {
38 return true;
39 }
40 double t2x = c2x - c1x;
41 double t2y = c2y - c1y;
42 if (tx * t2x + ty * t2y >= 0 && tx * t2x + ty * t2y <= t2x * t2x + t2y * t2y &&
43 (ty * t2x - tx * t2y >= 0 ||
rr * (t2x * t2x + t2y * t2y) >= (ty * t2x - tx * t2y) * (ty * t2x - tx * t2y))) {
44 return true;
45 }
46 double t0x = c0x - c1x;
47 double t0y = c0y - c1y;
48 if (tx * t0x + ty * t0y >= 0 && tx * t0x + ty * t0y <= t0x * t0x + t0y * t0y &&
49 (ty * t0x - tx * t0y <= 0 ||
rr * (t0x * t0x + t0y * t0y) >= (ty * t0x - tx * t0y) * (ty * t0x - tx * t0y))) {
50 return true;
51 }
52 outerPolygonCoef[
t] = 0.5 / (std::cos(
M_PI / numNodes) * std::cos(
M_PI / numNodes));
53 double c3x = (c0x + c1x) * outerPolygonCoef[t];
54 double c3y = (c0y + c1y) * outerPolygonCoef[t];
55 if ((c3x -
x) * (c3x -
x) + (c3y -
y) * (c3y -
y) <
rr) {
56 c2x = c1x;
57 c2y = c1y;
58 continue;
59 }
60 double c4x = c1x - c3x + c1x;
61 double c4y = c1y - c3y + c1y;
62 if ((c4x -
x) * (c4x -
x) + (c4y -
y) * (c4y -
y) <
rr) {
63 c0x = c1x;
64 c0y = c1y;
65 continue;
66 }
67 double t3x = c3x - c1x;
68 double t3y = c3y - c1y;
69 if (ty * t3x - tx * t3y <= 0 ||
rr * (t3x * t3x + t3y * t3y) > (ty * t3x - tx * t3y) * (ty * t3x - tx * t3y)) {
70 if (tx * t3x + ty * t3y > 0) {
71 if (std::abs(tx * t3x + ty * t3y) <= t3x * t3x + t3y * t3y ||
72 (
x - c3x) * (c0x - c3x) + (
y - c3y) * (c0y - c3y) >= 0) {
73 c2x = c1x;
74 c2y = c1y;
75 continue;
76 }
77 } else if (-(tx * t3x + ty * t3y) <= t3x * t3x + t3y * t3y ||
78 (
x - c4x) * (c2x - c4x) + (
y - c4y) * (c2y - c4y) >= 0) {
79 c0x = c1x;
80 c0y = c1y;
81 continue;
82 }
83 }
84 return false;
85 }
86 return false;
87 }
const boost::regex rr(r_r)