C# Cut Line Bressenham Algorithm

  1 using System;
  2 using System.Drawing;
  3 using System.Windows.Forms;
  4
  5 namespace CutLine
  6 {
  7     static class Program
  8     {
  9         [STAThread]
 10         static void Main()
 11         {
 12             Application.EnableVisualStyles();
 13             Application.SetCompatibleTextRenderingDefault(false);
 14             Application.Run(new Form1());
 15         }
 16     }
 17     static public class ai
 18     {
 19         static byte code(Point p, Rectangle rec)
 20         {
 21             byte ans=0;
 22             if (p.Y < rec.Y) ans |= 1;
 23             if (p.Y > rec.Y + rec.Height) ans |= 2;
 24             if (p.X < rec.X) ans |= 4;
 25             if (p.X > rec.X + rec.Width) ans |= 8;
 26             return ans;
 27         }
 28         static public void run(Point from, Point to, Rectangle rec)
 29         {
 30             byte f = code(from, rec);
 31             byte t = code(to, rec);
 32             if ((f & t) != 0)//绝对无交集,两点在同一侧
 33             {
 34                 nothing = true;
 35                 return;
 36             }
 37             if ((f | t)== 0)//两点都在内部
 38             {
 39                 ai.from = from;
 40                 ai.to = to;
 41                 nothing = false;
 42                 return;
 43             }
 44             if (f == 0)
 45             {
 46                 change(ref to,ref from,ref rec,ref t);
 47             }
 48             else{
 49                 change(ref from,ref  to, ref rec,ref f);
 50             }
 51             run(from, to, rec);
 52         }
 53         static void change(ref Point move, ref Point stay, ref Rectangle rec,ref byte c)
 54         {
 55             if ((c & 1) != 0)
 56             {
 57                 move.X =(int)( (move.X - stay.X) *(double) (rec.Y - stay.Y) / (move.Y - stay.Y) + stay.X);
 58                 move.Y = rec.Y;
 59             }
 60             else if ((c & 2) != 0)
 61             {
 62                 move.X = (int)((double)(move.X - stay.X) / (move.Y - stay.Y) * (rec.Y + rec.Height - stay.Y) + stay.X);
 63                 move.Y = rec.Y + rec.Height;
 64             }
 65             else if ((c & 4) != 0)
 66             {
 67                 move.Y = (int )((double)(move.Y - stay.Y) / (move.X - stay.X) * (rec.X - stay.X) + stay.Y);
 68                 move.X = rec.X;
 69             }
 70             else if ((c & 8) != 0)
 71             {
 72                 move.Y = (int)((double)(move.Y - stay.Y) / (move.X - stay.X) * (rec.X +rec.Width- stay.X) + stay.Y);
 73                 move.X = rec.X+rec.Width;
 74             }
 75         }
 76         public static Point from = new Point(10,10);
 77         public static Point to = new Point(40,40);
 78         public static bool nothing = true;
 79     }
 80     public partial class Form1 : Form
 81     {
 82         public Form1()
 83         {
 84             InitializeComponent();
 85             Text = "直线裁剪--made by weidiao.neu";
 86         }
 87
 88         int times = 0;
 89         Point from = new Point();
 90         Point to = new Point();
 91         Point temp = new Point();
 92         Rectangle rec = new Rectangle();
 93
 94         private void button1_Click(object sender, EventArgs e)
 95         {
 96             CreateGraphics().Clear(Color.AliceBlue);
 97             times = 0;
 98         }
 99         bool bigger(Point a, Point b)
100         {
101             return a.X >= b.X && b.X >= b.Y;
102         }
103         int min(int a, int b)
104         {
105             if(a<b)return a;
106             return b;
107         }
108         Pen linePen = new Pen(Color.Red, 5);
109         Pen recPen = new Pen(Color.Purple, 2);
110         override protected void OnMouseMove(MouseEventArgs e)
111         {
112             if (times == 0 || times == 2) return;
113             Bitmap bit = new Bitmap(ClientSize.Width, ClientSize.Height);
114             Graphics g = Graphics.FromImage(bit);
115             g.Clear(Color.AliceBlue);
116             switch (times)
117             {
118                 case 1: g.DrawLine(linePen, from, e.Location);
119                     break;
120                 case 3: g.DrawLine(linePen, from, to);
121                     rec.X = min(temp.X, e.X);
122                     rec.Y = min(temp.Y, e.Y);
123                     rec.Width = Math.Abs(temp.X - e.X);
124                     rec.Height = Math.Abs(temp.Y - e.Y);
125                     g.DrawRectangle(recPen, rec);
126                     break;
127             }
128             CreateGraphics().DrawImage(bit, 0, 0);
129         }
130         override  protected void OnMouseDown(MouseEventArgs e)
131         {
132             switch (times)
133             {
134                 case 0:
135                     button1_Click(null, null);
136                     from.X = e.X;
137                     from.Y = e.Y;
138                     break;
139                 case 1: to.X = e.X;
140                     to.Y = e.Y;
141                     CreateGraphics().DrawLine(linePen, from, to);
142                     break;
143                 case 2: temp.X = e.X;
144                     temp.Y = e.Y;
145                     break;
146                 case 3:
147                     rec.X = min(temp.X, e.X);
148                     rec.Y = min(temp.Y, e.Y);
149                     rec.Width = Math.Abs(temp.X - e.X);
150                     rec.Height = Math.Abs(temp.Y - e.Y);
151                     CreateGraphics().DrawRectangle(recPen, rec);
152                     ai.run(from, to, rec);
153                     if(ai.nothing==false)
154                     CreateGraphics().DrawLine(new Pen(Color.Green, 8), ai.from, ai.to);
155                     break;
156             }
157             times++;
158             times %= 4;
159         }
160     }
161 }
时间: 2024-10-27 05:57:48

C# Cut Line Bressenham Algorithm的相关文章

Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法

Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(Steepest Descent),可用于寻找函数的局部最小值.梯度下降的思路为,函数值在梯度反方向下降是最快的,只要沿着函数的梯度反方向移动足够小的距离到一个新的点,那么函数值必定是非递增的,如图1所示. 梯度下降思想的数学表述如下: b=a−α∇F(a)⇒f(a)≥f(b)(1)(1)b=a−α∇F

RichEdit 各个版本介绍

RichEdit是开发中经常使用到的控件,其版本自1.0起,历经好几年,好几次的更新,在此引用一篇介绍RichEdit版本的博文(http://blogs.msdn.com/b/murrays/archive/2006/10/14/richedit-versions.aspx),留个爪印记录下,以备查看. Version Ships ('ed) with dll name 1.0 Windows 95/98/ME/NT riched32.dll 1.0 Exchange 4.0 for Wind

hdu3982 直线切多边形

题意:有一块蛋糕,上面有一颗cherry.用刀子切n次,求切完之后有cherry的那部分的面积 My solution: 先做一个大矩形,使cake内切于这个大矩形.如图: 然后不断切这个大矩形,每次切割的时候保留与cherry同侧的那部分.最后剩下的就是一个多边形.求该多边形与圆的面积交即可. 在切割的时候如何保证留下来的是与cherry同侧的部分呢?很简单 方法不难,但是一直WA= =.遇到了个奇怪的问题: 对于这组数据: 3 5 2-5 0 5 3-5 0 5 -30 05 2-5 0 5

[位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest.pas/.c/.cpp 输入文件名 plant.in lineup.in scifest.in 输出文件名 plant.out lineup.out scifest.out 每个测试点时限 1s 1s 1s 测试点数目 10 10 10 每个测试点分值 10 10 10 内存上限 128MB 128

wiki中文语料+word2vec (python3.5 windows win7)

环境: win7+python3.5 1. 下载wiki中文分词语料   使用迅雷下载会快不少,大小为1个多G      https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 2. 安装opencc用于中文的简繁替换 安装exe的版本 到https://bintray.com/package/files/byvoid/opencc/OpenCC 中下载 opencc-1.0.1-win64.7

python 读写txt文件并用jieba库进行中文分词

python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt' fn=open(file,"r") print fn.read() fn.close() 在控制台输出txt文档的内容,注意中文会在这里乱码.因为和脚本文件放在同一个地方,我就没写路径了. 还有一些别的操作. 这是文件open()函数的打开mode,在第二个参数中设置.特别需要注意一下.具体还有一些别的细节操作. http://www.jb51

sublime 快键

Keyboard Shortcuts - Windows/Linux Warning This topic is a draft and may contain wrong information. Editing Keypress Command Ctrl + X Cut line Ctrl + ? Insert line after Ctrl + ? + ? Insert line before Ctrl + ? + ↑ Move line/selection up Ctrl + ? + ↓

asdfsadfs

# -*- coding:utf8 -*- import os import jieba.posseg as pseg # -*- coding:utf8 -*- import os  def splitSentence(inputFile,name):     fin = open(inputFile, 'r')      #以读的方式打开文件     print name     fout= open('/home/xdj/target/'+name,'w')         #以写得方式打

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复 我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分词算法进行研究.这个实验报告是我做高性能计算课程的实验里提交的.所以,下面的内容是从我的实验报告里摘录出来的,当作是我学