这是我根据书上代码写的核心代码,但是这个始终进不去四个判断条件。
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了,但是我看网上都是这个思路写的,请问是为什么啊?还有怎么改啊?