您的位置:首页 > 编程语言 > C#

c#判断两线段是否相交

2013-05-28 12:58 615 查看
Line line1 = new Line();

Line line2 = new Line();

public Form1()

{

InitializeComponent();

}

/// <summary>

/// 判断直线2的两点是否在直线1的两边。

/// </summary>

/// <param name="line1">直线1</param>

/// <param name="line2">直线2</param>

/// <returns></returns>

private bool CheckCross(Line _line1, Line _line2)

{

PointF v1 = new PointF();

PointF v2 = new PointF();

PointF v3 = new PointF();

v1.X = _line2.X1 - _line1.X2;

v1.Y = _line2.Y1 - _line1.Y2;

v2.X = _line2.X2 - _line1.X2;

v2.Y = _line2.Y2 - _line1.Y2;

v3.X = _line1.X1 - _line1.X2;

v3.Y = _line1.Y1 - _line1.Y2;

return (CrossMul(v1, v3) * CrossMul(v2, v3) <= 0);

}

/// <summary>

/// 判断两条线段是否相交。

/// </summary>

/// <param name="line1">线段1</param>

/// <param name="line2">线段2</param>

/// <returns>相交返回真,否则返回假。</returns>

private bool CheckTwoLineCross(Line _line1, Line _line2)

{

return CheckCross(_line1, _line2) && CheckCross(_line2, _line1);

}

/// <summary>

/// 计算两个向量的叉乘。

/// </summary>

/// <param name="pt1"></param>

/// <param name="pt2"></param>

/// <returns></returns>

private float CrossMul(PointF pt1, PointF pt2)

{

return pt1.X * pt2.Y - pt1.Y * pt2.X;

}

private void button1_Click(object sender, EventArgs e)

{

line1.X1 = float.Parse(tbLine1X1.Text);

line1.Y1 = float.Parse(tbLine1Y1.Text);

line1.X2 = float.Parse(tbLine1X2.Text);

line1.Y2 = float.Parse(tbLine1Y2.Text);

line2.X1 = float.Parse(tbLine2X1.Text);

line2.Y1 = float.Parse(tbLine2Y1.Text);

line2.X2 = float.Parse(tbLine2X2.Text);

line2.Y2 = float.Parse(tbLine2Y2.Text);

this.panel1.Invalidate();

bool b = CheckTwoLineCross(line1, line2);

if (b == true)

this.lbs.Text = "两线段相交";

else

this.lbs.Text = "两线段不相交";

}

private void panel1_Paint(object sender, PaintEventArgs e)

{

Graphics gs = e.Graphics;

gs.PageUnit = GraphicsUnit.Pixel;

gs.Clip = new Region(new Rectangle(0, 0, this.panel1.Width, this.panel1.Height));

gs.Clear(Color.White);

gs.DrawLine(Pens.Black, line1.X1, line1.Y1, line1.X2, line1.Y2);

gs.DrawLine(Pens.Black, line2.X1, line2.Y1, line2.X2, line2.Y2);

}

class Line

{

private float x1;

private float y1;

private float y2;

private float x2;

public float X1

{

get

{

return this.x1;

}

set

{

this.x1 = value;

}

}

public float Y1

{

get

{

return this.y1;

}

set

{

this.y1 = value;

}

}

public float X2

{

get

{

return this.x2;

}

set

{

this.x2 = value;

}

}

public float Y2

{

get

{

return this.y2;

}

set

{

this.y2 = value;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: