3,882
社区成员




int main(int argc,char** argv)
{
int a=1,b=2;
//turl.pen=DOWN;
step=0.001;
theta=0.0;
/*Star_Poin.x=0.0;
Star_Poin.y=0.0;
Term_Poin.x=0.0;
Term_Poin.y=0.0;*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,90);
glutCreateWindow("张继伟;上机号:23;设计题目:海龟作图");
glutReshapeFunc(MyReshape);
//glutKeyboardFunc(myKeyboard);
glutCreateMenu(MyMenu);
a=glutCreateMenu(MyMenu);
glutAddMenuEntry("直线",1);
glutAddMenuEntry("矩形",2);
glutAddMenuEntry("圆",3);
b=glutCreateMenu(MyMenu);
glutAddMenuEntry("红色",4);
glutAddMenuEntry("黑色",5);
glutAddMenuEntry("蓝色",6);
glutAddMenuEntry("黄色",7);
glutCreateMenu(MyMenu);
glutAddMenuEntry("开始",0);
glutAddSubMenu("图形",a);
glutAddSubMenu("颜色",b);
glutAddMenuEntry("结束",8);
glutAddMenuEntry("清屏",9);
glutAddMenuEntry("退出",10);
glutAttachMenu(GLUT_RIGHT_BUTTON);
init();
glutDisplayFunc(display);
glutMainLoop();
return (0);
}
#include <math.h>
#include <iostream>
#include <GL\glut.h>
#include <stdlib.h>
using namespace std;
#define UP 0
#define DOWN 1
#define PI 3.1415
typedef int penState;
static float a[3];
int w,h;//窗口的宽和高,定义成全局变量是为了容易传递
int g_Menu = 0;
typedef struct
{
float x;
float y;
}aPoint;//(x,y)为坐标
typedef struct
{
penState pen;
aPoint Pos;//海龟的当前位置
}Turl;
Turl turl;
float theta;//海龟朝向
static aPoint Star_Poin,Term_Poin;
float step;
void start() //glClear(GL_COLOR_BUFFER_BIT);
{
glClear(GL_COLOR_BUFFER_BIT);
}
void flush() // glFlush();
{
glFlush();
}
/***************************************************************
海龟的实现部分{glBegin()~glEnd()}
****************************************************************/
void DisplayTur()//海龟
{
theta=(Term_Poin.y-Star_Poin.y)/(Term_Poin.x-Star_Poin.x);
glBegin(GL_POLYGON);
//glColor3f(a[0]-0.1,a[1]-0.1,a[2]);
glVertex2f(Term_Poin.x+0.1*cos(theta+PI/2),Term_Poin.y+0.1*sin(theta+PI/2));
//glColor3f(a[0],a[1],a[2]);
glVertex2f(Term_Poin.x+0.05*cos(theta+7*PI/6),Term_Poin.y+0.05*sin(theta+7*PI/6));
glVertex2f(Term_Poin.x+0.05*cos(theta+11*PI/6),Term_Poin.y+0.05*sin(theta+11*PI/6));
glEnd();//theta为海龟的朝向
glFlush();
// glClear(
}
/*********************************************************************
绘制圆的函数:{glBegin()~glEnd()}
******************************************************/
void DisplayCir()
{
//DisplayTur();
//rad 为圆的直径
float rad=sqrt((Term_Poin.x-Star_Poin.x)*(Term_Poin.x-Star_Poin.x)+(Term_Poin.y-Star_Poin.y)*(Term_Poin.y-Star_Poin.y));
for(theta=0;theta <=2*PI;theta+=step)//only when step smaller than 0.0005,obvios the effort will be.
{
/*Term_Poin.x=Star_Poin.x+rad*cos(theta);
Term_Poin.y=Star_Poin.y+rad*sin(theta);
DisplayTur();*/
//start();
glBegin(GL_POINTS);
glVertex2f(Star_Poin.x+rad*cos(theta),Star_Poin.y+rad*sin(theta));
//glVertex2f(Star_Poin.x+rad*cos(theta+0.0001),Star_Poin.y+rad*sin(theta+0.0001));
glEnd();
}
}
/***********************************************************
绘制矩形的函数:{glBegin()~glEnd()}
*************************************************************/
void DisplayRec()
{
if(Star_Poin.x <=Term_Poin.x)
{
float i;
for(i=Star_Poin.x;i <=Term_Poin.x;i+=step)//for1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for(i=Star_Poin.y;i <=Term_Poin.y;i+=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for(i=Term_Poin.x;i>=Star_Poin.x;i-=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i>=Star_Poin.y;i-=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
else
{
float i;
for(i=Star_Poin.x;i>=Term_Poin.x;i-=step)//for 1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for( i=Star_Poin.y;i>=Term_Poin.y;i-=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for( i=Term_Poin.x;i <=Star_Poin.x;i+=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i <=Star_Poin.y;i+=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
}
/***********************************************
直线绘制函数{glBegin()~glEnd()}
***********************************************/
void DisplayLin()
{
start();
// DisplayTur();
//for(float i=0.0;i <=100;i+=0.05){
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,Term_Poin.y);
glEnd();
//}
glFlush();
}
void MyMouse(int button,int state,int x,int y)//把两个坐标按照先后给开始和结束的点
{
static bool first=true;//用来实现获取两个鼠标坐标标志
//glutReshapeFunc(MyReshape);
if(state==GLUT_DOWN&&button==GLUT_LEFT_BUTTON)
{
if(first)
{
Star_Poin.x=-(float)2*(w/2-x)/w;
Star_Poin.y=-(float)2*(y-h/2)/h;
first=!first;
cout <<"b:(" <<Star_Poin.x <<"," <<Star_Poin.y <<")" <<endl;
}
else
{
Term_Poin.x=-(float)2*(w/2-x)/w;
Term_Poin.y=-(float)2*(y-h/2)/h;
cout <<"a:(" <<Term_Poin.x <<"," <<Term_Poin.y <<")" <<endl;
first=!first;
}
}
glutPostRedisplay();
// first=true;
}
void MyReshape(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
w=width;
h=height;
}
/************************************************************
菜单创建函数,主程序及大部分代码应该在这个函数中实现
************************************************************/
void MyMenu(int value)
{
g_Menu = value;
if(value==0)
{
glutMouseFunc(MyMouse);
}
if(value==4)//红色
{
a[0]=1.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==5)//黑色
{
a[0]=0.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==6)//蓝色
{
a[0]=0.5;
a[1]=0.5;
a[2]=0.5;
glColor3f(a[0],a[1],a[2]);
}
if(value==7)//黄色
{
a[0]=1.0;
a[1]=1.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
}
if(value==10)
{
exit(0);
}
}
void init()
{
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(a[0],a[1],a[2]);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
void display()
{
start();
DisplayTur();
if(g_Menu==1)
DisplayLin();
if(g_Menu==2)
DisplayRec();
if(g_Menu==3)
DisplayCir();
flush();
}