其他计算机图形学实验见 链接

#include<GL/glut.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const float window_width = 800, window_height = 600;
const int d = 8;
struct point
{float x, y;point() {}point(float xx, float yy):x(xx), y(yy) {}
};
struct EDGE//Edge
{float bx, by, ex, ey;EDGE() {}EDGE(float bxx, float byy, float exx, float eyy):bx(bxx), by(byy), ex(exx), ey(eyy) {}
};char OP;
EDGE left(200, 450, 200, 200);
EDGE bottom(200, 200, 600, 200);
EDGE right(600, 200, 600, 450);
EDGE top(600, 450, 200, 450);
float straightLine_color[3] = { 0,0,1 };
float remainingLine_color[3] = { 1,0,0 };
vector<point> line;void draw_a_point(int x, int y)
{glPointSize(3.0f);glBegin(GL_POINTS);glColor3f(0,1,0);glVertex2f(x, y);glEnd();glFlush();
}
/*
XL <= x1 + u*dx <= XR
YB <= y1 + u*dy <= YTp<0 由外到内
p>0 由内到外p!=0 计算u=q/p
https://blog.csdn.net/weixin_41894030/article/details/102817736(1)Pk=0
如果还满足qk<0,则线段完全在边界外,应舍 弃该线段
如果qk≥0,则进一步判断
(2)Pk!=0
当pk < 0时,线段从裁剪边界延长线的外部 延伸到内部,是入边交点
当pk > 0时,线段从裁剪边界延长线的内部 延伸到外部,是出边交点线段和窗口边界一共有四个交点,根据pk的符号,就知道 哪两个是入交点,哪两个是出交点
当pk < 0时:对应入边交点
当pk > 0时:对应出边交点一共四个u值,再加上u=0、u=1两个端点值,总共六个值
把pk<0的两个u值(入边的两个交点)和0比较去找最大的,把pk>0的两个u值(出边的两个交点)和1比较去找最小的,这样就得到两个端点的参数值*/
bool ClipT(float p, float q, float* u1, float* u2)
{float r;if (p < 0) {r = q / p;if (r > * u2)return FALSE;if (r > * u1)*u1 = r;}else if (p > 0){r = q / p;if (r < *u1)return FALSE;if (r < *u2)*u2 = r;}elsereturn q >= 0;return TRUE;
}void LB_LineClip(float x1, float y1, float x2, float y2, float XL, float XR, float YB, float YT)
{float dx, dy, u1, u2;u1 = 0;u2 = 1;dx = x2 - x1;dy = y2 - y1;if (ClipT(-dx, x1 - XL, &u1, &u2))//p1=-dx q1=x1-XLif (ClipT(dx, XR - x1, &u1, &u2))//p2=dx q2=XR-x1if (ClipT(-dy, y1 - YB, &u1, &u2))//p3=-dy q3=y1-YBif (ClipT(dy, YT - y1, &u1, &u2))//p4=dy q4=YT-y1{glLineWidth(3);glColor3fv(remainingLine_color);glBegin(GL_LINES);glVertex2f(x1 + u1 * dx, y1 + u1 * dy);glVertex2f(x1 + u2 * dx, y1 + u2 * dy);glEnd();glFlush();}
}int getdis(int x, int y)
{int ans = -1;float shortdis = 99999999;for (int i = 0; i < line.size(); i++){float dis = sqrt(pow(x - line[i].x, 2) + pow(y - line[i].y, 2));if (dis < shortdis && dis <= d){shortdis = dis;ans = i;}/*dis = sqrt(pow(x - lineend[i].x, 2) + pow(y - lineend[i].y, 2));if (dis < shortdis && dis <= d){shortdis = dis;ans = i;}*/}return ans;
}void mymouse(int button, int state, int x, int y)
{if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){for (int i = 0; i < line.size() - 1; i += 2){LB_LineClip(line[i].x, line[i].y, line[i + 1].x, line[i + 1].y, 200, 600, 200, 450);}}if (OP == 'p'){if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){draw_a_point(x, window_height - y);line.push_back(point(x, window_height - y));cout << "直线" << "(" << x << ", " << window_height - y << ") ";// << endl;}if (button == GLUT_LEFT_BUTTON && state == GLUT_UP){line.push_back(point(x, window_height - y));cout << "(" << x << ", " << window_height - y << ")" << endl;}}
}void dragmouse(int x, int y)
{glClear(GL_COLOR_BUFFER_BIT);//清除窗口内容if (OP == 'p')//画直线{glBegin(GL_LINES);glColor3fv(straightLine_color);glVertex2f(line[line.size() - 1].x, line[line.size() - 1].y);glVertex2f(x, window_height - y);glEnd();}if (OP == 'd')//拖动端点{int index = getdis(x, window_height - y);if (index != -1){line[index].x = x;line[index].y = window_height - y;}}//画出边界glColor3f(0, 1, 0);glLineWidth(2.0f);glBegin(GL_LINES);glVertex2f(::left.bx, ::left.by); glVertex2f(::left.ex, ::left.ey);glVertex2f(bottom.bx, bottom.by); glVertex2f(bottom.ex, bottom.ey);glVertex2f(::right.bx, ::right.by); glVertex2f(::right.ex, ::right.ey);glVertex2f(top.bx, top.by); glVertex2f(top.ex, top.ey);glEnd();//把之前已有的直线画出来glBegin(GL_LINES);glColor3fv(straightLine_color);for (int i = 0; i < line.size() - 1; i+=2){glVertex2f(line[i].x, line[i].y);glVertex2f(line[i + 1].x, line[i + 1].y);}glEnd();glFlush();
}void keyboard(unsigned char key, int x, int y)
{if (key == 27)exit(0);if (key == 'p')//画直线{OP = 'p';cout << "请按住鼠标左键,拖动鼠标画直线" << endl;}if (key == 'd')//拖动端点{OP = 'd';cout << "请按住直线端点拖动" << endl;}
}//void processmenuevent(int op)
//{//  switch (op)
//  {//  case 'p':
//      OP = 'p';
//  case 'd':
//      OP = 'd';
//  case 'c':
//      OP = 'c';
//  default:
//      break;
//  }
//}
//void createMenu()
//{//  int menu = glutCreateMenu(processmenuevent);
//  glutAddMenuEntry("绘制", 'p');
//  glutAddMenuEntry("拖动", 'd');
//  glutAddMenuEntry("裁剪", 'c');
//
//  glutAttachMenu(GLUT_MIDDLE_BUTTON);
//}int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 50);glutInitWindowSize(window_width, window_height);glutCreateWindow("liang-Barskey交互式矩形边框裁剪直线");cout << "键盘点击p开始画线\n键盘点击d拖动端点\n点击鼠标右键裁剪\n点击ESC退出" << endl;glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, window_width, 0, window_height);glClearColor(1, 1, 1, 1);glClear(GL_COLOR_BUFFER_BIT);glColor3f(0, 1, 0);glLineWidth(2.0f);glBegin(GL_LINES);glVertex2f(::left.bx, ::left.by); glVertex2f(::left.ex, ::left.ey);glVertex2f(bottom.bx, bottom.by); glVertex2f(bottom.ex, bottom.ey);glVertex2f(::right.bx, ::right.by); glVertex2f(::right.ex, ::right.ey);glVertex2f(top.bx, top.by); glVertex2f(top.ex, top.ey);glEnd();glFlush();glutMouseFunc(&mymouse);glutMotionFunc(&dragmouse);glutKeyboardFunc(&keyboard);glutMainLoop();return 0;
}
``

计算机图形学E7——裁剪-交互式Liang-Barskey矩形窗口裁剪直线相关推荐

  1. 计算机图形学E7——OpenGL 交互式三角形裁剪直线

    其他计算机图形学实验见 链接 #include<gl/glut.h> #include<iostream> #include<algorithm> #include ...

  2. 计算机图形学E9——裁剪——固定矩形窗口裁剪多边形(凸多边形/凹多边形)

    其他计算机图形学实验见 链接 文章目录 其他计算机图形学实验见 [链接](https://blog.csdn.net/weixin_41894030/article/details/103111655 ...

  3. 五边形镶嵌计算机程序,计算机图形学代码,五角星与五边形的转换,直线扫描等算法...

    [实例简介] 计算机图形学代码,五角星与五边形的转换,直线扫描的dda算法,中点画线 [实例截图] [核心代码] 325 └── 325 ├── 325.aps ├── 325.clw ├── 325 ...

  4. 【计算机图形学】中点画线法实现任意斜率直线的绘制

    [计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...

  5. 计算机图形学实验二交互式绘制多边形

    一.实验目的 掌握双缓冲绘图技术. (2)掌握人机交互技术. (3)掌握填充动态多边形的有效边表算法. 二.实验步骤 (1)在VS2017环境下创建MFC应用程序工程(单文档) (2)添加命令消息处理 ...

  6. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  7. 计算机图形学(三)——画一个矩形

    画一个矩形 main.cpp #include <iostream>// GLEW #define GLEW_STATIC #include <GL/glew.h>// GLF ...

  8. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  9. 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码

    环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...

最新文章

  1. 无监督学习:大数据带我们洞察现在,但小数据将带我们抵达未来
  2. large graph挖掘的技术基础
  3. Java学习笔记15
  4. CentOS下搭建Squid代理服务器
  5. MySQL协议包说明
  6. angular 标准目录结构_Angular-cli新建项目目录结构详解
  7. Kafka是如何处理Netflix每天2万亿条消息的?
  8. MyBatis中selectByExample和selectByExampleWithBLOBs区别
  9. ArcGIS制图表达Representation实战篇1-边界线和行道树制作
  10. openstack学习之路-python运维(network)
  11. 【R语言技巧】apply篇 sumNotes
  12. 互联网人员电脑上必备的免费办公软件
  13. 什么叫数字化服务-数字化转型网
  14. python写论文难吗_师兄一年发表5篇CSSCI,原来高手也用套路……
  15. CUDA:使用CUDA/OpenGL互操作性对在OpenGL中生成的3D场景的图像进行后处理实例
  16. Xperia Z2参数及白皮书
  17. Android安全防护
  18. lua mysql 事务_Lua数据库/MySQL操作
  19. 计算机一级题库知识点,计算机一级考试题库最新版:知识点总结|历年真题
  20. C++11中随机数生成器(random)

热门文章

  1. 判断Json字符串返回类型 对象 或者 数组
  2. Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...
  3. [ARM-Linux开发] 主设备号--驱动模块与设备节点联系的纽带
  4. PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
  5. ubuntu声音问题
  6. .aspx页面 引用命名空间 (Import 指令,web.config)
  7. this关键字的使用案例
  8. 贪心策略——哈夫曼编码
  9. 数据库-MySQL-数据库设计-表的关联
  10. 数据3分钟丨Apache Doris谴责DorisDB违背开源精神;HC2021下周召开;openGauss训练营第二期圆满落幕