void Contour::linearInterpolate( double z, int ei, DT_Point& p ) { // 获取第ni条边的端点坐标 DT_Point p1, p2; getEdgePoint( ei, p1, p2 ); // 线性插值 p.z = z; LinearInterpolate( p1, p2, p ); }
bool Contour::hasContourPoint( double z, int i ) { DT_Point p1, p2; getEdgePoint( i, p1, p2 ); if( IsDoubleEqual( p1.z, z ) ) { p1.z = TrimZ( z, p1.z ); } if( IsDoubleEqual( p2.z, z ) ) { p2.z = TrimZ( z, p2.z ); } return ( InRange( p1.z, p2.z, z ) == 1 ); }
// TODO - rewrite for intersected convex regions myFloat Shape::distanceIfConvex(Shape &other, myFloat &alpha1, myFloat &alpha2) { myFloat delta1 = 0.1; myFloat delta2 = 0.1; myFloat dist = getEdgePoint(alpha1).distance(other.getEdgePoint(alpha2)); while (fabs(delta1) > TOLERANCE || fabs(delta2) > TOLERANCE) { // try to move with the first point myFloat newDistance = getEdgePoint(alpha1 + delta1) .distance(other.getEdgePoint(alpha2)); if (newDistance < dist) { dist = newDistance; alpha1 += delta1; delta1 *= 2; continue; } // try to move with the second point newDistance = getEdgePoint(alpha1) .distance(other.getEdgePoint(alpha2 + delta2)); if (newDistance < dist) { dist = newDistance; alpha2 += delta2; delta2 *= 2; continue; } delta1 = -sgn(delta1) * fmax(fabs(delta1), TOLERANCE); delta2 = -sgn(delta2) * fmax(fabs(delta2), TOLERANCE); delta1 /= 2; delta2 /= 2; } return dist; }