c#判断两线段是否相交

来源:互联网 发布:用c语言打印出一个心形 编辑:程序博客网 时间:2024/06/03 07:02

        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;
            }
        }
    }

 

原创粉丝点击