计算机图形学OpenGLC++实现: 橡皮筋技术实现折线和矩形的鼠标实现(附源码)

2023-11-16

废话不多说,直接开始

下列是会使用到的函数简单介绍:

  • 初始化背景 void Initial(void)
  • 改变窗口大小 void ChangeSize(int w,int h)
  • 菜单响应函数 chooseWay(int value)
  • 清除当前已经画的图形 void clear(void)
  • 画图函数 void Display(void)
  • 鼠标点击事件响应函数
    void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
  • 鼠标跟踪函数 void PassiveMouseMove(GLint xMouse,GLint yMouse)

首先,让我们看看主函数

int main(int argc,char* argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    //创建窗口,并设置大小为长400宽300
    glutInitWindowSize(400,300);
    glutInitWindowPosition(100,100);
    glutCreateWindow("橡皮筋技术");
	
	//向鼠标右键注册菜单-选择画折线还是矩形
    glutCreateMenu(chooseWay);				//菜单函数
    glutAddMenuEntry("BrokenLine", 1);		//折线选项
    glutAddMenuEntry("Actangle", 2);		//矩形选项
    glutAddMenuEntry("Clear", 0);			//清空选项
    glutAttachMenu(GLUT_RIGHT_BUTTON);		//将该菜单绑定在右键
	Initial();								//初始化函数
	glutReshapeFunc(ChangeSize);			//调用改变窗口函数
    glutDisplayFunc(Display);				//调用画图函数
    glutMouseFunc(MousePlot);				//调用鼠标点击事件函数
    glutPassiveMotionFunc(PassiveMouseMove);//调用鼠标追踪事件函数
    glutMainLoop();

    return 0;
}

初始化函数,glClearColor函数向缓存写入颜色值

//初始化函数
void Initial(void)
{
    glClearColor(0.5f,0.5f,0.75f,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 clear(void)
{
    int flag = iPointNum;
    iPointNum = 0;
    for (int i = 0; i < flag; ++i)
    {
        x[i] = 0;
        y[i] = 0;
    }
    glutPostRedisplay();				//清除后重画
}

菜单选择函数

void chooseWay(int value)
{
    switch (value)
    {
    case 0:clear(); break;
    case 1:choose=1; break;		//画折线
    case 2:choose=2; break;		//画矩形
    default:
        choose = 1;break;		//默认画折线
    }
}

鼠标点击响应函数

void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
    if (choose == 1)				//画折线
    {
        if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)	
        //左键按下判定
        {
            if (iPointNum == 0)
            //已经点击的点数
            {
                x[iPointNum] = xMouse;
                y[iPointNum] = winHeight - yMouse;		//坐标转换
                iPointNum += 1;
            }
            else
            {
                x[iPointNum] = xMouse;
                y[iPointNum] = winHeight - yMouse;
                iPointNum += 1;
                glutPostRedisplay();
            }
        }
    }
    if (choose == 2)			//画矩形
    {
        if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
        {
            if (iPointNum== 0||iPointNum==2)
            {
                x[0] = xMouse;
                y[0] = winHeight - yMouse;
                iPointNum = 1;
            }
            else
            {
                x[1] = xMouse;
                y[1] = winHeight - yMouse;
                iPointNum = 2;
                glutPostRedisplay();
            }
        }
    }
}

鼠标跟踪函数

void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
    if (choose == 1 && iPointNum >=1)
    {
        x[iPointNum] = xMouse;
        y[iPointNum] = winHeight - yMouse;
        glutPostRedisplay();
    }
    if(choose==2&&iPointNum==1)
    {
        x[iPointNum]=xMouse;
        y[iPointNum]=winHeight-yMouse;
        glutPostRedisplay();
    }
}

画图函数

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    if(choose==1)
    {
        if (iPointNum >= 1)
        {
            glColor3f(1.0f, 0.0f, 0.0f);
            int flag = iPointNum;
            glBegin(GL_LINE_STRIP);
            while (flag)
            {
                glVertex2f(x[flag], y[flag]);
                glVertex2f(x[flag - 1], y[flag - 1]);
                flag--;
            }
            glEnd();
        }
    }
    //画矩形
    if (choose == 2)
    {
        if (iPointNum >=1)
        {
            glColor3f(1.0f, 0.0f, 0.0f);
            glBegin(GL_QUADS);
            glVertex2f(x[0], y[0]);
            glVertex2f(x[0], y[1]);
            glVertex2f(x[1], y[1]);
            glVertex2f(x[1], y[0]);
            glEnd();
        }
    }
    glutSwapBuffers();
}

把上述拼接起来就可以完整运行,希望对你有所帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图形学OpenGLC++实现: 橡皮筋技术实现折线和矩形的鼠标实现(附源码) 的相关文章

随机推荐

  • PCL MeanShift点云聚类(C++详细过程版)

    目录 一 算法原理 1 原理概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 测试数据 本文由CSDN点云侠原创 爬虫网站请自重原文链接 一 算法原理 1 原理概述 均值漂移算法是一种非参数聚类技术 它不需要预先知道聚类的数
  • HTML、PHP实战:搭建一个网页登录页面。

    一 实验环境 MySQL5 7 26 FTP0 9 60 Apache2 4 39 我这里用的是PHPstudy小皮一键搭建的 数据库 二 登录页面 登录页面前端代码 文件名 denglu html
  • 人工智能学习笔记(一)Agent

    智能agent 开篇前言 agent的分类 1 简单反射agent 2 基于状态的反射agent 3 基于目标的agent 4 基于效用的agent 5 学习agent Exploration vs Exploitation 开篇前言 这段
  • 一文读懂什么是DHCP以及DHCP的功能特点

    随着企业中网络结构的日益复杂 接入终端的急剧增加 传统的IP分配方式已经无法满足日常工作需求 DHCP的出现有效解决了IP地址分配难题 本文中科三方针对什么是DHCP以及DHCP的功能特点做下介绍 什么是DHCP DHCP 全称Dynami
  • Python+Excel筛选未提交人员

    起因 学校给了表格让我们班长统计信息 可以用腾讯大大的TIM协作办公 让大家自己填 感觉方便了很多 然而 信息一旦变多而且顺序又没有固定 到后期想要知道未填信息的同学 这就难受了 只能找到班级名单 一个一个对照着找出未提交人员 日后此类事情
  • OCR入门教程系列(一):OCR基础导论

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • 【LVGL学习笔记】image图像相关接口

    数据结构如下 Data of image typedef struct lv obj t obj const void src 图像源 指向数组 文件或符号的指针 lv point t offset lv coord t w 宽度 lv c
  • 计算机硬盘模式,硬盘三种模式的含义-电脑自学网

    硬盘三种模式的含义 NORMAL 普通模式 是最早的IDE方式 以此方式访问BIOS和IDE控制器对参数不做任何转换 该模式支持的最大柱面数为1024 最大磁头数为16 最大扇区为63 每个扇区字节数为512 因此这种模式所支持的硬盘最大容
  • Open3D点云处理算法最全合集

    Open3D点云处理算法最全合集 致力于搜集可运行 可视化较好的Open3D算法 持续更新中 1 Open3D 点云读取及可视化 离群点去除 2 Open3D 点云体素格下采样 3 Open3D 点云KdTree建立 3种近邻搜索及结果可视
  • 系统开发与运行

    系统开发与运行 系统分析与设计 需求分析 需求工程 结构化分析与设计 测试基础知识 系统运行与维护 软件架构介绍 系统分析概述 系统分析是一种问题求解技术 它将一个系统分解成各个组成部分 目的是研究各个部分如何工作 交互 以实现其系统目标
  • set_new_handler(0)是什么意思?有什么用?

    出自 STL源码剖析 第45页中有一行代码set new handler 0 源代码 inline T allocate ptrdiff t size T std set new handler 0 T tmp T operator new
  • C#中File FileInfo 和Directory DirectoryInfo 类的区别

    老师在讲C 文件操作的时候讲的个类 功能类似 但用法有区别 他们都存在于systerm IO命名空间下 File和Directory的方法都是静态方法 FileInfo和DirectoryInfo的方法都是普通方法 老师建议是如果你要在某个
  • Python之PyAudio使用

    PyAudio 播放 录音 回放 回调方法播放 非阻塞回调 PyAudio 使用这个可以进行录音 播放 生成wav文件等等 播放 coding utf 8 引入库 import pyaudio import wave import sys
  • aiohttp 异步http请求-12.aiohttp 请求生命周期(和requests库有什么不一样?)

    前言 aiohttp 请求生命周期对比requests库使用的区别 aiohttp 客户端 API 当你第一次使用 aiohttp 时 你会注意到一个简单的 HTTP 请求不是一次执行的 而是最多三个步骤 async with aiohtt
  • dac0832三角波c语言程序,单片机控制DAC0832输出正弦波三角波汇编程序

    org 0000h LJMP MAIN ORG 0003H LJMP L0 MAIN MOV R2 0aH 调幅倍数 MOV R4 01H 增减选择 MOV R5 01H pp SETB EA SETB EX0 延时计数个数 MOV A 0
  • 渗透系列之排序处产生的SQL注入问题

    1 在日常的测试过程中 发现系统的排序功能最容易产生sql注入 我们需要重点关注业务系统的排序功能 一般功能点对应这类字段 sortField sortOrder order orderby等 举个排序的SQL注入案例 发现系统的一个查询功
  • 2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结

    2017 2018 1 20155227 信息安全系统设计基础 第十三周学习总结 找出全书你认为最重要的一章 深入重新学习一下 要求 期末占10分 完成这一章所有习题 详细总结本章要点 给你的结对学习搭档讲解你的总结并获取反馈 我选择教材第
  • 冯乐乐之六,基础光照模型

    需要理清的概念 兰伯特 半兰伯特 冯模型 布林冯模型 高光反射specular 代表物体表面反射光线 漫反射diffuse 代表吸收然后散射出表面的光线 环境光ambient 自发光emissive 漫反射 漫反射从任何方向看都是一致的 漫
  • 科学推理~

    科学推理 物理 1 力学 重力 重力并不是指向地心的 只有赤道可以 弹力 重点 判断弹力方向 相互作用力 摩擦力 静摩擦力 滑动摩擦力 注意 最大静摩擦力默认等于滑动摩擦力 压强 固体压强 液体压强 连通器 气体压强 气体对外做功 T 下降
  • 计算机图形学OpenGLC++实现: 橡皮筋技术实现折线和矩形的鼠标实现(附源码)

    废话不多说 直接开始 下列是会使用到的函数简单介绍 初始化背景 void Initial void 改变窗口大小 void ChangeSize int w int h 菜单响应函数 chooseWay int value 清除当前已经画的