取名字好难-_- 2023-05-31 16:20 采纳率: 58.3%
浏览 10

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了,但是我看网上都是这个思路写的,请问是为什么啊?还有怎么改啊?

  • 写回答

1条回答 默认 最新

  • 赵4老师 2023-05-31 16:43
    关注
    
    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;
                    }
                }
            }
        }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度