#include <glut.h>
#include <math.h>
#include <stdio.h>
#include <Windows.h>
const GLdouble Pi = 3.1415926536;
BOOL LButtonDown = FALSE, LButtonUp = FALSE;
int x_0, y_0, x_1, y_1;
int X;
float Y, k, dx, dy;
int drawAlgo = 1;
int a, b, dt1, dt2, d, ystp = 1;
int iTag = 0;
int tx, ty, inc1, inc2, curx, cury;
void Swap(int &a, int &b) //交换函数
{
int t;
t = a;
a = b;
b = t;
}
void Initialize() // 初始化
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0, 600, 0, 600);
}
void mainMenu(int id) //主菜单
{
drawAlgo = id;
}
void colorMenu(int id) //颜色菜单
{
switch (id)
{
case 1:
glColor3f(1.0, 0.0, 0.0);
break;
case 2:
glColor3f(0.0, 1.0, 0.0);
break;
case 3:
glColor3f(0.0, 0.0, 1.0);
break;
}
}
void weightMenu(int id) //线段粗细菜单
{
glPointSize((float)id);
}
void dda(int x_1, int y_1,int x_0,int y_0)
{
Y = y_0;
dx = x_1 - x_0; dy = y_1 - y_0;
k = dy / dx;
if (x_0 <= x_1)
{
for (X = x_0; X <= x_1; X++)
{
glBegin(GL_POINTS);
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
Y += k;
}
}
else
{
for (X = x_0; X >= x_1; X--)
{
glBegin(GL_POINTS);
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
Y -= k;
}
}
LButtonDown = FALSE;
LButtonUp = FALSE;
}
void midfuc(int x_1, int y_1, int x_0, int y_0)
{
glBegin(GL_POINTS); // 画终点
glVertex2f(x_1, 600 - y_1);
glEnd();
glFlush();
if (abs(x_1 - x_0) > abs(y_1 - y_0)) // 斜率的绝对值小于1的场合
{
if (x_0 > x_1) // 如果是从右往左画,交换始点和终点
{
X = x_0; x_0 = x_1; x_1 = X;
Y = y_0; y_0 = y_1; y_1 = Y;
}
a = y_0 - y_1;
b = x_1 - x_0; // 此时b一定为正
if (a > 0) // 如果斜率为负
{
a = -a; ystp = -1;
}
else // 如果斜率不为负
{
ystp = 1;
}
d = (a << 1) + b; // 判别式
dt1 = a << 1;
dt2 = (a + b) << 1;
X = x_0;
Y = y_0;
glBegin(GL_POINTS); // 画始点
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
while (X < x_1) // 开始画线(始点和终点之间的点)
{
if (d < 0)
{
X++;
Y += ystp;
d += dt2;
}
else
{
X++;
d += dt1;
}
glBegin(GL_POINTS);
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
}
LButtonDown = FALSE;
LButtonUp = FALSE;
}
else // 斜率绝对值大于等于1的场合
{
if (y_0 > y_1) // 如果从下往上画,交换始点和终点
{
X = x_0; x_0 = x_1; x_1 = X;
Y = y_0; y_0 = y_1; y_1 = Y;
}
a = x_0 - x_1;
b = y_1 - y_0; // b一定大于0
if (a > 0) // 如果从右往左画
{
a = -a;
ystp = -1;
}
else // 如果从左往右画
{
ystp = 1;
}
d = (a << 1) + b; // 判别式
dt1 = a << 1;
dt2 = (a + b) << 1;
X = x_0;
Y = y_0;
glBegin(GL_POINTS);
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
while (Y < y_1)
{
if (d < 0)
{
Y++; X += ystp; d += dt2;
}
else
{
Y++;
d += dt1;
}
glBegin(GL_POINTS);
glVertex2f(X, 600 - Y);
glEnd();
glFlush();
}
}
LButtonDown = FALSE; // 重置鼠标点击
LButtonUp = FALSE;
}
void Bresenham(int x_1, int y_1, int x_0, int y_0)
{
glBegin(GL_POINTS); // 画终点
glVertex2f(x_1, 600 - y_1);
glEnd();
glFlush();
if (x_0 == x_1 && y_0 == y_1) // 始点和终点重合时,结束画线
{
return;
}
dx = abs(x_1 - x_0); dy = abs(y_1 - y_0);
if (dx < dy) // 如果斜率绝对值大于1
{
iTag = 1; // iTag标记画线斜率是否大于1,如果是就变成其反函数
Swap(x_1, y_1);
Swap(x_0, y_0);
int temp = dx; dx = dy; dy = temp;
}
tx = (x_1 - x_0) > 0 ? 1 : -1; // 如果从左往右画,tx为1,否则是-1
ty = (y_1 - y_0) > 0 ? 1 : -1; // 如果从上往下画,ty为1,否则是-1
curx = x_0; // 记录变换后的始点
cury = y_0;
inc1 = 2 * dy; // 当判别式小于等于0时,d的增量
inc2 = 2 * (dy - dx); // 当判别式大于等于0时,d的增量
d = inc1 - dx; // 始点的判别量d0
while (curx != x_1)
{
curx += tx; // 横坐标步进1或-1
if (d < 0)
{
d += inc1;
}
else
{
cury += ty;
d += inc2;
}
if (iTag) // 斜率大于1的场合
{
glBegin(GL_POINTS);
glVertex2f(cury, 600 - curx);
glEnd();
glFlush();
}
else // 斜率小于等于1的场合
{
glBegin(GL_POINTS);
glVertex2f(curx, 600 - cury);
glEnd();
glFlush();
}
}
LButtonDown = FALSE; // 重置鼠标单击和iTag
LButtonUp = FALSE;
iTag = 0;
}
void myMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) // 读取始点坐标(左键按下)
{
LButtonDown = TRUE;
x_0 = x; y_0 = y;
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) // 读取终点坐标(左键松开)
{
LButtonUp = TRUE;
x_1 = x; y_1 = y;
}
if (LButtonDown && LButtonUp)
{
if (drawAlgo == 1) // DDA算法
{
dda(x_1, y_1, x_0, y_0);
}
else if (drawAlgo == 2) // 中点画线法
{
midfuc(x_1, y_1, x_0, y_0);
}
else // Bresenham算法
{
Bresenham(x_1, y_1, x_0, y_0);
}
}
}
void myDisplay(void)
{
int i;
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
for (i = 0; i <= 8; ++i)
{
glColor3f(i & 0x04, i & 0x02, i & 0x01);
glVertex2f(cos(i*Pi / 4), sin(i*Pi / 4));
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); // 对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // 设置显示方式(RGB颜色,单缓冲)
glutInitWindowSize(600, 600); // 设置窗口的尺寸
glutInitWindowPosition(400, 150); // 设置窗口在屏幕中的位置
glutCreateWindow("OpenGL"); // 根据前面设置的信息创建窗口。参数将被作为窗口的标题
Initialize();
glutDisplayFunc(&myDisplay);
glutMouseFunc(&myMouse);
int ColorMenu = glutCreateMenu(colorMenu); //颜色菜单创建
glutAddMenuEntry("红", 1);
glutAddMenuEntry("绿", 2);
glutAddMenuEntry("蓝", 3);
int WeightMenu = glutCreateMenu(weightMenu); //线段粗细菜单创建
glutAddMenuEntry("1px", 1);
glutAddMenuEntry("2px(默认)", 2);
glutAddMenuEntry("3px", 3);
glutAddMenuEntry("4px", 4);
glutAddMenuEntry("5px", 5);
glutAddMenuEntry("6px", 6);
glutAddMenuEntry("7px", 7);
glutAddMenuEntry("8px", 8);
glutAddMenuEntry("9px", 9);
glutAddMenuEntry("10px", 10);
glutCreateMenu(mainMenu); //创建主菜单,并使用回调函数mainMenu
glutAddMenuEntry("DDA(默认)", 1); //加入菜单项
glutAddMenuEntry("中点画线法", 2);
glutAddMenuEntry("Bresenham算法", 3);
glutAddSubMenu("画线颜色", ColorMenu);
glutAddSubMenu("画线粗细", WeightMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON); //把菜单与鼠标右键相关联,则点击右键会出现菜单
glutMainLoop(); // 显示窗口,并且等待窗口关闭后才会返回
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
opengl 3种函数画线.rar_OPENGL画图_opengl 动态画线_opengl画直线

共20个文件
tlog:6个
pdb:2个
sln:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
99 浏览量
2022-09-20
23:58:09
上传
评论
收藏 6.43MB RAR 举报
温馨提示
使用opengl画线,dda算法,中点算法,bresenham 算法,右键菜单实现线段颜色粗细的选择
资源详情
资源评论
资源推荐
收起资源包目录





























共 20 条
- 1




















局外狗
- 粉丝: 48
- 资源: 1万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制

评论0