现在的位置: 首页 > 综合 > 正文

c&OpenGL实现计算机图形学:双步绘制直线法绘制菱形

2013年09月22日 ⁄ 综合 ⁄ 共 3573字 ⁄ 字号 评论关闭

#include <windows.h>
#include <math.h>
#include "glut.h"

int x,y;//用这两个全局变量传递当前窗口的大小。
void init(void)
{
 glClearColor(1.0,1.0,1.0,0.0);
 glMatrixMode(GL_PROJECTION);
 gluOrtho2D(-150.0,150.0,-150.0,150.0);
}

int sign(int x)
{
 if(x == 0)
 {
  return 0;
 }
 else
 {
  if(x>0)
   return 1;
  else
   return -1;
 }
}
void Doublestep(GLint x0,GLint y0,GLint x1,GLint y1)
{
 x0*=y/300;y0*=y/300;x1*=y/300;y1*=y/300;//此行代码用于保持坐标与窗口相对位置不变
 GLint d,dx,dy,current_x = x0,current_y = y0,cond;//声明有用的临时变量
 dx = abs(x1-x0);         dy = abs(y1-y0);
 int s_x = sign(x1-x0);   int  s_y = sign(y1-y0);
 cond = 2*dx;
 d = 4*dy-dx;
 bool is_changed;//标明,象限改变了,dx和dy互相颠倒过了。是改变了的。
 if(dy>dx)
 {//此时与标准情况正好相反,如果本来x坐标增加,现在变为y坐标增加
  int temp = dx;
  dx = dy;
  dy = temp;
  is_changed = true;
 }
 else
  is_changed = false;
 for(int i = 1;i<=dx;i+=2)
 {
  if(d<0)
  {  //绘制水平两点,即第一种情况,k<1/4。         
    glVertex2i(current_x,current_y);//1    
   if(is_changed)current_y+=s_y;//2            
    else                                                              
     current_x+=s_x;                                       
                                                                          
   glVertex2i(current_x,current_y);               
   if(is_changed)current_y+=s_y;//3           
    else                                                            
     current_x+=s_x;                                      
  } 

else
  {
   if(d<cond)
   {   //绘制第二种情况,k=>1/4 && k<2/4
    glVertex2i(current_x,current_y);//1      
   
    if(is_changed)current_y+=s_y;//2       
     else                                                         
      current_x+=s_x;                                   
                                                                      
    glVertex2i(current_x,current_y);          
   
    current_x+=s_x;current_y+=s_y;//3    
   }
   else if(d<2*cond)
   {  //绘制三种情况,k<=2/4 && k<3/4    
    glVertex2i(current_x,current_y);//1      
   
    current_x+=s_x;current_y+=s_y;//2    
                                                                      
    glVertex2i(current_x,current_y);          
  
    if(is_changed)current_y+=s_y;//3      
     else                                                        
      current_x+=s_x;                                  
   }
   else
   {  //绘制第四种情况,k>=3/4               
    glVertex2i(current_x,current_y);//1    

    current_x+=s_x;current_y+=s_y;//2   
                                                       
    glVertex2i(current_x,current_y);          
    current_x+=s_x;current_y+=s_y;//3   
    d-=2*dx;//情况4单独减2dx                   
   }
   d-=2*dx;//2,3,4情况统一减2dx
  }
  d+=4*dy;//所有情况统一加4dy;
 }
}

void displayfunc(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0,1.0,0.0);
 //坐标轴。
 glBegin(GL_LINES);
 glVertex2i(-x/2,0);
 glVertex2i(x/2-1,0);
 glEnd();
 glBegin(GL_LINES);
 glVertex2i(0,-y/2);
 glVertex2i(0,y/2);
 glEnd();

 glColor3f(1.0,0.0,0.0);
 glBegin(GL_POINTS);
 //菱形的4条边************//*
 Doublestep(-100,0,0,-150);//*
 Doublestep(100,0,0,-150);//*
 Doublestep(100,0,0,150);//*
 Doublestep(-100,0,0,150);//*
 //***********************//*
 glEnd();
 glFlush();
}

void myReshapeFunc(GLsizei w,GLsizei h)
{
 x = w;y = h;
 glViewport(0, 0, w, h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 //令坐标系统和窗口大小变化对应,即坐标始终和窗口大小保持1:1,
 //否则窗口放大后所画直线将变成虚线,即画点的坐标偏离预期坐标。
 gluOrtho2D(-w/2.0+0.5,w/2.0+0.5,-h/2.0+0.5,h/2.0+0.5);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity ();
 glClear(GL_COLOR_BUFFER_BIT);
}

int main(int argc, char** argv)
{
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
 glutInitWindowPosition(300,300);
 glutInitWindowSize(301,301);
 glutCreateWindow("My DrawRhombus Program");

 init();
 glutReshapeFunc (myReshapeFunc);
 glutDisplayFunc(displayfunc);
 glutMainLoop();
 return 0;
}

抱歉!评论已关闭.