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 ...
随机推荐
- 将treeview控件内容导出图片
项目中有一项需求,需要将项目中的treeview控件展示的树状结构直接导成一张图片.网上方法很多,但很多都是屏幕截屏,我的解决思路是新建一个用户控件,将主窗体的Treeview的数据传给用户控件(不要 ...
- 三:shell运算符
1:declare命令 shell默认是字符串型 如果需要加减乘除,需要定义为整型declare命令:改变默认变量的类型decalre [+/-] [选项] 变量名 -给变量 ...
- 修改TFS客户端的工作区类型
TFS系统存在两种工作区类型:"本地"和"服务器".默认情况下,用户使用本地工作区实现代码管理. 但是在用户端代码文件特别多(超过10万个文件)时,由于每次启 ...
- Uploadify v3.2.1 参数说明
一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...
- 理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置
本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...
- unix automake 使用,快速生成你的Makefile
使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...
- Network Experiment Environment Construction
In order to provide an environment for network experiments in the future, I use VirutalBox to create ...
- VR可以用做除游戏外的哪些地方
虚拟现实可以将你传送到平时不敢去的地方, 例如喜马拉雅山顶. 也可以将你带到人类几乎不可能到达的地方, 例如世界上最深处, 马里亚纳海沟.马里亚纳海沟最深处的水压可是达到惊人的110Mpa, 这个高压 ...
- 批处理文件指定jre路径启动java桌面应用程序
应用场景: 我开发了一个应用程序,并连同jre一起刻成光盘,提供给用户,用户直接双击批处理文件即可运行,而不需要自己额外装jre. 目录组织结构如下: client |-images |-jre |- ...
- 搞netty
开始搞netty了 查了下资料 在使用NIO 的时候,最好不要配置 SO_LINGER,假设设置了该參数,在 close的时候如缓冲区有数据待写出,会抛出 IOException. // 在netty ...