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

    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
时间: 2024-11-10 05:29:13

.Net判断点在三角形内部的问题的相关文章

几何画板如何构造三角形内部的点

  具体的操作步骤如下: 1.构造三角形ABC(线段AB的方向自左向右),在边AB上构造点D. 构造三角形ABC并在AB上取点D 2.选定点D,"度量"--"点的值",得到点值度量值(D为轨迹主动点)."数据"--"新建参数",名称为n,数值为10,单位"无".(内部轨迹线的条数) 度量D点的值并新建参数n 3.做下图的计算.第一个计算把点值扩大 n倍,方便取整.第二个计算将第一个计算的数值取整后再除以n,

写一个判断是否构成三角形的程序

/*please write a program to check three number if can construct a tryaigle*/ #include <iostream> using namespace std; class CheckTriangle { public: CheckTriangle(int x,int y,int z):a(x),b(y),c(z){} void operator()(int x,int y,int z); private: int a,

几何画板如何绘制旋转三角形

  1.利用点工具绘制三个点A.B.C.选中三点,选择"构造"--"过三点弧",继续选择"构造"--"弧内部"--"扇形内部". 2.利用点工具确定圆心.(当点在圆心时,扇形的两条半径会呈高亮状态.)利用线段工具构造扇形的一条半径OD.利用点工具在半径上取一点,选中此点和半径,选择"构造"--"垂线". 3.利用点工具在垂线上取一点E,构造线段DE.OE.选中垂线与垂

判定点是否在不规则多边形内部的问题

问题如下: ? 1 2 3 4 话说在平面内有一个任意的不规则的封闭多边形,另外在这个平面内还有一个点,问题:如何高效的判定这个点是在这个多边形内部还是外部?   补充: 什么是任意的呢?也就是说想让他是啥样就啥样,只要是封闭的多边形就好.为了简化题目,明确这个点不在多边形的线上. 当然,熟悉谷歌和度娘的同学已经搜到了各种正确的不正确的.国内的国外的解法.当然有些参加过ACM比赛的同学在学习.训练或者比赛中,可能也碰到了这个问题. 偶对自己不加思考就直接搜索的表示遗憾,因为你失去了一次自我提升的

C++项目参考解答:三角形类

[项目 - 三角形类雏形] (1)下面设计一个三角形类,请给出各成员函数的定义 class Triangle { public: void setABC(double x, double y, double z);//置三边的值,注意要能成三角形 double perimeter();//计算三角形的周长 double area();//计算并返回三角形的面积 private: double a,b,c; //三边为私有成员数据 }; int main() { Triangle tri1; //

《C++语言基础》实践参考——三角形类2

返回:贺老师课程教学链接 [项目2 - 三角形类2]程序功能同项目1,main()函数如下,请重新定义Triangle类,其中逻辑特别简单的set和get成员函数,要处理为内置成员函数,直接在类内定义. int main() { Triangle tri1; //定义三角形类的一个实例(对象) double x,y,z; cout<<"请输入三角形的三边:"; cin>>x>>y>>z; tri1.setA(x); tri1.setB(y

C++第4周项目2 - 三角形类2

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8690895 [项目2 - 三角形类]程序功能同项目1,main()函数如下,请定义类Triangle,其中逻辑特别简单的set和get成员函数,可以处理为内置成员函数,直接在类内定义. int main() { Triangle tri1; //定义三角形类的

C++第4周(春)项目2 三角形类2

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目2 - 三角形类2]程序功能同项目1,main()函数如下,请重新定义Triangle类,其中逻辑特别简单的set和get成员函数,要处理为内置成员函数,直接在类内定义. int main() { Triangle tri1; //定义三角形类的一个实例(对象) double x,y,z; cout<<"请输入三角形的三边:&

HDU 4380 预处理枚举

题意:给出n个房子m个矿问从n个房子选三个组成的三角形内部矿数为奇数有多少种选法. 先预处理一下每条线段正上方有多少个点,然后在枚举三条线段就可以了. #include <iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; struct point { long long x,y; }; int