double edgeDistance(Point2 p1, Point2 p2, Point2 p) { double x1 = p1.x; double x2 = p2.x; double y1 = p1.y; double y2 = p2.y; double x0 = p.x; double y0 = p.y; double den = fabs((y2 - y1)*x0 - (x2-x1)*y0 + x2*y1-y2*x1); double num = sqrt((y2-y1)*(y2-y1) + (x2-x1)*(x2-x1)); double linedist = den / num; double p1_dist = p1.distance(p); double p2_dist = p2.distance(p); double edge_len = p1.distance(p2); if (p1_dist > edge_len) return std::numeric_limits<double>::infinity(); if (p2_dist > edge_len) return std::numeric_limits<double>::infinity(); return linedist; }
Vertex KVFModel::getClosestPin(Point2 point, double radius) const { Vertex result = -1; double distance = radius; for (auto iter = pinnedVertexes.begin() ;iter != pinnedVertexes.end(); iter++) { Point2 pinLocation = vertices[*iter]; if (point.distance(pinLocation) < distance) result = *iter; } return result; }