📄 line.cs
字号:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace DrawLines
{
/// <summary>
/// Line 表示一条线段。
/// </summary>
public class Line
{
#region 构造函数
/// <summary>
/// 构造函数。根据给出的点构造一个Line对象。
/// </summary>
/// <param name="begin">线条的起始点。</param>
/// <param name="end">线条的终止点。</param>
public Line(Point begin, Point end)
{
this.Begin = begin;
this.End = end;
pralDistnc = 5;
}
#endregion
#region 线段的端点
/// <summary>
/// 线段的起始点。
/// </summary>
public Point Begin
{
get
{
return begin;
}
set
{
begin = value;
}
}
private Point begin;
/// <summary>
/// 线段的终止点。
/// </summary>
public Point End
{
get
{
return end;
}
set
{
end = value;
}
}
private Point end;
private int pralDistnc; //平行线的距离。
#endregion
#region 相关数据计算
/// <summary>
/// 返回线段的斜率。
/// </summary>
public float Slope
{
get
{
if (Begin.X == End.X)
return Int32.MaxValue;
return (float)(Begin.Y - End.Y) / (Begin.X - End.X);
}
}
/// <summary>
/// 本线段与线段line是否相交。
/// </summary>
/// <param name="line">检查是否与本线段相交的线段。</param>
/// <returns>若相交,返回真,否则返回假。</returns>
public bool IsCutWithLine(Line line)
{
if (this.Slope == line.Slope)
return false; //两条线段平行。
if (this.Begin == this.End || line.Begin == line.End)
return false; //有一条线段是点。
// 计算两线段所在直线的交点的横坐标。
float CutPointX = (this.Slope * this.Begin.X - line.Slope * line.Begin.X
- this.Begin.Y + line.Begin.Y) / (this.Slope - line.Slope);
if (CutPointX < this.Begin.X && CutPointX < this.End.X)
return false; //交点在本线段的左侧。
if (CutPointX > this.Begin.X && CutPointX > this.End.X)
return false; //交点在本线段的右侧。
if (CutPointX < line.Begin.X && CutPointX < line.End.X)
return false; //交点在line的左侧。
if (CutPointX > line.Begin.X && CutPointX > line.End.X)
return false; //交点在line的右侧。
return true; //交点在本线段和line上,说明两线段相交。
}
#endregion
#region 绘制线段
/// <summary>
/// 绘制线段以及两条平行线。
/// </summary>
/// <param name="dc">绘制的图片对象。</param>
/// <param name="pen">绘制使用的钢笔。</param>
public void Draw(Graphics dc, Pen pen)
{
//绘制本条线段。
dc.DrawLine(pen, Begin, End);
//绘制两条平行线。
float tanCida = -1 / this.Slope;
//绘制第一条平行线。
float sinCida = (float)Math.Sin(Math.Atan(tanCida));
float cosCida = sinCida / tanCida;
float x = Begin.X + pralDistnc * cosCida;
float y = Begin.Y + pralDistnc * sinCida;
Point pralBegin = new Point((int)(x + 0.5), (int)(y + 0.5));
x = End.X + pralDistnc * cosCida;
y = End.Y + pralDistnc * sinCida;
Point pralEnd = new Point((int)(x + 0.5), (int)(y + 0.5));
Pen pralPen = new Pen(pen.Color, pen.Width);
pralPen.DashStyle = DashStyle.Dot;
dc.DrawLine(pralPen, pralBegin, pralEnd);
//绘制第二条平行线
sinCida = (float)Math.Sin(Math.Atan(tanCida)) * -1;
cosCida = sinCida / tanCida;
x = Begin.X + pralDistnc * cosCida;
y = Begin.Y + pralDistnc * sinCida;
pralBegin = new Point((int)(x + 0.5), (int)(y + 0.5));
x = End.X + pralDistnc * cosCida;
y = End.Y + pralDistnc * sinCida;
pralEnd = new Point((int)(x + 0.5), (int)(y + 0.5));
dc.DrawLine(pralPen, pralBegin, pralEnd);
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -