标题:GL 画图方式-->baidu转移
只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
 问题点数:0 回复次数:10 
GL 画图方式-->baidu转移

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(); 处停下拉,不管怎么按键,就是不出 圆????

搜索更多相关主题的帖子: 画图方式 baidu const include void 
2006-08-06 11:22
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
头文件加个 stdio.h

看看?

个人网站 -  http://.h001.
2006-08-06 13:27
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
getch(); 的头文件是 <conio.h>
而且我试过 还是一样的效果,没有反应!!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2006-08-06 16:33
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
不好意思,来晚了点。
我先看看。

我的征途是星辰大海
2006-08-07 10:43
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
以下是引用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();
}


我的征途是星辰大海
2006-08-07 10:49
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
以下是引用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编辑过]


我的征途是星辰大海
2006-08-07 10:55
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
以下是引用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();
}


我的征途是星辰大海
2006-08-07 11:58
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
哈哈,终于看到一个用OpenGL的人了,感动啊
不过先建议你去看看这篇帖子的OpenGL篇
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=225&ID=67741&page=1

我的征途是星辰大海
2006-08-07 12:01
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
谢谢 版主 的鼎立支持

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

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2006-08-11 12:06
starrysky
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
以下是引用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编辑过]


我的征途是星辰大海
2006-08-13 19:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-82382-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042683 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved