#include "onMidPointEllispe.h"
/**************************************************
* 已知椭圆的长短轴a,b
* 根据椭圆的中点Bresenham算法,扫描转换椭圆
* 以glBegin(GL_POINTS);glEnd();方式,绘制椭圆
***************************************************/
void onMidPointEllispe(int a,int b){
int x,y;
float d1,d2;
glBegin(GL_POINTS);
x=0;y=b;
d1=b*b+a*a*(-b+0.25);
glVertex2i(x,y);
glVertex2i(-x,-y);
glVertex2i(-x,y);
glVertex2i(x,-y);
while(b*b*(x+1)<a*a*(y-0.5))
{
if(d1<=0){
d1+=b*b*(2*x+3);
x++;
}
else{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++; y--;
}
glVertex2f(x,y);
glVertex2f(-x,-y);
glVertex2f(-x,y);
glVertex2f(x,-y);
}/*while上半部分*/
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>0)
{
if(d2<=0){
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++; y--;
}
else{
d2+=a*a*(-2*y+3);
y--;
}
glVertex2f(x,y);
glVertex2f(-x,-y);
glVertex2f(-x,y);
glVertex2f(x,-y);
}
glEnd();
}
void drawRect(vector<Point> p){
int x1,y1,x2,y2;
x1 = p[0].x;
y1 = p[0].y;
x2 = p[1].x;
y2 = p[1].y;
if(iPointNum == 1){
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINE_STRIP);
glVertex2i(x1,y1);
glVertex2i(x1,y2);
glVertex2i(x2,y2);
glVertex2i(x2,y1);
glVertex2i(x1,y1);
glEnd();
point center;
center.x = (x1 + x2)/2;
center.y = (y1 + y2)/2;
glTranslated(center.x, center.y, 0.0);
int a = abs(x1-x2)/2;
int b = abs(y1-y2)/2;
glColor3f(0.0f, 0.0f, 1.0f);
onMidPointEllispe(a, b);
glTranslated(-center.x, -center.y, 0.0);
}
if(iPointNum == 0 || iPointNum == 2){
point center;
center.x = (x1 + x2)/2;
center.y = (y1 + y2)/2;
glTranslated(center.x, center.y, 0.0);
int a = abs(x1-x2)/2;
int b = abs(y1-y2)/2;
glColor3f(0.0f, 0.0f, 1.0f);
onMidPointEllispe(a, b);
glTranslated(-center.x, -center.y, 0.0);
p.clear();
x1 = 0, y1 = 0, x2 = 0 , y2 = 0;
iPointNum = 0;
}
p.clear();
}
void init(){
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置背景颜色为白色
}
void ChangeSize(int w,int h)
{
winWidth=w;
winHeight=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //调用单位矩阵,去除以前投影参数设置
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
void Display(){
glClear(GL_COLOR_BUFFER_BIT); //用背景色填充窗口
glColor3f(0.0f, 0.0f, 1.0f); //指定绘图颜色
drawRect(p);
// glFlush();
glutSwapBuffers(); //交换缓冲区
}
void ProcessMenu(int value){
if(value == 1){
cout << "菜单选择“椭圆”,可以绘制\n" << endl;
draw = true;
}
else{
cout << "菜单选择“退出”,不可绘制\n" << endl;
draw = false;
square = false;
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
}
void createMenus(){
glutCreateMenu(ProcessMenu); //创建菜单,ProcessMenu处理菜单事件
glutAddMenuEntry("Ellispe", 1); //给菜单增加“椭圆”条目
glutAddMenuEntry("exit", 0); //给菜单增加“退出”条目
glutAttachMenu(GLUT_RIGHT_BUTTON); //把菜单和鼠标右键关联
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN && draw == true)
{
if (iPointNum == 0 || iPointNum == 2)
{
p[0].x = xMouse;
p[0].y = winHeight - yMouse;
iPointNum = 1;
cout << "鼠标点击,开始绘制\n" <<endl;
}
else
{
cout << "鼠标点击,结束绘制\n" <<endl;
if(square == false){
p[1].x = xMouse;
p[1].y = winHeight - yMouse;
iPointNum = 2;
glutPostRedisplay();
}
else {
iPointNum = 2;
glutPostRedisplay();
}
}
}
}
void PassiveMouseMove(GLint xMouse, GLint yMouse)
{
if(iPointNum == 1 && draw == true)
{
if(square == false){
p[1].x = xMouse;
p[1].y = winHeight-yMouse;
glutPostRedisplay();
}
else{
p[1].x = xMouse;
p[1].y = winHeight-yMouse;
int s = abs(p[1].x-p[0].x);
int l = abs(p[1].y-p[0].y);
if(s != l){
s = s<l ? s : l;
if(p[1].x <= p[0].x && p[1].y <= p[0].y){
p[1].x = p[0].x - s;
p[1].y = p[0].y - s;
}
else if(p[1].x <= p[0].x && p[1].y > p[0].y){
p[1].x = p[0].x - s;
p[1].y = p[0].y + s;
}
else if(p[1].x > p[0].x && p[1].y <= p[0].y){
p[1].x = p[0].x + s;
p[1].y = p[0].y - s;
}
else if(p[1].x > p[0].x && p[1].y > p[0].y){
p[1].x = p[0].x + s;
p[1].y = p[0].y + s;
}
}
glutPostRedisplay();
}
}
}
void KeyBoard(unsigned char key, int xMouse, int yMouse){
if(key == 's' && glutGetModifiers() & GLUT_ACTIVE_SHIFT){
square = true;
cout << "shift 按下,绘制正圆\n" << endl;
}
else{
square = false;
cout << "shift 取消,绘制椭圆\n" << endl;
}
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); //使用双缓存及RGB模式
glutInitWindowPosition(100, 100); //指定窗口位置
glutInitWindowSize(600, 500); //指定窗口大小
glutCreateWindow("橡皮筋交互式椭圆绘制");
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
glutPassiveMotionFunc(PassiveMouseMove);
glutKeyboardFunc(KeyBoard);
createMenus();
init();
glutMainLoop(); //启动主事件循环
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
代码和截图.zip (9个子文件)
运行截图
1671263973731.png 15KB
1671267192528.png 13KB
1671263973723.png 12KB
1671263973706.png 10KB
1671267228709.png 13KB
1671267307405.png 15KB
1671263973716.png 11KB
代码
onMidPointEllispe.cpp 5KB
onMidPointEllispe.h 465B
共 9 条
- 1
资源评论
于此等妳--《--{@
- 粉丝: 73
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功