.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月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
开发框架 .NET C#
如何判断一个 Dot Net 程序是 32 位还是 64 位?
如何判断一个 Dot Net 程序是 32 位还是 64 位?
|
索引 Windows
一起谈.NET技术,Silverlight中使用递归构造关系图
  这两天遇到一个问题,项目中需要在silverlight中使用连接图的方式来显示任务之间的关系,总体有父子和平行两种,昨天在改同事的代码,一直出问题,索性晚上写了一下实现方法。   需求   有一个List对象中存了若干个Task,这些Task对象通过ParentID属性进行关联,现在要求将这个List中的任务使用图的方式形成如父子关系和平行关系的图示例如下图:   实现方法思考   刚开始接到这个任务我就想着递归应该可以搞定了,但是仔细考虑才发现每个任务的子任务需要在一定区域内才行,需要计算子级和子级之间的距离,如果使用递归,例如上图的元素“12”的位置就没有办法很好确定了。
706 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); 即重绘窗体的规则。
1167 0
一起谈.NET技术,生成不重复的随机数的二种方法
下面我以生成1-10之间的10个不重复的随机数为例介绍生成不重复的随机数的三种方法:1. 通过while循环来实现通过while循环不停的生成随机数,直到生成一个不重复的为止,这种方法比较容易想到,但是效率也比较低下,实例代码如下: static void Main(stri...
1043 0
一起谈.NET技术,.NET 3.x新特性之自动属性及集合初始化
  今天公司弄了个VS2008 beta 2中文版,虽然很大一部分是为了JS的智能提示外,也应该好好的温习一下.NET的一些新特性,由于以前写过一些文章,但是都没有系统的学过,都只是尝一下新鲜感。不知道从那开始,所以今天就来看看自动话属性,以及对象初始化和集合初始化的一些新特性。
667 0
|
.NET 容器
一句代码实现批量数“.NET研究”据绑定[上篇]
  对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定。如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定。为了验证这种想法,我写了一个小小的组件。
815 0
|
缓存 Java 安全
.NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
原文:.NET获取枚举DescriptionAttribute描述信息性能改进的多种方法 一. DescriptionAttribute的普通使用方式 1.1 使用示例   DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显示...
1012 0