这个学期,专业开设了<计算机图形学>.用的是清华唐泽圣的书。今天刚学了逐点比较法,书上只是分别讨论了各象限线的增量计算公式。作为练习,我用编程实现了一下。相信这是无数学过这门课的同学都做过的事情。
所谓象限,应该是把直线看作向量,将它们起点平移到坐标原点,然后根据走向便可划分出不同象限的直线。
如上图所示:给出了在屏幕坐标系下,按书上所说的四种象限的直线。线i对应第i个象限(1<=i<=4)。然后就能套用书上的关于偏差运算的公式来生成各个象限的直线。
下面给出我的源代码,用的是TC2.0。改天再试着用Java实现一下,因为我们老师说Tc2.0中的颜色太少了,要学着用其他语言实现书上的算法。有什么不足之处,请各位大侠多多指点。
#include<graphics.h>
#include<math.h>
#include<stdio.h>
int sign(int a){
if( a < 0) return -1;
return a != 0;
}
void drawLine(int x1,int y1,int x2,int y2){
int xt,yt;
int F,n,i;
int num;
int xSign,ySign;
x2 -= x1; xSign = sign(x2);
y2 -= y1; ySign = sign(y2);
num = xSign * ySign;
F = 0;
putpixel(x1,y1,RED);
xt = x1,yt = y1;
n = abs(y2) + abs(x2);
for(i = 0; i < n ;i++){
if(F>=0){
if(num > 0){
F -= abs(y2);
xt += xSign;
}
else{
F -= abs(x2);
yt += ySign;
}
}
else{
if(num>0){
yt += ySign;
F += abs(x2);
}
else{
xt += xSign;
F += abs(y2);
}
}
putpixel(xt,yt,RED);
}
}
int main(){
int gd = DETECT,gm;
int x1,y1,x2,y2;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
do{
printf("x1 = ");scanf("%d",&x1);
if(x1<0) break;
printf("y1 = "); scanf("%d",&y1);
printf("x2 = "); scanf("%d",&x2);
printf("y2 = "); scanf("%d",&y2);
drawLine(x1,y1,x2,y2);
}while(1);
return 0;
}