C# 判断点是否在多边形内

文章介绍了两种用于判断一个点是否位于多边形内部的算法:射线法和奇偶规则。通过C#代码示例,展示了如何统计射线与多边形交点个数,并根据个数的奇偶性判断点的位置。这两种方法都基于从点出发画射线,然后计算与多边形边的交点情况来确定点的内外位置。
摘要由CSDN通过智能技术生成

要判断一个点是否在多边形内,可以使用射线法或者奇偶规则。下面分别介绍这两种方法的实现。

射线法
射线法的思路是从点出发,向任意方向发出一条射线,统计射线与多边形的交点个数。如果交点个数为奇数,则点在多边形内,否则不在多边形内。下面是使用 C# 实现射线法判断点是否在多边形内的一个例子:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // 假设有一个多边形,由以下四个点构成
        List<PointF> polygon = new List<PointF> { new PointF(0, 0), new PointF(2, 0), new PointF(2, 2), new PointF(0, 2) };

        // 假设有一个点,坐标为 (1, 1)
        PointF point = new PointF(1, 1);

        // 统计射线与多边形的交点个数
        int count = 0;
        for (int i = 0; i < polygon.Count; i++)
        {
            PointF p1 = polygon[i];
            PointF p2 = polygon[(i + 1) % polygon.Count];

            if (p1.Y == p2.Y) continue; // 排除水平边

            if (point.Y >= Math.Min(p1.Y, p2.Y) && point.Y < Math.Max(p1.Y, p2.Y))
            {
                float x = (point.Y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X;
                if (x > point.X) count++;
            }
        }

        // 判断点是否在多边形内
        bool isInside = count % 2 == 1;

        Console.WriteLine(isInside ? "点在多边形内" : "点不在多边形内");
    }
}

该程序中,多边形由四个点构成,点的坐标为 (1, 1)。程序统计射线与多边形的交点个数,并根据交点个数的奇偶性进行判断,最终输出结果。

奇偶规则
奇偶规则的思路是从点出发,向任意方向发出一条射线,统计射线与多边形的交点个数。如果交点个数为奇数,则点在多边形内,否则不在多边形内。与射线法不同的是,奇偶规则不需要考虑射线的方向。下面是使用 C# 实现奇偶规则判断点是否在多边形内的一个例子:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // 假设有一个多边形,由以下四个点构成
        List<PointF> polygon = new List<PointF> { new PointF(0, 0), new PointF(2, 0), new PointF(2, 2), new PointF(0, 2) };

        // 假设有一个点,坐标为 (1, 1)
        PointF point = new PointF(1, 1);

        // 统计射线与多边形的交点个数
        int count = 0;
        for (int i = 0; i < polygon.Count; i++)
        {
            PointF p1 = polygon[i];
            PointF p2 = polygon[(i + 1) % polygon.Count];

            if (point.Y >= Math.Min(p1.Y, p2.Y) && point.Y < Math.Max(p1.Y, p2.Y))
            {
                if (p1.X == p2.X) continue; // 排除竖直边

                float x = (point.Y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X;
                if (x > point.X) count++;
            }
        }

        // 判断点是否在多边形内
        bool isInside = count % 2 == 1;

        Console.WriteLine(isInside ? "点在多边形内" : "点不在多边形内");
    }
}

该程序中,多边形由四个点构成,点的坐标为 (1, 1)。程序统计射线与多边形的交点个数,并根据交点个数的奇偶性进行判断,最终输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值