示例#1
0
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 );
}
示例#2
0
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 );
}
示例#3
0
// 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;
    }