57 double len0,
len, sum = 0;
58 double diff_x, diff_y, diff_x0, diff_y0;
59 double cos_theta, cos_max = -10;
61 diff_x0 = end.
x-meeting.
x;
62 diff_y0 = end.
y-meeting.
y;
63 len0 = sum = hypot(diff_x0, diff_y0);
67 diff_x = p.x - meeting.
x;
68 diff_y = p.y - meeting.
y;
69 len = hypot(diff_x, diff_y);
71 cos_theta = (diff_x0 * diff_x + diff_y0 * diff_y)
72 / std::max(
len * len0, 0.00001);
73 cos_max = std::max(cos_max, cos_theta);
77 return sum*(cos_max + angle_param);
101 double angle_param) {
102 point_t first, second, third, fourth, diff, meeting;
103 double value1, value2, value3, value4;
113 if (angle_param < 1){
169 }
while (fabs(value1 - value4) / (std::min(value1, value4) + 1e-10) > prec
228double ink(
const std::vector<pedge> &edges,
int numEdges,
int *pick,
235 double cend = 0, cbegin = 0;
246 for (i = 0; i < numEdges; i++) {
247 const pedge &e = pick ? edges[pick[i]] : edges[i];
248 const std::vector<double> &x = e.
x;
252 (*ink0) += hypot(source.
x - target.
x, source.
y - target.
y);
269 std::vector<point_t> sources;
270 std::vector<point_t> targets;
271 for (i = 0; i < numEdges; i++) {
272 const pedge &e = pick ? edges[pick[i]] : edges[i];
273 const std::vector<double> &x = e.
x;
274 sources.push_back(
point_t{x[0], x[1]});
282 cbegin = std::max(cbegin,
project_to_line(sources[i], begin, end, angle));
287 if (angle > 0 && angle <
M_PI){
288 if (cbegin + cend > 1 || cbegin > 1 || cend > 1){
290 inkUsed = 1000*(*ink0);
294 cbegin = std::max(0.0, cbegin);
298 cend = std::max(0.0, cend);
303 inkUsed =
bestInk(sources, begin, mid, eps, meet1, angle_param)
304 +
bestInk(targets, end, mid, eps, meet2, angle_param);
double ink(const std::vector< pedge > &edges, int numEdges, int *pick, double *ink0, point_t *meet1, point_t *meet2, double angle_param, double angle)
static double bestInk(const std::vector< point_t > &points, point_t begin, point_t end, double prec, point_t *meet, double angle_param)