重庆餐饮网站建设,买公司 网站建设,wordpress自动重命名,自建免费网站前提简要#xff1a;
算法简介#xff1a; 编码算法是最早、最流行的线段裁剪算法#xff0c;该算法采用区域检验的方法#xff0c;能够快速有效地判断一条线段与裁剪窗口的位置关系#xff0c;对完全接受或完全舍弃的线段无需求交#xff0c;即可直接识别。
算法思想
算法简介 编码算法是最早、最流行的线段裁剪算法该算法采用区域检验的方法能够快速有效地判断一条线段与裁剪窗口的位置关系对完全接受或完全舍弃的线段无需求交即可直接识别。
算法思想 编码算法将整个画布分成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 (c0c1 ! 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;
}