当前位置: 首页 > wzjs >正文

免费制作微信网页网站凡科登陆网站手机版

免费制作微信网页网站,凡科登陆网站手机版,海南建设厅评审网站,潍坊seo招聘1、向量叉乘法 2、射线法原理 射线法是判断点与多边形位置关系的经典算法,核心思想是: 从目标点发出一条水平向右的射线(数学上可视为 y p_y, x \geq p_x 的射线),统计该射线与多边形边的交点数量: - 偶…

1、向量叉乘法

2、射线法原理

 

射线法是判断点与多边形位置关系的经典算法,核心思想是:

从目标点发出一条水平向右的射线(数学上可视为 y = p_y, x \geq p_x 的射线),统计该射线与多边形边的交点数量:

 

- 偶数次(含0次)相交:点在多边形外部

 

- 奇数次相交:点在多边形内部

 

- 点在边上:直接判定为内部或边界(根据需求处理)

 

关键边界处理

 

1. 边为水平线段( y_1 = y_2 = p_y ):

射线与边重合,若点在边上则直接判定为边界,否则忽略(不计数)。

 

2. 点正好是多边形顶点:

若顶点的两个相邻边分别在射线上下两侧,则计为1次交点;否则不计(避免重复计数)。

 

3. 射线经过边的顶点(非目标点):

仅当该顶点是边的“下端点”(即另一顶点 y > p_y )时,计为1次交点(采用“左闭右开”规则避免重复)。

 

CAD环境下的实现(基于AutoCAD API)

 

假设使用 Autodesk.AutoCAD.DatabaseServices 中的  Polyline  和  Point3d  类型,且所有点的 Z=0 (XY平面)。

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Geometry;

using System;

 

public static class PointInPolylineChecker

{

    /// <summary>

    /// 射线法判断点是否在闭合Polyline内部(处理直线段,忽略凸度/圆弧,如需处理圆弧需额外交点计算)

    /// </summary>

    /// <param name="point">目标点(Z=0)</param>

    /// <param name="polyline">闭合Polyline(顶点按顺序排列,需闭合,最后一点可与第一点重复)</param>

    /// <param name="includeBoundary">是否包含边界(点在边上时返回true)</param>

    /// <returns>true=内部或边界,false=外部</returns>

    public static bool IsPointInside(Point3d point, Polyline polyline, bool includeBoundary = true)

    {

        double px = point.X;

        double py = point.Y;

        int vertexCount = polyline.NumberOfVertices;

        int intersectionCount = 0;

 

        for (int i = 0; i < vertexCount; i++)

        {

            // 获取当前边的两个端点(闭合,最后一个顶点连接到第一个顶点)

            Point3d p1 = polyline.GetPoint3dAt(i);

            Point3d p2 = polyline.GetPoint3dAt((i + 1) % vertexCount);

 

            // 处理点在边上的情况(优先判断边界)

            if (includeBoundary && IsPointOnSegment(point, p1, p2))

                return true;

 

            double y1 = p1.Y;

            double y2 = p2.Y;

 

            // 边为水平线段(与射线共线),跳过(不计入交点)

            if (Math.Abs(y1 - py) < 1e-8 && Math.Abs(y2 - py) < 1e-8)

                continue;

 

            // 边的两个端点都在射线下方或上方,不相交

            if ((y1 < py - 1e-8 && y2 < py - 1e-8) || (y1 > py + 1e-8 && y2 > py + 1e-8))

                continue;

 

            // 计算交点的x坐标(射线为y=py,x≥px)

            double xIntersect;

            double dx = p2.X - p1.X;

            double dy = p2.Y - p1.Y;

 

            // 处理垂直边(避免除零)

            if (Math.Abs(dy) < 1e-8)

                continue; // 已处理水平边,此处为垂直边但y不相等,不可能与射线相交

 

            double t = (py - y1) / dy; // 参数t∈[0,1]表示交点在边上的位置

            xIntersect = p1.X + t * dx;

 

            // 交点必须在射线右侧(xIntersect ≥ px - 1e-8,允许微小误差)且在边的范围内(t∈[0,1])

            if (xIntersect >= px - 1e-8 && t >= -1e-8 && t <= 1 + 1e-8)

            {

                // 处理射线经过顶点的情况(左闭右开规则:仅当顶点是边的“下端点”时计数)

                if ((y1 < py + 1e-8 && y2 >= py + 1e-8) || (y2 < py + 1e-8 && y1 >= py + 1e-8))

                {

                    // 排除顶点在射线上且相邻边同向的情况(避免重复计数)

                    if (!(Math.Abs(y1 - py) < 1e-8 && Math.Abs(y2 - py) < 1e-8))

                        intersectionCount++;

                }

            }

        }

 

        // 奇数次相交则在内部,边界情况已提前处理

        return intersectionCount % 2 == 1;

    }

 

    /// <summary>

    /// 判断点是否在线段上(包含端点,允许1e-8精度误差)

    /// </summary>

    private static bool IsPointOnSegment(Point3d point, Point3d p1, Point3d p2)

    {

        double cross = (point.X - p1.X) * (p2.Y - p1.Y) - (point.Y - p1.Y) * (p2.X - p1.X);

        if (Math.Abs(cross) > 1e-8) return false; // 点不在直线上

 

        double minX = Math.Min(p1.X, p2.X) - 1e-8;

        double maxX = Math.Max(p1.X, p2.X) + 1e-8;

        double minY = Math.Min(p1.Y, p2.Y) - 1e-8;

        double maxY = Math.Max(p1.Y, p2.Y) + 1e-8;

 

        return point.X >= minX && point.X <= maxX && point.Y >= minY && point.Y <= maxY;

    }

}

http://www.dtcms.com/wzjs/813704.html

相关文章:

  • 怎么制作网站教程步骤视频wordpress调用多张产品图片
  • 网站如何做邮箱订阅辽宁住房和城乡建设厅网站
  • 网站开发开题报告关键问题网站建设经营特色
  • 专业律所网站建设广东全网营销与推广公司
  • 做网站小语种翻译多少钱电脑没有网怎么升级wordpress
  • 广州网站网上销售都有哪些平台
  • 营销型网站建设公司平台wordpress 自定义页面 模版
  • 网站推广排名最新报价泌阳县住房和城乡建设局网站
  • 同一ip 网站 权重公司外贸网站怎么做
  • 南海建设局网站wordpress 用户权限分配
  • 哪个网站上做自媒体最好菏泽网站获客网站建设公司
  • 模版网站建设全网营销全网推广
  • 宁国网站开发咖搭姆少儿编程加盟
  • 页面设计好看的网站宁夏住房和城乡建设厅网站首页
  • 网站收录查询情况wordpress主题中文乱码
  • 儿童网站欣赏网页设计与制作课程思政项目构建
  • 黄金网站软件app大全wordpress作者头像
  • 成都找人做网站wordpress 上线
  • 中国交通建设集团有限公司网站什么是企业型网站
  • 深圳网站开发外包哪家好苏州网络推广软件
  • 个人可以备案网站的内容广州学校论坛网站建设
  • 青州做网站的公司怎么找回网站后台密码
  • 做网站 工资高吗中国网站的特点
  • 河北网站制作报价义乌联合外发加工网
  • 专注高密做网站哪家好vs做网站怎样加数据库
  • 设计网站无锡网站建设公司要求什么
  • 朝阳建筑工程建设网站网站弹广告是什么样做的
  • 优化网站目录结构安全的网站建设公
  • ie 10 常用网站网站 的建设意义
  • 海洋网络做网站不负责淘宝免费推广软件