C# Cut Line Bressenham Algorithm
using System; using System.Drawing; using System.Windows.Forms; namespace CutLine { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } static public class ai { static byte code(Point p, Rectangle rec) { ; ; ; ; ; return ans; } static public void run(Point from, Point to, Rectangle rec) { byte f = code(from, rec); byte t = code(to, rec); )//绝对无交集,两点在同一侧 { nothing = true; return; } )//两点都在内部 { ai.from = from; ai.to = to; nothing = false; return; } ) { change(ref to,ref from,ref rec,ref t); } else{ change(ref from,ref to, ref rec,ref f); } run(from, to, rec); } static void change(ref Point move, ref Point stay, ref Rectangle rec,ref byte c) { ) != ) { move.X =(int)( (move.X - stay.X) *(double) (rec.Y - stay.Y) / (move.Y - stay.Y) + stay.X); move.Y = rec.Y; } ) != ) { move.X = (int)((double)(move.X - stay.X) / (move.Y - stay.Y) * (rec.Y + rec.Height - stay.Y) + stay.X); move.Y = rec.Y + rec.Height; } ) != ) { move.Y = (int )((double)(move.Y - stay.Y) / (move.X - stay.X) * (rec.X - stay.X) + stay.Y); move.X = rec.X; } ) != ) { move.Y = (int)((double)(move.Y - stay.Y) / (move.X - stay.X) * (rec.X +rec.Width- stay.X) + stay.Y); move.X = rec.X+rec.Width; } } ,); ,); public static bool nothing = true; } public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "直线裁剪--made by weidiao.neu"; } ; Point from = new Point(); Point to = new Point(); Point temp = new Point(); Rectangle rec = new Rectangle(); private void button1_Click(object sender, EventArgs e) { CreateGraphics().Clear(Color.AliceBlue); times = ; } bool bigger(Point a, Point b) { return a.X >= b.X && b.X >= b.Y; } int min(int a, int b) { if(a<b)return a; return b; } Pen linePen = ); Pen recPen = ); override protected void OnMouseMove(MouseEventArgs e) { || times == ) return; Bitmap bit = new Bitmap(ClientSize.Width, ClientSize.Height); Graphics g = Graphics.FromImage(bit); g.Clear(Color.AliceBlue); switch (times) { : g.DrawLine(linePen, from, e.Location); break; : g.DrawLine(linePen, from, to); rec.X = min(temp.X, e.X); rec.Y = min(temp.Y, e.Y); rec.Width = Math.Abs(temp.X - e.X); rec.Height = Math.Abs(temp.Y - e.Y); g.DrawRectangle(recPen, rec); break; } CreateGraphics().DrawImage(bit, , ); } override protected void OnMouseDown(MouseEventArgs e) { switch (times) { : button1_Click(null, null); from.X = e.X; from.Y = e.Y; break; : to.X = e.X; to.Y = e.Y; CreateGraphics().DrawLine(linePen, from, to); break; : temp.X = e.X; temp.Y = e.Y; break; : rec.X = min(temp.X, e.X); rec.Y = min(temp.Y, e.Y); rec.Width = Math.Abs(temp.X - e.X); rec.Height = Math.Abs(temp.Y - e.Y); CreateGraphics().DrawRectangle(recPen, rec); ai.run(from, to, rec); if(ai.nothing==false) CreateGraphics().DrawLine(), ai.from, ai.to); break; } times++; times %= ; } } }
java
package mySecondPackage; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.swing.*; /* * 上下左右 * 0000 * 用4位二进制表示 * 上边之外为1,也就是上边之上为1 * 下边之外为1,也就是下边之下为1 * 左边之外为1,也就是左边之左为1 * 右边之外为1,也就是右边之右为1 * */ /** * @author weidiao * @see hahaha * @version 2.0 */ class ai { /** * 按照上下左右的顺序进行编码 * */ static byte code(Point p, Rectangle rec) { byte ans = 0; if (p.y < rec.y)// 如果点p在长方形的上边 ans |= 1; else if (p.y > rec.y + rec.height)// 如果点p在长方形的下边 ans |= 2; if (p.x < rec.x)// 如果点p在长方形左边 ans |= 4; else if (p.x > rec.x + rec.width)// 如果点p在长方形右边 ans |= 8; return ans; } /** * @算法的主体,进行判断和循环 * @param 输入参数 * :Point from,to描述直线 Rectangle rec描述矩形 * @return输出参数:返回为空,因为Point from和to是传引用,所以就直接改变了 * 类的静态变量nothing反映了是否产生了结果,若无交点,nothing=true */ static public void run(Point from, Point to, Rectangle rec) { while (true) { byte f = code(from, rec); byte t = code(to, rec);// 对两个点进行编码 if ((f & t) != 0)// 绝对无交集,两点在矩形某条边同一侧 { nothing = true;// return; } if ((f | t) == 0)// 两点都在矩形内部 { nothing = false; return; } if (f == 0) change(to, from, rec, t); else change(from, to, rec, f); } } /** * @本函数用于求直线与矩形边所在直线的交点 * @param Point * move表示准备移动的那个点,Point stay表示不移动的点 Rectangle rec表示矩形 Byte c * 表示准备移动的那个点的编码 * @return 被移动的点move值将会发生变化 * @难点在于:计算时要用浮点数进行计算,直接用int误差太大 */ static void change(Point move, Point stay, Rectangle rec, byte c) { if ((c & 1) != 0) { move.x = (int) ((move.x - stay.x) * (double) (rec.y - stay.y) / (move.getY() - stay.y) + stay.x); move.y = rec.y; } else if ((c & 2) != 0) { move.x = (int) ((double) (move.x - stay.x) / (move.y - stay.y) * (rec.y + rec.height - stay.y) + stay.x); move.y = rec.y + rec.height; } else if ((c & 4) != 0) { move.y = (int) ((double) (move.y - stay.y) / (move.x - stay.x) * (rec.x - stay.x) + stay.y); move.x = rec.x; } else if ((c & 8) != 0) { move.y = (int) ((double) (move.y - stay.y) / (move.x - stay.x) * (rec.x + rec.width - stay.x) + stay.y); move.x = rec.x + rec.width; } } public static boolean nothing = true; } /** * @CutLine类,界面部分 * */ class CutLine extends JFrame { public static void main(String[] args) { new CutLine(); } public CutLine() { setTitle("直线裁剪--made by weidiao.neu"); setSize(700, 700); setVisible(true); setLayout(null); setDefaultCloseOperation(EXIT_ON_CLOSE); JButton clearButton = new JButton("清屏"); clearButton.setFont(new Font("楷体", Font.BOLD, 50)); clearButton.addActionListener(clearButtonClick); clearButton.setLocation(500, 500); clearButton.setSize(200, 200); add(clearButton); addMouseListener(mouse); addMouseMotionListener(mouseMotion); } int times = 0; Point from = new Point(); Point to = new Point(); Point temp = new Point();// 用于存储矩形左上角的位置 Rectangle rec = new Rectangle(); ActionListener clearButtonClick = new ActionListener() { public void actionPerformed(ActionEvent e) { getGraphics().clearRect(0, 0, getWidth(), getHeight()); times = 0; } }; MouseListener mouse = new MouseAdapter() { public void mouseClicked(MouseEvent e) { switch (times) { case 0: clearButtonClick.actionPerformed(null); from = e.getPoint(); break; case 1: to = e.getPoint(); getGraphics().drawLine(from.x, from.y, to.x, to.y); break; case 2: temp = e.getPoint(); break; case 3: rec.x = Integer.min(temp.x, e.getX()); rec.y = Integer.min(temp.y, e.getY()); rec.width = Math.abs(temp.x - e.getX()); rec.height = Math.abs(temp.y - e.getY()); getGraphics().drawRect(rec.x, rec.y, rec.width, rec.height); ai.run(from, to, rec); if (ai.nothing == false) { Graphics2D g = (Graphics2D) getGraphics(); g.setStroke(new BasicStroke(4)); g.setColor(Color.red); g.drawLine(from.x, from.y, to.x, to.y); } break; } times++; if (times == 4) times = 0; } }; MouseMotionListener mouseMotion = new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { if (times == 0 || times == 2) return; getGraphics().clearRect(0, 0, getWidth(), getHeight()); BufferedImage bit = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g = (Graphics2D) bit.getGraphics(); switch (times) { case 1: g.setColor(Color.blue); g.setStroke(new BasicStroke(3)); g.drawLine(from.x, from.y, e.getX(), e.getY()); break; case 3: g.setColor(Color.blue); g.setStroke(new BasicStroke(3)); g.drawLine(from.x, from.y, to.x, to.y); rec.x = Integer.min(temp.x, e.getX()); rec.y = Integer.min(temp.y, e.getY()); rec.width = Math.abs(temp.x - e.getX()); rec.height = Math.abs(temp.y - e.getY()); g.drawRect(rec.x, rec.y, rec.width, rec.height); break; } getGraphics().drawImage(bit, 0, 0, null); } }; boolean bigger(Point a, Point b) { return a.x >= b.x && b.x >= b.y; } }
C# Cut Line Bressenham Algorithm的更多相关文章
- DDA, Bresenham line's algorithm and Voxel Traversal used in the Grid-Accelerator in PBRT
- DDA(Digital Differential Analyzer, 数值微分法) - 计算机图形学中,经常会遇到一些计算机中”经典“的问题.例如,如何利用计算机”离散“的特质,模拟 ...
- 【A Global Line Matching Algorithm for 2D Laser Scan Matching in Regular Environment】
只看了前面的部分,灭有看实验,觉得整体风格比较傻白甜,与我的想法不谋而合.简单明了,用起来应该比较方便. 初步探测:如果有直线,就给线性插值一下. 分级聚类:利用简单的阈值给聚类了一下,分成了段段. ...
- POJ 1921 Paper Cut(计算几何の折纸问题)
Description Still remember those games we played in our childhood? Folding and cutting paper must be ...
- Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...
- Line Search and Quasi-Newton Methods
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...
- hdu3982 直线切多边形 【WA中...】
题意:有一块蛋糕,上面有一颗cherry.用刀子切n次,求切完之后有cherry的那部分的面积 My solution: 先做一个大矩形,使cake内切于这个大矩形.如图: 然后不断切这个大矩形,每次 ...
- Hough Transform
Hough Transform Introduction: The Hough transform is an algorithm that will take a collection of poi ...
- [位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15
NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest. ...
- RichEdit 各个版本介绍
RichEdit是开发中经常使用到的控件,其版本自1.0起,历经好几年,好几次的更新,在此引用一篇介绍RichEdit版本的博文(http://blogs.msdn.com/b/murrays/arc ...
随机推荐
- x01.os.14: 时间都去哪儿了
时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...
- SVN Unable to connect to a repository at UR
背景: 1. SVN服务器:VisualSVN-Server-2.5.5: 2. SVN客户端:TortoiseSVN-1.7.6.22632-x64-svn-1.7. ...
- JavaScript中产生标识符方式的演变
本文记录下JS中产生标示符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let.const.class. ...
- MySQL事务学习-->隔离级别
MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...
- 怎么使PUTTY一直连接
如何才能保证PUTTY一直连接,即使我们好长时间不去敲命令,也让它一直连接着? PuTTY的设置方法是:在Connection里面有个Seconds between keepaliaves.这里就是每 ...
- [译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)
翻译自:http://wiki.libvirt.org/page/VM_lifecycle 这篇文章描述虚机生命周期的基本概念.其目的在于在一篇文章中提供完整的关于虚机创建.运行.停止.迁移和删除 ...
- Objective-C声明在头文件和实现文件中的区别
Objective-C声明在头文件和实现文件中的区别 转自codecloud(有整理) 调试程序的时候,突然想到这个问题,百度一下发现有不少这方面的问答,粗略总结一下: 属性写在.h文件中和在.m文件 ...
- js中的冒泡排序以及实现一个数组中得最到最大的数字小例
这其实是一个很简单的js就可以实现,当然一般情况就是利用for循环,从第一个跟第二个开始比较,根据大小交互位置,思路很简单. 也就是js中的冒泡排序 冒泡排序 时间复杂度为O(n^2),有两个优点: ...
- hibernate之关联映射
No.1 映射一对多双向关联关系: 当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象. 步骤一: 注意:hibernate要求在持久化类中定义集合类属性时,必须把属性类 ...
- oracl函数
一:大小写函数 1:lower()全部小写 select lower('HEHE') lowerwords from dual 2:upper()全部大写 3:initcap()首字母大写 4:con ...