一、 实验目的。
使用liang-barshky算法实现裁剪任意直线段实验工具
二、 实验工具
VC6.0
三、 实验步骤
思想:以直线的参数方程为基础:
X=x1 + u(x2-x1)
Y =y1 + u(y2-y1)
裁剪区域是不等式:
wxl<= X=x1 + u(x2-x1)<= wxr
wyb<= Y =y1 + u(y2-y1)<= wyt
代入直线方程经过一系列命名转换得到:
p1=-△x, p2=△x, p3=-△y, p4=△y,
q1=wx1-wxl, q2=wxr-wx1, q3=wy1-wxb, q4=wyt-y1,
是一条有方向的线段,延长线分别是入边和出边
然后分情况解决:
①p =0,q<0, 直线与裁剪框平行,且位于裁剪框的外面,直线不可见,可抛弃,直接结束
q>=0,直线在它所平行的窗口边界的内部,需进一步计算确定直线是否在窗口内、外、或者相交。
②p <0,直线从边界的外部延伸到内部
③p >0, 直线从边界的内部延伸到外部
p≠0,式子计算直线与边界k的交点的参数u。对于每条直线,计算直线位于裁剪窗口内线段的参数p 1和p 2
p 1由使得直线是从外部延伸到内部的窗口边界决定:ri = qi/ p i.
p 1 = max(ri,0)
p 2由那些使得直线是从内部延伸到窗口边界决定:
p 2 = min(ri,1)
如果p 1> p 2,这条直线完全在窗口的外面,不可见,抛弃,否则,根据参数u的两个值,计算出裁剪后线段的端点
最后显示出来,裁剪的线段与边界外的线段用不同颜色表示。
3.建立一个工程文件,将思路转化为c编程语言,进行编译。
代码如下:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include<iostream>
#include<graphics.h>
#include<math.h>
using namespace std;
// 给出最大值
float maxi(float arr[],int n) {
float m = 0;
for (int i = 0; i < n; ++i)
if (m < arr[i])
m = arr[i];
return m;
}
// 给出最小值
float mini(float arr[], int n