• Bresenham算法


      1 /*************************************************************
      2      pb-图形学题2
      3      Bresenham算法
      4      用Bresenham算法画出0<k<1区间的直线,再对称到其它所有k
      5      斜率的直线
      6 
      7 *************************************************************/
      8 
      9 
     10 #include <GL/glut.h>
     11 #include<cstdio>
     12 #include<cmath>
     13 
     14 int x,y,endx,endy,p;
     15 
     16 void init()
     17 {
     18     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //什么单缓存的东西,现在不懂什么意思,就当通用条件
     19     glutInitWindowPosition(100, 100);                            //图片出现的位置
     20     glutInitWindowSize(400, 300);                                //图片的长和宽
     21     glutCreateWindow("pb-图形学题1");                            //图片的名字
     22 
     23     glClearColor(0.0, 0.0, 0.0, 0.0);
     24     glMatrixMode(GL_PROJECTION);
     25     gluOrtho2D(-10000, 10000, -10000, 10000); 
     26 
     27     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
     28     glClear(GL_COLOR_BUFFER_BIT);
     29     glColor3f(1.0, 0.0, 0.0);                                    //线的颜色
     30 }
     31 
     32 
     33 void setPixel (GLint x,GLint y,GLint nx,GLint ny)               //描点函数,表示从x,y到nx,ny的矩形全部涂色
     34 {
     35     glBegin(GL_LINES);
     36        glVertex2i(x, y);
     37        glVertex2i(nx,ny);
     38     glEnd();
     39 }
     40 
     41 //交换坐标。
     42 void swap(int &x,int &y)
     43 {
     44     x^=y;
     45     y^=x;
     46     x^=y;
     47 }
     48 
     49 
     50 //求k得范围,p=1表示 0<k<1; p=2表示 k>1; p=3 表示 -1<k<0; p=4表示 k<-1;
     51 //并把初始坐标映射的0<k<1。
     52 void Spoint()
     53 {
     54    if ((endx-x)*(endy-y)>0)
     55     {
     56         if (abs(endx-x)-abs(endy-y)>=0) p=1;
     57         else 
     58         {
     59             p=2;
     60             swap(x,y);
     61             swap(endx,endy);
     62         }
     63     }
     64     else
     65     {
     66            if (abs(endx-x)-abs(endy-y)>=0) 
     67            {
     68                p=3;
     69                y=-y;
     70                endy=-endy;
     71            }
     72            else 
     73            {
     74                p=4;
     75                x=-x;
     76                endx=-endx;
     77                swap(x,y);
     78                swap(endx,endy);
     79            }
     80     }
     81 }
     82 
     83 
     84 //根据k判断对称范围,再描点。
     85 void setpoint(int x0,int y0,int x1,int y1)
     86 {
     87     if (p==1) setPixel (x0,y0,x1,y1);
     88     if (p==2) setPixel (y0,x0,y1,x1);
     89     if (p==3) setPixel (x0,-y0,x1,-y1);
     90     if (p==4) setPixel (-y0,x0,-y1,x1);
     91 }
     92 
     93 //Bresenham算法。
     94 void myDisplay(void)                                             
     95 { 
     96 
     97     int dx=abs(x-endx),dy=abs(y-endy);
     98     int d=2*dy-dx;
     99     int tdy=2*dy,tdx=2*(dy-dx);
    100     if (x>endx)
    101     {
    102         swap(x,endx);
    103         swap(y,endy);
    104     }
    105     int x0=x,y0=y;
    106     while (x<endx)
    107     {
    108     //    printf("****%d***%d
    ",x,y);
    109         x0=x+1;
    110         if (d<0)
    111         {
    112             y0=y;
    113             d+=tdy;
    114         }
    115         else
    116         {
    117             y0=y+1;
    118             d+=tdx;
    119         }
    120         setpoint(x,y,x0,y0);
    121         x=x0;
    122         y=y0;
    123     }
    124     glFlush();                                                   //不知道什么东西,一定要写。
    125  }
    126 
    127 
    128 
    129  int main(int argc, char *argv[])
    130  {
    131      glutInit(&argc, argv);
    132      printf("请输入直线的起始点坐标,结束坐标:
    ");
    133      scanf("%d%d%d%d",&x,&y,&endx,&endy);
    134      Spoint();
    135      init();                                                     //初始化数据
    136      glutDisplayFunc(&myDisplay);                                //调用函数                    
    137      glutMainLoop();                                             //开始程序
    138      return 0; 
    139  }
  • 相关阅读:
    C语言volatile
    2017-10-12 下一步计划
    关于步进电机的半流设置、衰减设置
    压力校准仪开发-----步进电机驱动
    kei中实现在线仿真看波形
    42步进电机与57步进电机
    网上的说TB6560存在的问题
    TB6560步进电机驱动板
    继承
    iOS设计模式——单例模式
  • 原文地址:https://www.cnblogs.com/pblr/p/5326296.html
Copyright © 2020-2023  润新知