C语言实现Cohen_Sutherland算法
前提简要:
算法简介:
编码算法是最早、最流行的线段裁剪算法,该算法采用区域检验的方法,能够快速有效地判断一条线段与裁剪窗口的位置关系,对完全接受或完全舍弃的线段无需求交,即可直接识别。
算法思想:
编码算法将整个画布分成9个区域,如下图所示:
根据线段端点所在位置,给每个端点一个四位二进制码(称为区域码)。四位区域码的4位从左到右依次表示上、下、右、左。区域码的任何为赋值为1代表端点落在相应的区域中,否则为0。
————————————————
版权声明:本文为CSDN博主「矢月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44397852/article/details/109015504
代码实现:
//利用数值的位运算
//实现Cohen_Sutherland算法
double xl, xr, yt, yb;//事先给出的窗口位置,四个数值均为已知
void Cohen_SutherLand(double x0, double y0, double x2, double y2)
{
int c, c0, c1;
double x, y;
c0 = makecode(x0, y0); c1 = makecode(x2, y2);
while (c0 != 0 || c1 != 0) {
if (c0&c1 != 0)return;
c = c0; if (c == 0)c = c1;
if (c & 1 == 1)
{
y = y0 + (y2 - y0)*(xl - x0) / (x2 - x0);
x = xl;
}
else if (c & 2 == 2) {
y = y0 + (y2 - y0)*(xr - x0) / (x2 - x0);
x = xr;
}
else if (c & 4 == 4) {
x = x0 + (x2 - x0)*(yb - y0) / (y2 - y0);
y = yb;
}
else if (c & 8 == 8) {
x = x0 + (x2 - x0)*(yt - y0) / (y2 - y0);
y = yt;
}
if (c == c0) {
x0 = x;
y0 = y;
c0 = makecode(x, y);
}
else {
x2 = x;
y2 = y;
c1 = makecode(x, y);
}
showline(x0, y0, x2, y2);//显示可见线段
}
}
int makecode(double x, double y) {
int c = 0;
if (x < xl)c = 1;
else if (x > xr)c = 2;
if (y < yb)c = c + 4;
else if (y > yt)c = c + 8;
return c;
}