Liang-Barkey算法的实现

这是我根据书上代码写的核心代码,但是这个始终进不去四个判断条件。


bool LiangBarskey::ClipT(float p, float q, float *u1, float *u2){
    //const float epsilon = 1e-6;
    qDebug("p=%f,q=%f",p,q);

    float r = 0.0;

    if(p<0){
        r=q/p;
        qDebug("r=%f",r);
        qDebug()<<"r>*u2"<<(r>*u2);
        qDebug()<<"r>*u1"<<(r>*u1);
        if(r>*u2)
            return false;
        if(r>*u1)
            *u1=r;
        qDebug("第一个条件u1=%f",*u1);
    }
    else if(p>0){
        r=q/p;
        qDebug("r=%f",r);
        qDebug()<<"r<*u1"<<(r<*u1);
        qDebug()<<"r<*u2"<<(r<*u2);
        if(r<*u1)
            return false;
        if(r<*u2)
            *u2=r;
        qDebug("第二个条件u2=%f",*u2);
    }
    else return (q>=0);

    qDebug()<<"3333";
    return true;
}

void LiangBarskey::LB_LineClip(){
    qDebug("这是LB裁剪函数");
    float dx,dy;
    float u1=0.0,u2=1.0;
    dx=endPoint.x()-startPoint.x();
    dy=endPoint.y()-startPoint.y();
    qDebug()<<dx<<dy;
    //float prevU1 = u1;
    //float prevU2 = u2;

    if(ClipT(-dx,startPoint.x()-clipRect.left(),&u1,&u2)){
        qDebug("第一个");
        if(ClipT(dx,clipRect.right()-startPoint.x(),&u1,&u2)){
            qDebug("第二个");
            if(ClipT(-dy,startPoint.y()-clipRect.bottom(),&u1,&u2)){
                qDebug("第三个");
                if(ClipT(dy,clipRect.top()-startPoint.y(),&u1,&u2)){
                    qDebug("第四个u1=%f,u2=%f",u1,u2);
                    startPoint.setX(startPoint.x()+u1*dx);
                    startPoint.setY(startPoint.y()+u1*dy);
                    endPoint.setX(startPoint.x()+u2*dx);
                    endPoint.setY(startPoint.y()+u2*dy);
                    qDebug()<<startPoint<<endPoint;
                }
            }
        }
    }
}

调试信息:
这是LB裁剪函数
640 312
p=-640.000000,q=-169.000000
r=0.264062
r>*u2 false
r>*u1 true
第一个条件u1=0.264062
3333
第一个
p=640.000000,q=368.000000
r=0.575000
r<*u1 false
r<*u2 true
第二个条件u2=0.575000
3333
第二个
p=-312.000000,q=-336.000000
r=1.076923
r>*u2 true
r>*u1 true

在第三个判断条件后直接return false了,但是我看网上都是这个思路写的,请问是为什么啊?还有怎么改啊?


bool LiangBarskey::ClipT(float p, float q, float *u1, float *u2){
    //const float epsilon = 1e-6;
    qDebug("p=%f,q=%f",p,q);

    float r = 0.0;

    if (p<0){
        r=q/p;
        qDebug("r=%f",r);
        qDebug()<<"r>*u2"<<(r>*u2);
        qDebug()<<"r>*u1"<<(r>*u1);
        if(r>*u2) {
            qDebug()<<"1111";
            return false;
        }
        if(r>*u1)
            *u1=r;
        qDebug("第一个条件u1=%f",*u1);
        qDebug()<<"2222";
        return true;
    }
    else if(p>0){
        r=q/p;
        qDebug("r=%f",r);
        qDebug()<<"r<*u1"<<(r<*u1);
        qDebug()<<"r<*u2"<<(r<*u2);
        if(r<*u1) {
            qDebug()<<"3333";
            return false;
        }
        if(r<*u2)
            *u2=r;
        qDebug("第二个条件u2=%f",*u2);
        qDebug()<<"4444";
        return true;
    }
    else if (q>=0) {
        qDebug()<<"5555";
        return true;
    }
    else {
        qDebug()<<"6666";
        return false;
    }
}

void LiangBarskey::LB_LineClip(){
    qDebug("这是LB裁剪函数");
    float dx,dy;
    float u1=0.0,u2=1.0;
    dx=endPoint.x()-startPoint.x();
    dy=endPoint.y()-startPoint.y();
    qDebug()<<dx<<dy;
    //float prevU1 = u1;
    //float prevU2 = u2;

    if(ClipT(-dx,startPoint.x()-clipRect.left(),&u1,&u2)){
        qDebug("第一个");
        if(ClipT(dx,clipRect.right()-startPoint.x(),&u1,&u2)){
            qDebug("第二个");
            if(ClipT(-dy,startPoint.y()-clipRect.bottom(),&u1,&u2)){
                qDebug("第三个");
                if(ClipT(dy,clipRect.top()-startPoint.y(),&u1,&u2)){
                    qDebug("第四个u1=%f,u2=%f",u1,u2);
                    startPoint.setX(startPoint.x()+u1*dx);
                    startPoint.setY(startPoint.y()+u1*dy);
                    endPoint.setX(startPoint.x()+u2*dx);
                    endPoint.setY(startPoint.y()+u2*dy);
                    qDebug()<<startPoint<<endPoint;
                }
            }
        }
    }
}