下面是用Visual
C++实现的上述算法:
文件名:LB_LineClip.cpp
// LB_LineClip.cpp
#include "stdafx.h"
BOOL ClipTesting(float p, float q, float *u1, float *u2)
{
float r;
if(p < 0)
{
r=q/p;
if(r > *u2) return FALSE;
else if(r > *u1)
{
*u1=r;
return TRUE;
}
}
else if(p > 0)
{
r=q/p;
if(r < *u1) return FALSE;
else if(r < *u2)
{
*u2=r;
return TRUE;
}
}
else
if(q < 0) return FALSE;
return TRUE;
}
BOOL LB_LineClip( float XL, float XR, float YB,
float YT,
float &x1, float &y1, float &x2, float &y2)
// Input: 裁剪窗口的对角顶点(XL,YB)和(XR,YT); 线段起点(x1,y1)和终点(x2,y2)
// Output:裁剪后的线段起点(x1,y1)和终点(x2,y2)
// 返回值: 1) false -- 与裁剪窗口没有交;
// 2) true -- 线段的一部分或者全部位于裁剪窗口内。
{
float dx,dy,u1,u2;
u1=0;
u2=1;
dx =x2-x1;
if(ClipTesting(-dx,x1-XL,&u1,&u2))
if(ClipTesting(dx,XR-x1, &u1,&u2))
{
dy =y2-y1;
if(ClipTesting(-dy,y1-YB, &u1,&u2))
if(ClipTesting(dy,YT-y1, &u1,&u2))
{
if (u2 < 1.0)
{
x2 = x1+u2*dx;
y2 = y1+u2*dy;
}
if (u1 > 0.0)
{
x1 += u1*dx;
y1 += u1*dy;
}
return TRUE;
}
}
return FALSE;
}
|