首页 > 编程语言 >C# 对于点位置的判断

C# 对于点位置的判断

时间:2024-03-13 17:01:56浏览次数:15  
标签:判断 polygon Point C# double 位置 testPoint new public

1.判断点是否在一群点内部

要判断一个点是否在一个由多个点围成的多边形内部(例如一圈点),可以使用射线法(Ray Casting Algorithm)来实现。以下是一个简单的 C# 实现示例

using System;

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class Program
{
    public static bool IsPointInPolygon(Point testPoint, Point[] polygon)
    {
        bool inside = false;
        int count = polygon.Length;
        for (int i = 0, j = count - 1; i < count; j = i++)
        {
            if (((polygon[i].Y > testPoint.Y) != (polygon[j].Y > testPoint.Y)) &&
                (testPoint.X < (polygon[j].X - polygon[i].X) * (testPoint.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) + polygon[i].X))
            {
                inside = !inside;
            }
        }
        return inside;
    }

    public static void Main()
    {
        Point[] polygon = new Point[]
        {
            new Point(0, 0),
            new Point(0, 4),
            new Point(4, 4),
            new Point(4, 0)
        };

        Point testPoint = new Point(2, 2);
        bool isInside = IsPointInPolygon(testPoint, polygon);

        Console.WriteLine($"Point ({testPoint.X}, {testPoint.Y}) is inside the polygon: {isInside}");
    }
}

 2.判断点在直线左侧还是右侧

要在C#中判断一个点在一条直线的左侧还是右侧,可以使用点与直线方程的方法。具体来说,对于直线上的两个点A和B,以及要测试的点P,可以通过计算点P相对于直线AB的位置来确定其是否在直线的左侧还是右侧。

以下是一个简单的C#示例:

using System;

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class Line
{
    public Point A { get; set; }
    public Point B { get; set; }

    public Line(Point a, Point b)
    {
        A = a;
        B = b;
    }

    // 计算点P相对于直线AB的位置
    public double PointRelativeToLine(Point P)
    {
        return (B.X - A.X) * (P.Y - A.Y) - (B.Y - A.Y) * (P.X - A.X);
    }
}

public class Program
{
    public static void Main()
    {
        Point pointA = new Point(1, 1);
        Point pointB = new Point(4, 5);
        Line lineAB = new Line(pointA, pointB);

        Point testPoint = new Point(2, 3);
        double position = lineAB.PointRelativeToLine(testPoint);

        if (position > 0)
        {
            Console.WriteLine("Point is on the left side of the line.");
        }
        else if (position < 0)
        {
            Console.WriteLine("Point is on the right side of the line.");
        }
        else
        {
            Console.WriteLine("Point is on the line.");
        }
    }
}

3.判断两条直线的交点 

要判断两条直线的交点,可以使用直线的参数方程来求解。两条直线的参数方程可以表示为:

直线1: (x = x_1 + t_1 \cdot (x_2 - x_1)) 和 (y = y_1 + t_1 \cdot (y_2 - y_1))

直线2: (x = x_3 + t_2 \cdot (x_4 - x_3)) 和 (y = y_3 + t_2 \cdot (y_4 - y_3))

要求两条直线的交点,需要解方程组,即求解 (t_1) 和 (t_2),然后代入其中一个直线的参数方程中即可求得交点的坐标。

以下是一个C#示例:

using System;

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class Line
{
    public Point A { get; set; }
    public Point B { get; set; }

    public Line(Point a, Point b)
    {
        A = a;
        B = b;
    }

    // 计算两条直线的交点
    public Point IntersectionPoint(Line otherLine)
    {
        double x1 = A.X;
        double y1 = A.Y;
        double x2 = B.X;
        double y2 = B.Y;
        
        double x3 = otherLine.A.X;
        double y3 = otherLine.A.Y;
        double x4 = otherLine.B.X;
        double y4 = otherLine.B.Y;

        double denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);

        if (denominator == 0)
        {
            throw new InvalidOperationException("Lines are parallel. No intersection point exists.");
        }

        double t1 = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denominator;
        double t2 = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denominator;

        double intersectionX = x1 + t1 * (x2 - x1);
        double intersectionY = y1 + t1 * (y2 - y1);

        return new Point(intersectionX, intersectionY);
    }
}

public class Program
{
    public static void Main()
    {
        Point pointA1 = new Point(1, 1);
        Point pointB1 = new Point(4, 5);
        Line line1 = new Line(pointA1, pointB1);

        Point pointA2 = new Point(2, 3);
        Point pointB2 = new Point(6, 1);
        Line line2 = new Line(pointA2, pointB2);

        try
        {
            Point intersectionPoint = line1.IntersectionPoint(line2);
            Console.WriteLine($"Intersection Point: ({intersectionPoint.X}, {intersectionPoint.Y})");
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

标签:判断,polygon,Point,C#,double,位置,testPoint,new,public
From: https://blog.csdn.net/sunyao1314/article/details/136685095

相关文章

  • CG-04 雨量传感器 翻斗式雨量计 防汛哨兵 洪灾水库雨情实时测报
    产品概述CG-04型翻斗式雨量传感器是一种水文、气象仪器,用于测量自然界降雨量,同时将降雨量转换为以开关量形式表示的数字信息量输出,以满足信息传输、处理、记录和显示等的需要。本仪器由承雨器部件和计量部件等组成。承雨口采用口径Φ200mm。计量组件是一个翻斗式机械双稳态秤......
  • docker_02days
    #镜像 dockerpull名字:标签dockerimagesdockerrmi镜像id---------dockerpush本地镜像#把本地镜像推送到自己仓库#容器:镜像运行起来成为一个个容器,一个容器,就当成是一个虚拟机装了个操作系统 dockerpsdockerps-adockerstop......
  • 韩国链游Redbrick名牌零撸教程
    简介:Redbrick是一个基于UGC的元宇宙平台,类似蛋仔派对的游戏,可玩性挺高的,融资1370万美金,是韩国本土项目,韩国项目还是需要注意一下的,上一个超级大毛ZTX也是韩国项目,还有一点就是这个项目非常非常非常冷门,0撸可冲相关概念:GameFi、元宇宙融资信息:融资1370万美元,见下图Airdrop计......
  • kubernetes中使用Service反向代理外部服务
    参考https://blog.csdn.net/weixin_43334786/article/details/128432325当我们的某个服务在外部集群的时候,但是又想k8s集群内的应用连接它,这是可以创建一个service,用service代理外部服务,然后集群内就能连接该service,从而间接的访问外部服务。创建一个service代理外部的服务创......
  • PCB 从入门到未知
    首先声明:本人纯属记录自己的学习过程,如果此篇文章有一丝作用,请点赞加关注,会持续记录自己的学习过程1.新建工程的步骤(1)先建立一个PCB工程(2)给PCB添加一个Schemtic2.安装库文件(1)点击库,进入到安装界面(2)点击安装,找到自己存放库的文件夹(3)选中要安装的文件,然后点击打开即......
  • 19113133262(微信同号)2024年环境能源与全球市场营销国际学术会议(ICEEGM 2024)
    2024年环境能源与全球市场营销国际学术会议(ICEEGM2024)会议主题:(主题包括但不限于,更多主题请咨询会务组苏老师)节能技术煤矿工程与技术能源存储技术可再生能源热能与动力工程 能源工程与环境工程 可再生能源技术和系统能源安全和清洁利用 矿产资源与采矿工......
  • Shopify 商品售卖属性优化插件之G:Variant Image + Color Swatch
    推荐一款很赞的Shopify商品售卖属性呈现样式优化的APP(G:VariantImage+ColorSwatch)安装此类插件列表页效果对比 图片来源:shejolly.com安装此类插件详情页效果对比未安装插件效果,图片来源:shejolly.com已安装插件效果,图片来源:shejolly.com未......
  • 高质量外链 - 神奇的Influence.co
    今天带给大家一个有趣的网站,即可做dofollow链接,也可以做nofollow,主要的点在于在注册的时候如何选择账户类型,共有Influencer,Business,Personal三种,由于我们很多是电商站或企业站,所以很容易选择中间的Business账户类型,我就是这样,一开始注册就选择了Business账户类型,把信息都填好后查......
  • 短链接资源集合 - Bitly, Tinyurl, Cutt, Shorturl, Rebrandly etc
    ShortURLPlatformhttps://t.co/网站权重PA:81,DA:94,SpamScore:N/Ahttps://bitly.com/网站权重PA:77,DA:92,SpamScore:3%https://tinyurl.com/app 网站权重PA:76,DA:94,SpamScore:1%https://cutt.ly/ 网站权重PA:68,DA:92,SpamScore:2%http://ow.ly/......
  • 高质量外链 - PBase.com
    今天分享一个高质量外链源PBase.com,一个个人图片和视频分享平台,个人主页面和Profile页面均为Dofollow链接,域名的权重还非常高的,非常适合用来构建网站高质量外链源。PBase.com网站权重PA:68,DA:87,SpamScore:4%Profile页面-可放置个人网站链接,另外在message板块支持HTML富......