算是精仿吧,毕竟不一样,少了第二次点鼠标左键确认绘图,这个可以加上的:

#include <iostream>
#include <windows.h>
#include <GL/glut.h>using namespace std ;
#pragma comment(lib, "glut32.lib")
int flag =0;
int flagagain=0;
POINT start,down;
void init(void)
{glClearColor(0.0, 0.0, 0.0, 0.0) ;glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0) ;
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT) ;if(flag){glColor3f(1.0, 1.0, 1.0) ;glBegin(GL_LINES);GLfloat oldx = start.x*1.00/400;GLfloat oldy = start.y*1.00/400;GLfloat newx = down.x*1.00/400;GLfloat newy = down.y*1.00/400;glVertex2f(oldx,oldy);glVertex2f(newx,newy);glutSwapBuffers();  }glEnd() ;glFlush() ;
}
void motion(int x, int y)
{if(!flag){start.x = x;start.y = 400-y;}down.x = x;down.y = 400-y;
}
void mouse(int button, int state, int x, int y)
{  if (button == GLUT_LEFT_BUTTON)  {  if (state == GLUT_DOWN)  {  glutMotionFunc(motion);//获得startflag=1;}  }
}
int main(int argc, char **argv)
{glutInit(&argc, argv) ;glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  glutInitWindowSize(400, 400) ;glutCreateWindow("I love OpenGl") ;init() ;glutDisplayFunc(display) ;glutMouseFunc(mouse);glutPassiveMotionFunc(motion);glutIdleFunc(display);  glutMainLoop();  return 0 ;
}

//喏 空心圆

#include <iostream>
#include <windows.h>
#include <GL/glut.h>
#include<math.h>
using namespace std ;
#define pi 3.1415926535843721
#pragma comment(lib, "glut32.lib")
int flag =0;
int flagagain=0;
int n;
POINT start,down;
float GetLength(POINT start,POINT down)
{return sqrt((start.x*1.00/400-down.x*1.00/400)*(start.x*1.00/400-down.x*1.00/400)+(start.y*1.00/400-down.y*1.00/400)*(start.y*1.00/400-down.y*1.00/400));
}
void init(void)
{glClearColor(0.0, 0.0, 0.0, 0.0) ;glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0) ;
}
void display(void)
{glClear(GL_COLOR_BUFFER_BIT) ;if(flag){glColor3f(1.0, 1.0, 1.0) ;glBegin(GL_LINES);GLfloat oldx = start.x*1.00/400;GLfloat oldy = start.y*1.00/400;GLfloat newx = down.x*1.00/400;GLfloat newy = down.y*1.00/400;glVertex2f(oldx,oldy);glVertex2f(newx,newy);glEnd();glBegin(GL_LINE_STRIP); glColor3f(1.0, 1.0, 1.0) ;n = 100;float R = GetLength(start,down);//半径cout<<R<<endl;//输出半径for (int i = 0; i < n; i++){glVertex2f(R*sin(2 * pi / n*i)+oldx, R*cos(2 * pi / n*i)+oldy);//平移到  以原来鼠标 左 键  为原点}glEnd();glutSwapBuffers();  }glEnd() ;glFlush() ;
}
void motion(int x, int y)
{if(!flag){start.x = x;start.y = 400-y;}down.x = x;down.y = 400-y;
}
void mouse(int button, int state, int x, int y)
{  if (button == GLUT_LEFT_BUTTON)  {  if (state == GLUT_DOWN)  {  glutMotionFunc(motion);//获得startflag=1;}  }
}
int main(int argc, char **argv)
{glutInit(&argc, argv) ;glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  glutInitWindowSize(400, 400) ;glutCreateWindow("I love OpenGl") ;init() ;glutDisplayFunc(display) ;glutMouseFunc(mouse);glutPassiveMotionFunc(motion);glutIdleFunc(display);  glutMainLoop();  return 0 ;
}

OpenGL仿作橡皮筋技术相关推荐

  1. OpenGL利用橡皮筋技术绘制简单图形(直线、圆、矩形、三角形)

    总结出以下经验: 想清空屏幕时,要用双缓冲模式,因为单缓冲模式清空时没反应,只会在下一次绘制时清空原来的图形.双缓冲模式可以立即清空屏幕. glutMotionFunc() 函数和 glutPassi ...

  2. OpenGL程序之用鼠标实现橡皮筋技术

    OpenGL程序之用鼠标实现橡皮筋技术 前言 一.用鼠标实现橡皮筋技术的实现思路 如何感知鼠标的点击和移动 如何解决坐标对应的问题并使之显示在界面上 整体的逻辑 二.用鼠标实现橡皮筋技术的实现框架 1 ...

  3. OpenGL 橡皮筋技术

    后天图形学考试,整理了下实验课上的OpenGL关于橡皮筋实验的代码. 简单实现了如下功能: 1.右键菜单功能响应 2.右键选择画折线或矩形,可保存(书上例子演变) 3.可选取画线或画矩形的颜色,线宽, ...

  4. OpenGL利用鼠标、键盘分别实现那些绘图软件中的橡皮筋技术

    橡皮筋技术: 如果大家用绘图软件画过直线,你就会发现选中那些直线.椭圆.矩形画图工具后,在画布上单击拖动就能画出我们所需尺寸的对应图形,十分方便,这就是所谓的橡皮筋技术. 实现橡皮筋技术的关键函数: ...

  5. 【计算机图形学】OpenGL橡皮筋技术

    文章目录 鼠标响应函数 鼠标橡皮筋技术 MousePlot MoseMove 双缓存技术 交互设备的输入主要由GLUT库实现 鼠标响应函数 鼠标橡皮筋技术 技术关键:控制图形随着鼠标移动不断变化(擦除 ...

  6. C#结合GDI+实现橡皮筋技术

    橡皮筋技术问题描述: 画线时: 在我放开鼠标左键确定之前会有一条虚线显示将来要 "画 "的那条线的情况.此时随着鼠标自由移动,虚线也跟着变长变短.就好像在拉橡皮筋. 当放开左键后. ...

  7. VC++ MFC橡皮筋技术

    在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移动 //OnLButtionDown        m_ptOrigin = m_ptEnd = point;  //OnMouseMove ...

  8. 橡皮筋技术画移动直线

    void CPicOneDlg::MoveLine(CPoint pt) {CDC *pDc = GetDC();pDc->SelectStockObject(NULL_BRUSH);CPen ...

  9. canvas之橡皮筋技术

    目录 一.使用橡皮筋技术绘制线段 二.使用橡皮筋技术绘制圆 三.使用橡皮筋技术绘制多边形 橡皮筋的特点是可以拉长与缩短,那么如何在canvas的绘图当中模仿这一特点呢?就是如何产生以下的这种类似橡皮筋 ...

最新文章

  1. portal认证 php,配置外置Portal认证示例(命令行)
  2. 一个android记事本的学习过程记录! (一)
  3. Linux内核网络数据包发送(一)
  4. mysql触发器和存储过程_MySql的存储过程和触发器
  5. jboss调jvm参数_在同一台机器上启动多个JBoss A-MQ JVM
  6. 从一个点云里面创建一个深度图
  7. I/O(输入/输出)---序列化与反序列化
  8. IIS服务器多站点 的 https证书使用443端口 解决方案
  9. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
  10. python中斜杠_Python中的正斜杠/与反斜杠\
  11. html表单导入图片,from 表单上传图片
  12. Android Espresso(一)——环境建立
  13. 利用Java的JavaMail发送邮件:企业邮箱版和个人邮箱客端版
  14. 集成Euraka的SpringBoot工程禁止输出日志:ConfigClusterResolver : Resolving eureka endpoints via configuration的方法
  15. 算法提高 盾神与积木游戏
  16. tortoisegit push 时提示 git did not exit cleanly (exit code 1)
  17. cacti 监控mysql 无数据_cacti无图无数据等常见问题排查
  18. maven上传Jar包到私服及从私服下载jar包相关配置
  19. Redis geo计算距离
  20. CF、MF、FM、FFM浅析

热门文章

  1. 优化器:torch.optim
  2. 删除某文件以外的文件
  3. BMC之ipmitool 命令收集
  4. 如何优雅的设计 React 组件
  5. 快递官网漏洞泄露 1400 万用户信息
  6. svn+http+ad域
  7. linux下使用wget下载jdk
  8. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
  9. 基于heartbeat v1配置mysql和httpd的高可用双主模型
  10. 为什么我们做不到【员工篇】作者:金刚波