C# 实现线段的编码裁剪算法(vs2010)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace cutLine { unsafe public partial class Form1 : Form { const int left = ; const int right = ; const int bottom = ; const int top = ; Point window1, window2; //保存裁剪区矩形 Point line1, line2; //保存线段的两个端点坐标 int start, x , y; //标志点击次数,取值范围0,1,2 Graphics g; //GDI 对象 public Form1() { InitializeComponent(); g = CreateGraphics(); window1 = new Point(, );//裁剪区左下角 window2 = new Point(, ); //裁剪区右上角 start = ; } private void Form1_MouseClick(object sender, MouseEventArgs e) { int x = e.X, y = e.Y; //记录鼠标点击位置: Pen p = new Pen(Brushes.Black, ); switch (start) { case : { g.Clear(Color.Silver); Background(); start = ; line1 = new Point(e.X, e.Y); g.DrawRectangle(Pens.Black, x - , y - , , ); //画一个小方块,显示点击位置 break; } case : { start = ; line2 = new Point(e.X, e.Y); g.DrawRectangle(Pens.Black, x - , y - , , ); //画一个小方块,显示点击位置 g.DrawLine(p, line1, line2); //DrawString_1(); cutLine(line1, line2, window1.X, window2.X, window1.Y, window2.Y); break; } } } private void Background() { if (start == ) g.DrawRectangle(Pens.Black, window1.X, window1.Y,window2.X - window1.X, window2.Y - window1.Y); DrawString(); } private void DrawString() { String str; str = " 黑色矩形为裁剪窗口\n 点鼠标输入线段的两个点,自动执行裁剪\n 红色为线段裁剪后的部分"; //临时字体对象 //画刷枚举 //位置 g.DrawString(str, new Font("宋体", , FontStyle.Regular), Brushes.Black, , ); } private void DrawString_1(int code1, int code2) { String str; g.FillRectangle (Brushes.White, , , , ); str = "\n编码: " Convert.ToString(code1, ).PadLeft(, ’’’’) " " Convert.ToString(code2, ).PadLeft(, ’’’’); g.DrawString(str, new Font("宋体", , FontStyle.Regular), Brushes.Black, , ); } private void Form1_Load(object sender, EventArgs e) { } private void Form1_Paint(object sender, PaintEventArgs e) { Background(); } private void Encode(int x, int y,int *code,int xl, int xr, int yb, int yt) { int c = ; if (x < xl) c = c | left; else if (x > xr) c = c | right; if (y < yb) c = c | bottom; else if (y > yt) c = c | top; (*code) = c; } public void cutLine(Point p1, Point p2, int xl, int xr, int yb, int yt) { Pen p = new Pen(Brushes.Red, ); int x1, x2, y1, y2,code1, code2, code; x1 = p1.X; x2 = p2.X; y1 = p1.Y; y2 = p2.Y; Encode(x1,y1, &code1, xl,xr,yb,yt); Encode(x2,y2, &code2, xl,xr,yb,yt); DrawString_1(code1, code2); while (code1 != || code2 != ) { if ((code1 & code2) != ) return; code = code1; if (code1 == ) code = code2; if ((left & code) != )//线段与左边界相交 { x = xl; y = y1 (y2 - y1) * (xl - x1) / (x2 - x1); } else if ((right & code) != )//线段与右边界相交 { x = xr; y = y1 (y2 - y1) * (xr - x1) / (x2 - x1); } else if ((bottom & code) != )//线段与下边界相交 { y = yb; x = x1 (x2 - x1) * (yb - y1) / (y2 - y1); } else if ((top & code) != )//线段与上边界相交 { y = yt; x = x1 (x2 - x1) * (yt - y1) / (y2 - y1); } if (code == code1) { x1 = x; y1 = y; Encode(x, y, &code1, xl, xr, yb, yt); } else { x2 = x; y2 = y; Encode(x, y, &code2, xl, xr, yb, yt); } } p1.X = x1; p1.Y = y1; p2.X = x2; p2.Y = y2; g.DrawLine(p, p1, p2); } } }
C# 实现线段的编码裁剪算法(vs2010)的更多相关文章
- CGA裁剪算法之线段裁剪算法
CGA裁剪算法之线段裁剪算法 常用的线段裁剪算法有三种:[1]Cohen_SutherLand裁剪算法,[2]中点分割裁剪算法,[3]参数化方法. 1. Cohen_SutherLand裁剪算法 为了 ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- [图形学] Chp8.7.2 梁友栋-Barsky线段裁剪算法
这节简单介绍了梁友栋-Barsky裁剪算法的原理,只有结论并没有过程,看过http://blog.csdn.net/daisy__ben/article/details/51941608这篇文章后,大 ...
- 理解Liang-Barsky裁剪算法的算法原理
0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...
- Liang-Barsky直线段裁剪算法
Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...
- DDos攻击,使用深度学习中 栈式自编码的算法
转自:http://www.airghc.top/2016/11/10/Dection-DDos/ 最近研究了一篇论文,关于检测DDos攻击,使用了深度学习中 栈式自编码的算法,现在简要介绍一下内容论 ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- RMQ问题(线段树算法,ST算法优化)
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...
- WebGIS裁剪算法-线裁剪多边形
在gis系统中 经常会用到一些裁剪的方法,首先推荐一个非常好用的空间分析JavaScript库--Turf.js,不仅功能强大.使用简单,同时处理速度也很快. Turf.js中提供了一中多边形的裁剪方 ...
随机推荐
- [转帖]龙芯下一代处理器微结构GS464E细节曝光
龙芯下一代处理器微结构GS464E细节曝光 [日期:2015-05-26] 来源:Linux公社 作者:Linux [字体:大 中 小] http://www.linuxidc.com/Linux/ ...
- Lodop打印二维码内容长度不同如何大小相同
利用Loodop打印控件打印二维码的时候,往往传入的数值是变量,有的只有一个数字,有的却一大堆数字和字母,根据内容长度不同,二维码大小也不同,这样如果批量打印二维码标签,传入的数据是不同的,会造成有的 ...
- 部署AWStats分析系统
介绍 AWStats是使用Prel语言开发的一款开源日志分析系统,它不仅可以用来分析Apache网站服务器的访问日志,也可以用来分析Samba.Vsftpd.IIS等服务的日志信息. AWStats软 ...
- lvs逻辑卷详解
管理磁盘空间对系统管理员来说是一件重要的日常工作.一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间.它也需要系统离线才能处理.通常这种任务会涉及到安装一个新的硬盘.引 ...
- BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...
- day6 字典
字典的创建方式 注意 字典是无序的 1. dic{"name":"yang","age":35} 常用还是用这个 2. dic3 = dic ...
- BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构
题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...
- 【SDOI 2017】龙与地下城(组合)
概率论太难了,不会.但这不能阻止我们过题.相信大家都会一个基于背包的暴力做法,我们可以将其看成是卷积的形式就可以用fft优化了.形式化讲,就是求幂级数$ (\sum\limits_{i = 0}^{x ...
- 牛客练习赛 小A与最大子段和 解题报告
小A与最大子段和 题意 在一个序列 \(\{a\}\) 里找到一个非空子段 \(\{b\}\), 满足 \(\sum\limits_{i=1}^{|b|}b_i\times i\) 最大 \(n\le ...
- activity之间的数据传递方法
1 基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...