画线之逐点比较法

来源:互联网 发布:美国与伊朗关系知乎 编辑:程序博客网 时间:2024/06/06 09:49

这个学期,专业开设了<计算机图形学>.用的是清华唐泽圣的书。今天刚学了逐点比较法,书上只是分别讨论了各象限线的增量计算公式。作为练习,我用编程实现了一下。相信这是无数学过这门课的同学都做过的事情。

    所谓象限,应该是把直线看作向量,将它们起点平移到坐标原点,然后根据走向便可划分出不同象限的直线。

如上图所示:给出了在屏幕坐标系下,按书上所说的四种象限的直线。线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;
}

 

原创粉丝点击