openGL-梁友栋-Barsky算法
代码
//
// main.cpp
// hw_1_cut_line
//
// Created by 窦志扬 on 2018/3/11.
// Copyright © 2018年 窦志扬. All rights reserved.
//#include <GLUT/GLUT.h>
#include <iostream>
using namespace std;
int x1,y1,x2,y2; //描述构成直线的两个端点
int wmin = 200 ,wmax = 400;//描述裁剪区间的大小
int hmin = 200 ,hmax = 400; //这里为了简化采用的是硬编码
int flag = 1; //用于记录用户点击的次数,单次画点,双次画线。
int window_size=600; //这是我们显示界面的大小
int cut_judge(float p,float q, float&u1, float &u2);
void LYD_Barsky(float x1,float y1, float x2,float y2,float ytop,float ybuttom,float xleft,float xright){/*函数说明:仅需要除法、不需要浮点运算。实现对区域内的直线进行剪裁的操作。这里用到直线的参数方程。*其中我们正负dx dy就是p类参数*而x1 - wmin,wmax-x1....代表q类参数*/float u1 = 0.0,u2 = 1.0;float dx = x2 - x1,dy = y2 - y1;if (cut_judge(-dx, x1 - xleft, u1,u2)) {if (cut_judge(dx,xright-x1 ,u1,u2)) {if (cut_judge(-dy, y1 - ybuttom, u1, u2)) {if (cut_judge(dy, ytop - y1, u1, u2)) {if (u2< 1.0) {x2 = x1 + u2*dx;y2 = y1+ u2*dy;}if (u1>0.0) {x1 = x1 + u1*dx;y1 = y1+ u1*dy;}glBegin(GL_LINES);glColor3f(0.0,1.0,0.0);glVertex2f(x1, 400-y1+200);glVertex2f(x2, 400-y2+200);glEnd();glFlush();}}}}
}int cut_judge(float p,float q, float&u1, float &u2){/*函数说明:对p,q进行判断同时根据判断刷新u1 u2注意u1 u2是传值进入*/float u;int res =1;if (p > 0.0) {u = q/p;if (u < u1){res = 0;}else if(u<u2){u2 = u;}}else if(p < 0.0){u = q/p;if (u > u2){res =0;}else if (u >u1){u1 = u;}}else{if (q<0.0){res = 0;}}return res;
}void InitEnvironment()
{glClearColor(0.0,0.0,0.0,0);glClear(GL_COLOR_BUFFER_BIT);glPointSize(7);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluOrtho2D(0,window_size,0,window_size);
}void myDisplay(void)
{glClear(GL_COLOR_BUFFER_BIT);// 首先绘制裁剪区域glColor3f(0.98f, 0.625f, 0.12f);//绘制矩形,第一对坐标表示左上角,第二对表示右下角glRectf(wmin, hmax, wmax , hmin);//刷新队列//在内部,openGL的命令和语句常常等待在队列里//直到openGL驱动程序同时处理几个“命令”glFlush();glFlush();
}void OnMouse(int button,int state,int x,int y)
{if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)//点击左键{if (flag%2) {glColor3f(1,0,0);glBegin(GL_POINTS);glVertex2f(x,window_size-y);x1 = x;y1 = y;glEnd();glFlush();}else{glColor3f(1,0,0);glBegin(GL_POINTS);glVertex2f(x,window_size-y);glEnd();x2 = x;y2 = y;glBegin(GL_LINES);glColor3f(1.0,0.0,0.0);glVertex2f(x1,window_size-y1);glVertex2f(x2,window_size-y2);glEnd();glFlush();LYD_Barsky(x1, y1, x2, y2, hmax, hmin, wmin,wmax);}flag++;}
}int main(int argc, char *argv[])
{cout << "begin"<<endl;glutInit(&argc, argv); //初始化GLUTglutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(300, 100);glutInitWindowSize(window_size, window_size);glutCreateWindow("hw1_cut_line");InitEnvironment(); //初始化glutMouseFunc(&OnMouse); //注册鼠标事件glutDisplayFunc(&myDisplay); //回调函数glutMainLoop(); //持续显示,当窗口改变会重新绘制图形return 0;
}
openGL-梁友栋-Barsky算法相关推荐
- 梁友栋-Barsky裁剪算法原理分析
梁友栋-Barsky算法是一种参数线裁剪算法. 为两个参数方程,为两点的差值,其中的由来是整理参数方程中三角函数的值得出,因为取值需要在裁剪框内,所以u只需要取0~1范围内的就足够. 是结合四条边界线 ...
- 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)
一.算法实现原理 Cohen-Sutherland直线段剪裁算法: 算法原理: (1)判断线段两端是否都落在窗口内,如果是,则线段完全可见,否则进行下一步 (2)判断线段两端是否都落在窗口外,如果是, ...
- 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 .<计算 ...
- 理解梁友栋-Barsky裁剪算法
学习图形学窗口裁剪算法时,很多教材只是对梁友栋-Barsky裁剪算法过程做了简单的介绍,并没有对原理过多的解释.老而学者如秉烛夜行,用了两三天时间终于搞明白算法原理. 消除指定区域内或区域外的图形部分 ...
- java实现梁友栋裁剪算法_梁友栋裁剪算法
梁友栋裁剪算法 用任意颜色绘制窗口,并用一种颜色绘制线段,利用P181页所示梁友栋裁剪算法对线段进行裁剪.要求能够演示出裁剪过程,裁剪前的图形要绘出,当按下任意按键,绘制出裁剪结果.请使用TC打开源程 ...
- [计算机图形学]Python实现梁友栋裁剪算法
梁友栋算法是很简单的一个裁剪算法,但是只适用于裁剪范围是矩形框并且矩形框边界平行于坐标轴的情况. 实验结果: 完整代码: 注意代码没有写到线是平行和垂直的情况,也没有考虑线不经过框的情况,所以输入的时 ...
- 计算机图形学常用算法实现9 梁友栋-Barskey裁剪算法
这个算法的效率比前面提到的Cohen-Sutherland要高 思路是把直线表示为参数方程形式, x= x1+udx y = y1+udy 由xmin<x<xmax ymin<y&l ...
- 张正友相机标定算法详解
张正友相机标定算法详解 1.齐次表示法与一些基本结论 1.1 点与直线的齐次表示 在射影几何中,通常用齐次方式来表达点与直线.比如p=(u,v)p=(u,v)p=(u,v)被表示成p^=(x1,x ...
- 图形学 实验四 梁barsky算法
核心思想: 用参数方程表示一条直线 已知一条线段的起点(x1,y1).终点(x2,y2),就可以通过一个参数u,表示这条线段所在直线上的任意一个点(x,y) x=x1+u(x2-x1) y=y1+u( ...
最新文章
- 关于/etc/fstab
- thinkphp传递参数
- 《C++语言基础》实践参考——友元类
- php保存复制粘贴的网页内容,JS实现网站内容的禁止复制和粘贴、另存为
- 实现两边定宽,中间自适应布局(三栏布局)的七种方法
- 机器学习笔记(十):梯度下降 | 凌云时刻
- pic单片机tmr1计数c语言,PIC单片机C语言编程实例五.doc
- librdkafka交叉编译
- c语言傅立叶变换,傅立叶变换与傅立叶反变换的C语言实现
- 知识分享 | 卡方分析的入门小知识
- 2020年9月程序员工资最新统计,结果万万没想到
- php替换掉,php替换
- linux系统使用命令一次显示日历,如何在Linux命令行上使用日历
- 微信小程序/小游戏运行环境小结
- Traffic Shifting
- FreeBSD 虚拟化(jail) 初体验
- 为什么每次圣斗士出招前都要大喊一下大招?
- 利用viewbag把数据对象传到前端并转换成json对象,及解决json字符串被转义问题
- QT 无边窗口圆角实现
- ubuntu查看usb和连接手机usb共享热点