c# 实现求一个点是否在一个面内(分别从矩形、椭圆、多边形以及不规则曲面分析)

本文介绍如何判断一个点是否位于矩形、椭圆或多边形内部。对于矩形,通过比较点的坐标与矩形边界确定;椭圆则利用椭圆方程进行判断;多边形采用射线交叉法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c# 实现求一个点是否在一个面内(分别从矩形、椭圆、多边形分析)

1、矩形

已知矩形的坐标A(x0,y0)和B(x1,y1),求P(x,y)是否在矩形内。
这个只需要判定P点的x是否在x0和x1之间,y是否在y0和y1之间即可。
在这里插入图片描述

if((x0 <x) && (x1 > x) && (y1 < y) && (y< y0))
{
 Console.WriteLine("P在点上")
}else{
 Console.WriteLine("P不在点上")
}
 

2、椭圆

已知椭圆的坐标A(x0,y0)和B(x1,y1),求P(x,y)是否在椭圆内。
求这个之前,要先知道椭圆的计算公式,其中(X,Y)为椭圆的中心点,a,b为椭圆的长短半轴
( x − X ) 2 a 2 + ( y − Y ) 2 b 2 = 1 \frac{(x-X)^2}{a^2}+\frac{(y-Y)^2}{b^2}=1 a2(xX)2+b2(yY)2=1
如果P(x,y)是否在椭圆内,则小于等于1
( x − X ) 2 a 2 + ( y − Y ) 2 b 2 < = 1 \frac{(x-X)^2}{a^2}+\frac{(y-Y)^2}{b^2}<=1 a2(xX)2+b2(yY)2<=1
其中a=(x1-x0)/2,b=(y0-y1)/2,X=(x1-x0)/2+x0,Y=(y0-y1)/2+y1
在这里插入图片描述

double cc = ((x - X) ^2) / (a^2) + ((y - Y) ^2) / b^2;
if (cc <= 1)
{
 Console.WriteLine("P在点上")
}else{
 Console.WriteLine("P不在点上")
}

3、多边形

已知多边形的所有顶点坐标的坐标U(xi,yi),求P(x,y)是否在多边形内。
从P(x,y)这一点向坐标轴做射线,如果交点是奇数点则表明在多边形内,如果是偶数点则表明在多边形外。
在这里插入图片描述

       /// <summary>
        /// 判断当前位置是否在不规则形状里面
        /// </summary>
        /// <param name="nvert">不规则形状的定点数</param>
        /// <param name="testx">当前x坐标</param>
        /// <param name="testy">当前y坐标</param>
        /// <param name="vertx">不规则形状x坐标集合</param>
        /// <param name="verty">不规则形状y坐标集合</param>
        /// <returns></returns>
        public static bool PositionPnpoly(int nvert, List<double> vertx, List<double> verty, double testx, double testy)
        {
            int i, j, c = 0;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((verty[i] > testy) != (verty[j] > testy)) && (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))
                {
                    c = 1 + c; ;
                }
            }
            if (c % 2 == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值