直线裁剪C语言代码

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三:直线段的裁剪

一、实验目的

熟练掌握二维图形中直线段的裁剪算法

能用一种算法对已知直线段进行裁剪

二、实验器材

计算机

三、实验内容

采用Sutherland_hodgeman算法对给定的直线段进行裁剪

四、实验步骤

1、了解算法思想

裁剪区每条边界将平面分为两个部分:可见区与不可见区。分别采用裁剪区域左、上、右、下边界对直线段进行裁剪,根据直线段两个端点与边界的位置关系可分四种:

①线段起点和终点都在不可见区,此时为线段的显然不可见,退出程序

②线段起点在不可见区域、终点在可见区,此时保留交点和终端点

③线段起点在可见区域、终点在不可见区,此时可互换起点与终点,之后与2的情况一样

④线段起点在和终点都在可见区,此时保留起点和终端点

2、在C#环境下实现算法

程序中包括:①给定裁剪区域边界范围

②给定一直线段的两个端点坐标

③采用裁剪区域边界逐边对线段进行裁剪

④输出线段裁剪结果

五、要求

1、上机报告

2、程序存盘上交

using System;

using System.Collections.Generic;

using ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication31

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e) {

int xl,xr,yb,yt,x1,x2,y1,y2,x,y;

xl = 2500;

xr = 5500;

yb = 2500;

yt = 6500;

Bitmap bmp;

Graphics graphics = this.CreateGraphics();

bmp = new Bitmap(this.ClientRectangle.Width,

this.ClientRectangle.Height);

Graphics g = this.CreateGraphics();

Pen p1 = new Pen(Color.Red);

g.DrawLine(p1, 2500, 2500, 2500, 6500);

g.DrawLine(p1, 2500, 6500, 5500, 6500);

g.DrawLine(p1, 5500, 6500, 5500, 2500);

g.DrawLine(p1, 5500, 2500, 2500, 2500);

x1 = int.Parse (textBox1.Text );

y1 = int.Parse(textBox2.Text );

x2 = int.Parse(textBox3.Text );

y2 = int.Parse(textBox4.Text );

if (x1 < xl && x2 < xl)

{

}

else

{

if (x1 < xl && x2 >= xl)

{

y1 = (int)(y1 + (xl - y1) * ((y2 - y1) / (x2 - x1))); x1 = xl;

}

else

{

if (x1 >= xl && x2 < xl)

{

x = x1;

y = y1;

y1 = y1 + (y2 - y1) * (xl - y1) / (y2 - y1);

x1 = xl;

x2 = x;

y2 = y;

}

}

}

if (y1 > yt && y2 > yt)

{

}

else

{

if (y1 > yt && y2 <= yt)

{

y1 = x1 + (y2 - y1) * (yt - y1) / (y2 - y1);

y1 = yt;

}

else

{

if (y1 <= yt && y2 > yt)

{

x = x1;

y = y1;

x1 = (int)(x1 + (x2 - x1) * (yt - y1) / (y2 - y1)); y1 = yt;

x2 = x;

y2 = y;

}

}

}

if (x1 > xr && x2 > xr)

{

}

else

{

if (x1 > xr && x2 <= xr)

{

y1 = (int)(y1 + (y2 - y1) * (xr - x1) / (x2 - x1));

x1 = xr;

}

else

{

if (x1 <= xr && x2 > xr)

{

x = x1;

y = y1;

y1 = (int)(y1 + (y2 - y1) * (xr - x1) / (x2 - x1)); x1 = xr;

x2 = x;

y2 = y;

}

}

}

if (y1 < yb && y2 < yb)

{

}

else

{

if (y1 < yb && y2 >= yb)

{

x1 = x1 + (x2 - x1) * (yb - y1) / (y2 - y1);

y1 = yb;

}

else

{

if (y1 >= yb && y2 < yb)

{

x = x1;

y = y1;

x1 = (int)(x1 + (x2 - x1) * (yb - y1) / (y2 - Y1)); y1 = yb;

x2 = x;

y2 = y;

}

相关文档
最新文档