注册 登录
编程论坛 C图形专区

GL 画图方式-->baidu转移

vfdff 发布于 2006-08-06 11:22, 2091 次点击

GL 画图方式

决定放弃graphics ,但是刚刚开始就遇到问题,希望高手帮帮菜鸟!!

#include <GL/glut.h>
#include <math.h>
#include <conio.h>

const int N = 30;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;


void myDisplay1(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS /* ?ú?aà?ì?é????ù?£í?μ??£ê? */ );
glVertex2f(0.0f, 0.0f);/* ?ú?aà?ê1ó?glVertex*?μáDoˉêy */
glVertex2f(0.5f, 0.0f);/* ???¨???ù?£í?μ??¥μ????? */
glEnd();
glFlush();
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}

void myDisplay2(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
for(i=0; i<N; ++i)
glVertex2f(R*cos(2*Pi/N*i), R*sin(2*Pi/N*i));
glEnd();
glFlush();
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(50, 100);
glutInitWindowSize(200, 200);
glutCreateWindow("μú3.1??OpenGL3ìDò");
glutDisplayFunc(&myDisplay1);
//glutMainLoop();

getch(); // 把这个注释掉之后是能正确的画两个图的!!

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(200, 100);
glutInitWindowSize(200, 200);
glutCreateWindow("μú3.2??OpenGL3ìDò");
glutDisplayFunc(&myDisplay2);
glutMainLoop();
return 0;
}
本来想先 画条线,等待 在按下任意键后再画一个圆的,但是为什么不行
在 getch(); 处停下拉,不管怎么按键,就是不出 圆????

10 回复
#2
jig2006-08-06 13:27
头文件加个 stdio.h

看看?
#3
vfdff2006-08-06 16:33
getch(); 的头文件是 <conio.h>
而且我试过 还是一样的效果,没有反应!!
#4
starrysky2006-08-07 10:43
不好意思,来晚了点。
我先看看。
#5
starrysky2006-08-07 10:49
以下是引用vfdff在2006-8-6 11:22:06的发言:


void myDisplay1(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS /* ?ú?aà?ì?é????ù?£í?μ??£ê? */ );
glVertex2f(0.0f, 0.0f);/* ?ú?aà?ê1ó?glVertex*?μáDoˉêy */
glVertex2f(0.5f, 0.0f);/* ???¨???ù?£í?μ??¥μ????? */
glEnd();
glFlush(); //这个函数的功能为强制绘画完成,用这个函数将前面所绘的图形强制绘出,所有绘制图形数据出栈一般用在所有绘画完成之后,在函数结尾有一个就行了,这个是多余的,去掉。
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}

#6
starrysky2006-08-07 10:55
以下是引用vfdff在2006-8-6 11:22:06的发言:

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(50, 100);
glutInitWindowSize(200, 200);
glutCreateWindow("μú3.1??OpenGL3ìDò");
glutDisplayFunc(&myDisplay1);
//glutMainLoop(); //这个是重复绘制命令,使所有的图形循环绘制,否则绘出的图形一闪就不见了,它表示重新开始执行main()函数,如果前面没有条件语句能越过这句,那么这句后面的语句将都不会执行,一般放在main()的结尾处。在这里这个函数是多余的,要删除。
getch(); // 把这个注释掉之后是能正确的画两个图的!!

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(200, 100);
glutInitWindowSize(200, 200);
glutCreateWindow("μú3.2??OpenGL3ìDò");
glutDisplayFunc(&myDisplay2);
glutMainLoop();
return 0;
}

[此贴子已经被作者于2006-8-7 10:55:48编辑过]

#7
starrysky2006-08-07 11:58
以下是引用vfdff在2006-8-6 11:22:06的发言:

//画不出圆来是因为这个函数有问题

void myDisplay2(void)
{
int i;
i=36; // i 没有数值,怎么能画圆呢?
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON); //这个是画多边形的函数, i=36, 相当于在圆周上平均取36个点然后连接,画的是36边型, 近似于圆, i 越大,越接近于圆
for(i=0; i<N; ++i)
glVertex2f(R*cos(2*Pi/N*i), R*sin(2*Pi/N*i));
glEnd();
glFlush();
}

#8
starrysky2006-08-07 12:01
哈哈,终于看到一个用OpenGL的人了,感动啊
不过先建议你去看看这篇帖子的OpenGL篇
https://www.bc-cn.net/bbs/dispbbs.asp?boardID=225&ID=67741&page=1
#9
vfdff2006-08-11 12:06
谢谢 版主 的鼎立支持

我还想问下,难道图象窗口上就只能处理图形吗??
如果还想在程序中处理键盘响应 返回到 CMD 窗口是怎么实现的呢??
#10
starrysky2006-08-13 19:22
以下是引用vfdff在2006-8-11 12:06:34的发言:
谢谢 版主 的鼎立支持

我还想问下,难道图象窗口上就只能处理图形吗??
如果还想在程序中处理键盘响应 返回到 CMD 窗口是怎么实现的呢??

当然不是只能处理图形。
事实上很容易实现人机互动的。
下面这些代码就是实现键盘和鼠标响应的(C++BUILD 6.0中的格式)

程序代码:


void __fastcall TFormMain::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)     //键盘控制,


{
  if( Key == VK_UP    )
  {
    key_and_mouse_down=TRUE;
    glRotatef(-5, 1.0, 0.0, 0.0); //三维空间旋转函数
  }
  if( Key == VK_DOWN  )
  {
    key_and_mouse_down = TRUE;
    glRotatef( 5, 1.0, 0.0, 0.0);
  }
  if( Key == VK_LEFT  )
  {
    key_and_mouse_down = TRUE;
    glRotatef(-5, 0.0, 1.0, 0.0);
  }
  if( Key == VK_RIGHT )
  {
    key_and_mouse_down = TRUE;
    glRotatef( 5, 0.0, 1.0, 0.0);
  }
  if( Key == VK_ESCAPE )
  {
    glLoadIdentity();
    glRotatef(  15.0, 1.0, 0.0, 0.0 );
    glRotatef( -45.0, 0.0, 1.0, 0.0 );
    inclined = TRUE;
    key_and_mouse_down = FALSE;
  }
  if( Key == VK_ADD )
  {
    glScalef(1/zoom,1/zoom,1/zoom);
  }
  if( Key == VK_SUBTRACT  )
  {
    glScalef(zoom,zoom,zoom);
  }
}


void __fastcall TFormMain::FormMouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)//鼠标控制
{   if( Button==mbLeft )
  {
    Left_Button_Down   = TRUE;
    key_and_mouse_down = TRUE;
    x                  = X;
    y                  = Y;
  }
  else if( Button==mbRight )
  {
    glLoadIdentity();
    glRotatef(  30, 1.0, 0.0, 0.0 );
    glRotatef( 15, 0.0, 1.0, 0.0 );
    inclined           = TRUE;


    Left_Button_Down   = FALSE;
    key_and_mouse_down = FALSE;
  }
  else
    Left_Button_Down   = FALSE;
}
void __fastcall TFormMain::FormMouseUp(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{   Left_Button_Down = FALSE;
}
void __fastcall TFormMain::FormMouseMove(TObject *Sender,TShiftState Shift, int X, int Y)
{   if( Left_Button_Down==TRUE )
  {
    if( x != X )
        glRotatef( (X-x)/4, 0.0, 1.0, 0.0);
    if( y != Y )
        glRotatef( (Y-y)/4, 1.0, 0.0, 0.0);
    x = X;
    y = Y;
  }
}
void __fastcall TFormMain::FormMouseWheelDown(TObject *Sender,TShiftState Shift, TPoint &MousePos, bool &Handled)
{   glScalef( zoom,zoom,zoom );
}
void __fastcall TFormMain::FormMouseWheelUp(TObject *Sender,TShiftState Shift, TPoint &MousePos, bool &Handled)
{   glScalef( 1/zoom,1/zoom,1/zoom );
}

[此贴子已经被作者于2006-8-13 19:24:53编辑过]

#11
vfdff2007-06-05 21:06

谢谢斑竹

最近在研究vhdl 程序,很少来看了

1