矩形截取直线段扫描算法——Liang_Barsky_clipper算法简介以及C++实现
目录
C++代码实现
//将原来以(x1,y1)为起点 (x2,y2)为终点的线段
//截取矩形(xmin,ymin, xmax, ymax)内部的线段,
//替换原来的起点、终点。
bool Liang_Barsky_clipper(double xmin, double ymin, double xmax, double ymax,
double& x1, double& y1, double& x2, double& y2) {
double dx = x2 - x1;
double dy = y2 - y1;
double p[5];
p[1] = -dx;
p[2] = -p[1];
p[3] = -dy;
p[4] = -p[3];
double q[5];
q[1] = x1 - xmin;
q[2] = xmax - x1;
q[3] = y1 - ymin;
q[4] = ymax - y1;
double u1 = 0, u2 = 1;
for (size_t i = 1; i <= 4; i++)
{
double r = q[i]/p[i];
if (p[i] < 0)
{
if (r > u2) return false;
if (r > u1) u1 = r;
}
else if (p[i] > 0)
{
if (r < u1) return false;
if (r < u2) u2 = r;
}
else if (q[i] < 0) return false;
}
//do x2 y2 first
x2 = x1 + u2*dx; y2 = y1 + u2*dy;
x1 = x1 + u1*dx; y1 = y1 + u1*dy;
return true;
}//liang_barsky_clipper
简介待续···