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

简介: class CalcArea { //点 public class Point { private double x; pr...



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

        }
    }

        #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



相关文章
|
3月前
|
C# Android开发 iOS开发
一组.NET MAUI绘制的开源控件 - AlohaKit
一组.NET MAUI绘制的开源控件 - AlohaKit
|
开发框架 .NET C#
如何判断一个 Dot Net 程序是 32 位还是 64 位?
如何判断一个 Dot Net 程序是 32 位还是 64 位?
|
存储 C#
【.Net底层剖析】2.stfld指令-给对象的字段赋值
【.Net底层剖析】2.stfld指令-给对象的字段赋值
171 0
【.Net底层剖析】2.stfld指令-给对象的字段赋值
|
C#
.NET6新东西--插值字符串优化
.NET6新东西--插值字符串优化
259 0
|
索引 Windows
一起谈.NET技术,Silverlight中使用递归构造关系图
  这两天遇到一个问题,项目中需要在silverlight中使用连接图的方式来显示任务之间的关系,总体有父子和平行两种,昨天在改同事的代码,一直出问题,索性晚上写了一下实现方法。   需求   有一个List对象中存了若干个Task,这些Task对象通过ParentID属性进行关联,现在要求将这个List中的任务使用图的方式形成如父子关系和平行关系的图示例如下图:   实现方法思考   刚开始接到这个任务我就想着递归应该可以搞定了,但是仔细考虑才发现每个任务的子任务需要在一定区域内才行,需要计算子级和子级之间的距离,如果使用递归,例如上图的元素“12”的位置就没有办法很好确定了。
709 0
|
C# 图形学
一起谈.NET技术,C#创建不规则窗体的几种方式
现在,C#创建不规则窗体不是一件难事,下面总结一下:       一、自定义窗体,一般为规则的图形,如圆、椭圆等。 做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下: System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath(); shape.AddEllipse(0,0,this.Height, this.Width); this.Region = new Region(shape); 即重绘窗体的规则。
1177 0
一起谈.NET技术,.NET 3.x新特性之自动属性及集合初始化
  今天公司弄了个VS2008 beta 2中文版,虽然很大一部分是为了JS的智能提示外,也应该好好的温习一下.NET的一些新特性,由于以前写过一些文章,但是都没有系统的学过,都只是尝一下新鲜感。不知道从那开始,所以今天就来看看自动话属性,以及对象初始化和集合初始化的一些新特性。
673 0
|
API
晚绑定场景下对象属性赋值和取值可以不需要Pro“.NET研究”pertyInfo
  在《一句代码实现批量数据绑定》中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定。由于里面频繁涉及对属性的反射——通过反射从实体对象中获取某个属性值;通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式。
829 0
|
存储 .NET 开发框架
ASP.NET页面之间传递值的几种方式
  页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。
1510 0

热门文章

最新文章