08
2014
01

.Net判断点在三角形内部的问题


//code

class CalcArea  

{  

    //点  

    public class Point  

    {  

        private double x;  

        private double y;  

        public Point(double a, double b)  

        {  

            x = a;  

            y = b;  

        }  

        public double getX()  

        {  

            return x;  

        }  

        public double getY()  

        {  

            return y;  

        }  

        public void setX(double a)  

        {  

            x = a;  

        }  

        public void setY(double b)  

        {  

            y = b;  

        }  

    }  

  

    //边  

    public class Line  

    {  

        private Point p1;  

        private Point p2;  

  

        public Line(Point x, Point y)  

        {  

            p1 = x;  

            p2 = y;  

        }  

        public Point getP1()  

        {  

            return p1;  

        }  

        public Point getP2()  

        {  

            return p2;  

        }  

  

        public void setP1(Point x)  

        {  

            p1 = x;  

        }  

        public void setP2(Point x)  

        {  

            p2 = x;  

        }  

    }  

  

    //三角形  

    public class Triangle  

    {  

        private Point p1;  

        private Point p2;  

        private Point p3;  

  

        public Triangle(Point a, Point b, Point c)  

        {  

            p1 = a;  

            p2 = b;  

            p3 = c;  

        }  

  

        public Point getP1()  

        {  

            return p1;  

        }  

        public Point getP2()  

        {  

            return p2;  

        }  

        public Point getP3()  

        {  

            return p3;  

        }  

        public void setP1(Point x)  

        {  

            p1 = x;  

        }  

        public void setP2(Point x)  

        {  

            p2 = x;  

        }  

        public void setP3(Point x)  

        {  

            p3 = x;  

        }  

    }  

  

    //计算三角形面积  

    public class Util  

    {  

        //计算两点间距离  

        public static double dispp(Point p1, Point p2)  

        {  

            double distX = p1.getX() - p2.getX();  

            double distY = p1.getY() - p2.getY();  

            return Math.Sqrt(distX * distX + distY * distY);  

  

        }  

        //点到直线的距离  

        public static double displ(Point p, Line l)  

        {  

  

            double lx1 = l.getP1().getX();  

            double lx2 = l.getP2().getX();  

            double ly1 = l.getP1().getY();  

            double ly2 = l.getP2().getY();  

            double k = (ly2 - ly1) / (lx2 - lx1);  

            double b = ly1 - k * lx1;  

            return Math.Abs((p.getY() - k * p.getX() - b)) / Math.Sqrt((k * k + 1));  

  

        }  

        //计算面积  

        public static double triArea(Triangle t)  

        {  

  

            Line l = new Line(t.getP1(), t.getP2());  

            return Util.dispp(t.getP1(), t.getP2()) * Util.displ(t.getP3(), l) / 2;  

  

        }  

        //向量方法计算  

        public static double triArea1(Triangle t)  

        {  

            double area = 0;  

            double a = Util.dispp(t.getP1(), t.getP2());  

            double b = Util.dispp(t.getP2(), t.getP3());  

            double c = Util.dispp(t.getP1(), t.getP3());  

            double d = (a + b + c) / 2;  

            area = Math.Sqrt(d * (d - a) * (d - b) * (d - c));  

            return area;  

        }  

    }  

}  


//test code

#region testTriangle  

/// <summary>  

/// 计算点在不在三角形内部  

/// </summary>  

private void testTriangle()  

{  

    CalcArea.Point p1 = new CalcArea.Point(-1, 1);  

    CalcArea.Point p2 = new CalcArea.Point(1, 0.5);  

    CalcArea.Point p3 = new CalcArea.Point(2, -3);  

    double x = 0.8;  

    double y = 0.3;  

    CalcArea.Point p4 = new CalcArea.Point(x, y);  

    CalcArea.Triangle t;  

    t = new CalcArea.Triangle(p1, p2, p3);  

    double sourceArea = Convert.ToDouble(CalcArea.Util.triArea(t));  

    t = new CalcArea.Triangle(p1, p2, p4);  

    double area1 = Convert.ToDouble(CalcArea.Util.triArea1(t));  

    t = new CalcArea.Triangle(p3, p2, p4);  

    double area2 = Convert.ToDouble(CalcArea.Util.triArea1(t));  

    t = new CalcArea.Triangle(p1, p3, p4);  

    double area3 = Convert.ToDouble(CalcArea.Util.triArea1(t));  

    if (sourceArea == (double)((int)((area1 + area2 + area3) * 100)) / 100)  

    {  

        Console.WriteLine("点在三角形内部!");  

    }  

    else  

    {  

        Console.WriteLine("点不在三角形内部!");  

    }  

    Console.ReadLine();  

}   

#endregion  




版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇下一篇 »

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。