做电影电视剧网站推广,石家庄住房建设局网站,网站支持ipv6做哪些改造,vscode 网站开发前言#xff1a;
#xff08;引用梁友栋-Barsky裁剪算法_梁友栋 barsky算法-CSDN博客#xff09;
Cyrus和Beck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法#xff0c;也称为Liany-Barsky#xff08;LB
引用梁友栋-Barsky裁剪算法_梁友栋 barsky算法-CSDN博客
Cyrus和Beck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法也称为Liany-BarskyLB算法。 一、梁友栋-Barsky裁剪算法思想 我们知道一条两端点为P1x1y1、P2x2y2的线段可以用参数方程形式表示
x x1 u·x2-x1 x1 u·Δx y y1 u·y2-y1 y1 u·Δy0≤u≤13-9 式中Δxx2-x1Δyy2-y1参数u在01之间取值Pxy代表了该线段上的一个点其值由参数u确定由公式可知当u0时该点为P1x1y1当u1时该点为P2x2y2。如果点Pxy位于由坐标xwminywmin和xwmaxywmax所确定的窗口内那么下式成立
xwmin≤x1 u·Δx≤xwmax ywmin≤y1 u·Δy≤ywmax3-10 这四个不等式可以表示为
u·pk ≤qk k12343-11 其中p、q定义为
p1-Δx q1x1-xwmin p2Δx q2xwmax-x1 p3-Δy q3y1-ywmin p4Δy q4ywmax-y13-12 从3-12式可以知道任何平行于窗口某边界的直线其pk0但并不是所有的Pk均为0是存在pk0的意思。平行于窗口某边界的图片会出现 p1p2||p3p40的情况k值对应于相应的边界k1234对应于左、右、下、上边界。如果还满足qk0默认x1为最左点?默认斜率大于0小于1则线段完全在边界外应舍弃该线段。如果pk0并且qk≥0则线段平行于窗口某边界并在窗口内见图中所示。公式3-12式还告诉我们 1、当pk0时线段从裁剪边界延长线的外部延伸到内部 2、当pk0时线段从裁剪边界延长线的内部延伸到外部 例如当Δx≥0时对于左边界p10p1-Δx线段从左边界的外部到内部 对于右边界p20p2Δx线段从右边界的内部到外部。 当Δy0时对于下边界p30p3-Δy线段从下边界的内部到外部 对于上边界p40p4Δy线段从上边界的外部到内部。 当pK≠0时可以计算出参数u的值它对应于无限延伸的直线与延伸的窗口边界k的交点即 对于每条直线可以计算出参数u1和u2该值定义了位于窗口内的线段部分 1、u1的值由线段从外到内遇到的矩形边界所决定pk0对这些边界计算rkqk/pku1取0和各个r值之中的最大值。 2、u2的值由线段从内到外遇到的矩形边界所决定pk0对这些边界计算rkqk/pku2取0和各个r值之中的最小值。 3、如果u1u2则线段完全落在裁剪窗口之外应当被舍弃否则被裁剪线段的端点可以由u1和u2计算出来。
代码实现
#includestdio.h
double xl, xr, yt, yb;//事先给出的已知窗体位置
int cansee(double q, double d, double t0, double t1) //判断直线是否可见
{double r;if (q 0)//计算初始边的交点参数{r d / q;if (r t1){return 0;}else if(rt0){t0 r;}}else if(q0){//计算终边的交点参数r d / q;if (r t0) {return 0;}else if (r t1)t1 r;}else if (d0){return 1;}
}void L_Barsky(double x0,double y0,double x1,double y1)//double xl, xr, yt, yb已知
{double t0 0.0, t1 0.0,delatx0.0,delaty0.0;delatx x1 - x0;if (!cansee(-delatx, x0 - x1, t0, t1))return;if (!candee(delatx, xr - x0, t0, t1))return;delatx x1 - x0;if (!cansee(-delaty, y0 - yb, t0, t1))return;if (!cansee(delaty, yt - y0, t0, t1))return;x1 x0 t1 * delatx;y1 y0 t1 * delaty;x0 x0 t0 * delatx;y0 y0 t0 * delaty;showline(x0, y0, x1, y1);//显示可见线段
}注意显示线的方法作者未实现在WFC可直接调用