编程之美4.4 扩展问题——判断点位于多边形内部

程序流程图绘制实战:从需求到代码的详细设计指南 程序流程图是软件详细设计阶段的核心工具,它通过标准化的图形符号,将复杂的业务逻辑清晰地转化为算法与执行顺序的可视化表达。其核心原理在于将概要设计中的模块“黑盒”分解为可编码实现的“白盒”过程,不仅明确了“做什么”,更精确规定了“怎么做”和“按什么顺序做”。在工程实践中,掌握高质量流程图的绘制方法,能极大提升开发效率、保障代码质量并促进团队协作。无论是构建学生信息管理系统,还是开发其他业务模块,流程图都是确保逻辑严谨、减少返工的关键。本文将以“成绩修改模块”为例,深入解析如何通过分层绘制、显式表达异常处理等技 阅读详情
首先说明的是此多边形是任意多边形,包括凹多边形:
方法一:射线法
以此点为原点的向右水平射线如果相交于多边形的点的个数为奇数个,则此点在多边形内部,但需要注意几个trick:
  • 有可能射线与某条边的端点相交,如果相交的端点的纵坐标是较大的那个,则记录,否则忽略
  • 有可能射线与某条边完全覆盖,忽略即可
用Java写了一个代码,没有测试,但基本思路是这样的:
public class CheckInPolygon {
      
       private int xmult(int x0, int y0,int x1,int y1, int x2,int y2){
             return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
      }
      
       private boolean isInSpanInclude(int y1, int y2,int y){
             if(y1>y2)
                   return (y<=y1)&&(y>=y2);
             else
                   return (y<=y2)&&(y>=y1);
      }
      
       private boolean isInSpanExclude(int y1, int y2,int y){
             if(y1>y2)
                   return (y<y1)&&(y>y2);
             else
                   return (y<y2)&&(y>y1);
      }
      
       /*
       * The polygon is presented by anti-clockwise points (pointsX[],pointsY[])
       */
       public boolean isInPolygon(int[] pointsX, int[] pointsY,int x,int y){
            
             int N = pointsX.length ;
             int num = 0;
            
             for(int i=0;i<N-1;i++){
                   int x1 = pointsX[i], x2 = pointsX[i+1];
                   int y1 = pointsY[i], y2 = pointsY[i+1];
                   if(isOnSegment(x1,y1,x2,y2,x,y))
                         return true ;
                   else{
                         if(y==y1&&y==y2){continue;}
                         else{
                               if(y1>y2){
                                     if(y==y1 || isInSpanExclude(y1, y2, y)){
                                           if(xmult(x,y,x2,y2,x1,y1)>0)
                                                num++;
                                    }
                              }
                               else{
                                     if(y==y2 || isInSpanExclude(y1, y2, y)){
                                           if(xmult(x,y,x1,y1,x2,y2)>0)
                                                num++;
                                    }
                              }
                        }
                  }
            }
            
             int x1 = pointsX[N-1], x2 = pointsX[0];
             int y1 = pointsY[N-1], y2 = pointsY[0];
             if(isOnSegment(x1,y1,x2,y2,x,y))
                   return true ;
             else{
                   if(y==y1&&y==y2){}
                   else{
                         if(y1>y2){
                               if(y==y1 || isInSpanExclude(y1, y2, y)){
                                     if(xmult(x,y,x2,y2,x1,y1)>0)
                                          num++;
                              }
                        }
                         else{
                               if(y==y2 || isInSpanExclude(y1, y2, y)){
                                     if(xmult(x,y,x1,y1,x2,y2)>0)
                                          num++;
                              }
                        }
                  }
            }
            
             if(num%2==1) return true;
             return false ;
      }

       private boolean isOnSegment (int x1, int y1, int x2, int y2, int x, int y) {
             return isInSpanInclude(y1,y2,y)&&(xmult(x,y,x1,y1,x2,y2)==0);
      }

}

方法二:角度和判别法
如果此点在多边形内部,它连接的相邻的两个点构成的角的和一定是360度

Molflow新手必看:Facet基础操作全解析(从2D建模到3D拉伸) 本文为Molflow新手提供了Facet基础操作的全面解析,涵盖从2D图形创建到3D模型拉伸的完整流程。详细介绍了Facet作为几何建模基石的核心概念、顶点编辑、布尔运算以及拉伸、放样等关键操作,并深入讲解了如何为其配置物理参数以实现真空系统的蒙特卡洛模拟。 阅读详情

相关推荐

OpenCV棋盘格角点检测实战:从胶带干扰到完美标定的5个避坑技巧

本文深入探讨了OpenCV中棋盘格角点检测的实战技巧,重点分析了透明胶带等干扰因素对角点检测的影响。通过解析FindChessboardCorners函数的核心机制、提供环境优化方案和高级参数调优方法,帮助开发者避开常见陷阱,实现稳定可靠的相机标定。

weixin_29074295的博客 442

Unity3D虚拟装配:机械运动交互设计与实现全流程解析

虚拟仿真技术通过构建三维交互环境,为复杂机械设备的认知与操作提供了安全、低成本的解决方案。其核心原理在于利用实时渲染引擎模拟物理世界,通过数学计算与物理引擎的结合,精确控制物体的运动与约束。这项技术的价值在于能够将抽象的机械原理转化为直观的交互体验,广泛应用于工业培训、产品展示和教育领域。在具体实现中,从CAD模型导入、交互逻辑设计到运动链求解,构成了完整的技术闭环。本文聚焦于Unity3D引擎,深入探讨了如何实现**SolidWorks模型导入Unity3D**后的精确装配判定与**自动吸附**机制,为开

weixin_30856725的博客 332

Blender网格优化与拓扑重构:减面、重拓扑及导出避坑指南

多边形网格是三维建模的基础,其拓扑结构直接影响细分、UV展开、骨骼绑定与引擎导入的表现。合理的边缘流与顶点分布能避免拉伸、权重异常和渲染黑边等问题。通过减面工具、重拓扑插件和手工规划循环边,可在保留轮廓特征的前提下控制面数预算,使资产同时满足高模细节与低模性能需求。该流程广泛应用于游戏低模制作、雕刻模型优化、UE5资产导入及3D打印数据修复等场景。Blender提供了Decimate、Remesh、Un-Subdivide等高效方案,结合手工重拓扑与脚本化批量处理,可显著提升模型复用率与项目迭代效率。

weixin_34007886的博客 322

判定一个点是否在多边形内部

判定一个点是否在多边形内部 问题 假设我们有一个多边形由n个点组成Pn={p1,p2,p3,p4,p5...pn} , 求一个点p(x,y)是否在多边形内? 在图形编程中,坐标的利用是不可忽视的。在这里判断一个点是否在多边行内部(可以包括线上)就要利用到各个点的坐标关系。下面开始讨论具体的方法。 解决 首先要讲究速度,在运行复杂的算法之前,我们首先做一个简单的判定。在多边

luyuncsd123的专栏 1万+

模块化建筑资产制作全流程:从规范到白模验证

模块化设计是一种将复杂系统拆分为标准化单元,再通过组合实现多样性的工程方法。在建筑资产制作中,模块化不仅是把建筑拆成零件,更重要的是建立统一的网格对齐、尺度、命名和目录规范,确保不同零件能够精确拼接。白模验证通过最小封闭单元的组合测试,可以在早期发现拼接缝隙、转角偏差等问题,避免高模阶段返工。脚本批处理则能高效管理原点、命名与导出流程,为长期资产库维护提供工程化支撑。该流程广泛应用于游戏场景、建筑可视化、虚拟展厅和数字孪生项目,适用于需要长期复用资产库的团队。基于这些核心实践,本文系统梳理了模块化建筑资产从

weixin_34318272的博客 498

自研透视变形模板匹配:OpenCV实现类Halcon平面可变形定位算法

在机器视觉定位任务中,当目标物体发生倾斜或轻微变形时,传统模板匹配往往失效,而基于单应矩阵的透视变形匹配成为关键。单应矩阵仅需8个自由度即可描述平面物体的任意姿态投影,叠加TPS形变场还能适应局部起伏。相比Halcon的find_planar_uncalib_deformable_model,OpenCV生态下的自研算法可以自由裁剪中间步骤,便于嵌入自定义测量流程。这类技术广泛应用于PCB定位、手机中框检测、纸张边缘提取等场景。文章拆解基于OpenCV的透视变形模板匹配算法原理,从金字塔粗配准到反向组合迭代

weixin_29057163的博客 273

[OpenCV] 练习题 1. 在最后一个示例中,我们绘制了填充矩形。您修改代码以绘制一个未填充的矩形。

在最后一个示例中,我们绘制了填充矩形。您修改代码以绘制一个未填充的矩形。 ps:手册中,官方提供了一个绘制填充矩形的demo,是练习题的背景。 关于cv.rectangle 如下 2. 代码部分 import numpy as np import cv2 as cv drawing = False # 如果按下鼠标,则为真 mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线 ix,

江南蜡笔小新 791

Unity粒子特效深度解析:从核心参数到实战优化

粒子系统是实时渲染与游戏开发中实现动态视觉效果的核心技术之一,其原理在于通过程序化控制大量微小图元(粒子)的生成、运动、变化与消亡,来模拟自然现象或创造艺术表达。从技术价值看,它能在较低计算成本下,极大地增强场景的氛围感、交互反馈与视觉冲击力。在应用场景上,粒子特效广泛应用于游戏技能、环境天气、UI反馈以及影视后期等领域。本文聚焦于Unity引擎的粒子系统,深入拆解其外观、运动、生命周期与渲染等核心模块的参数逻辑,并结合暴风雪、技能释放等实战案例,探讨如何通过噪声模块、生命周期控制及渲染排序等关键技术,解决

weixin_30723433的博客 317

Unity Tilemap性能优化:从原理到实践的加速器插件深度解析

在2D游戏开发中,渲染优化是提升性能的核心环节,其原理在于减少绘制调用和优化资源管理。通过合批技术将多个渲染请求合并,能有效降低CPU到GPU的通信开销,从而提升帧率。这一技术对于大型地图、复杂场景的流畅运行具有关键价值,尤其在平台跳跃、RPG和策略类游戏中应用广泛。Tilemap作为2D地图的主流构建方式,其原生系统在处理超大规模网格时,常面临编辑卡顿与运行时渲染效率低下的挑战。本文聚焦的Tilemap加速器插件,正是针对这些痛点,通过数据分块、智能笔刷和增强合批等机制,实现了编辑流程与运行时性能的显著提

anvt77205的博客 401

Unity中Spine运行时下载、导入与核心使用指南

骨骼动画是2D游戏开发中实现角色流畅动作的核心技术,它通过模拟生物骨骼结构驱动网格变形,相比传统序列帧动画能大幅降低资源体积并提升动画灵活性。其技术价值在于支持实时混合、程序化控制与高效渲染,广泛应用于2D角色动画、UI动效和交互式内容。在Unity引擎中,Spine作为专业的2D骨骼动画解决方案,通过其运行时库实现动画数据的解析与播放。本文将围绕Spine Unity运行时的下载导入流程展开,详细说明如何从官方渠道获取资源包、处理常见的依赖与兼容性问题,并解析SkeletonAnimation等核心组件的

weixin_30412167的博客 306

Marvelous Designer 10 从入门到精通:3D服装设计与布料模拟全流程指南

3D服装设计是数字内容创作中的关键技术环节,它基于物理模拟原理,通过计算布料与虚拟角色的动态交互,实现高度真实的服装褶皱与垂坠效果。这项技术的核心价值在于,它能够将传统服装设计的打版、缝纫工艺数字化,极大地提升了游戏、影视动画及虚拟数字人项目中角色服装的制作效率与视觉保真度。在应用场景上,从角色绑定动画到虚拟直播,高质量的动态服装都是提升沉浸感的关键要素。本文以行业标准工具 **Marvelous Designer 10** 为例,深入解析其核心工作流,涵盖从版片创建、**缝纫**逻辑到**布料模拟**参数

weixin_30876945的博客 396

C#实现二维多边形碰撞检测:分离轴定理详解与性能优化

碰撞检测是计算机图形学与游戏开发中的基础技术,用于判断两个或多个几何图形是否发生重叠或接触。其核心原理是通过数学方法分析图形间的空间关系,分离轴定理(SAT)便是其中一种高效算法,它将复杂的二维形状重叠问题转化为一系列一维投影区间的重叠判断。这项技术的工程价值在于为游戏物理引擎、工业仿真、CAD软件等提供了精确的交互基础,直接影响用户体验的真实感与流畅度。本文聚焦于C#语言环境,深入解析SAT算法的实现细节,并探讨了浮点数精度处理、最小平移向量计算等关键实践,同时结合性能优化技巧,如包围盒预过滤和空间划分,

benben 313

用Paint+PPT打造线上物理课的黑板感

物理教学的本质是动态思维过程的可视化,而非静态知识传递。理解力的合成、电磁场线、波动干涉等核心概念,依赖实时书写、分层呈现与视觉引导三大能力。传统PPT缺乏手写亲和力,专业白板又门槛高、延迟大;而Windows原生Paint具备零安装、低延迟、像素级精准等不可替代优势,配合PPT作为‘内容导演台’,可实现公式推导、受力分析、矢量标注等关键教学行为的自然生成。该方案已在大学物理线上课堂持续验证三年,显著降低矢量方向错误率、提升过程分析得分,并被广泛应用于无专用硬件、低带宽环境下的工程教育实践。

weixin_30425949的博客 424

Unity像素艺术PPU实战:彻底解决60像素格子贴合缝隙问题

在2D游戏开发与计算机图形学中,纹理映射与坐标变换是确保视觉元素精确呈现的核心原理。PPU(Pixels Per Unit,每单位像素数)作为连接美术资源像素空间与游戏世界空间的关键桥梁,其正确配置直接决定了渲染的精度。从技术价值看,精确的PPU映射能避免亚像素渲染导致的边缘模糊和颜色渗透,是实现像素艺术风格清晰、锐利视觉效果的基础,尤其在追求复古或风格化表现的独立游戏中至关重要。其应用场景广泛覆盖了像素风游戏开发、2D UI资源制作以及Tilemap瓦片系统构建。本文将深入探讨如何通过设置**过滤模式(F

weixin_34280237的博客 425

Unity集成ArcGIS Online构建三维地球:瓦片加载与坐标转换实战

网络地图瓦片服务(如WMTS/TMS)是地理信息系统(GIS)和三维可视化领域的基础技术,它通过将地图切割成标准化的图片块,实现了海量地理数据的动态加载与高效渲染。其核心原理在于将地理坐标(经纬度)通过Web墨卡托投影转换为平面坐标,再根据缩放级别离散化为瓦片行列号,从而支持从全球概览到局部细节的无级缩放。这项技术的工程价值在于,它使得在游戏引擎或三维应用中集成真实世界地图成为可能,极大地降低了地理数据获取与处理的成本。在**Unity**引擎中,结合**ArcGIS Online**提供的权威、现成的影像

weixin_34186128的博客 381

Daz角色转Metahuman全流程:在UE5中实现高保真数字人迁移与驱动

数字角色创建是计算机图形学与游戏开发的核心领域,其核心目标是将高精度模型转化为可在实时引擎中高效驱动与渲染的资产。这一过程涉及三维数据转换、拓扑适配与材质重映射等关键技术。其技术价值在于打通了传统高模雕刻资产与次世代实时管线之间的壁垒,极大地提升了角色资源的复用率和创作效率。在虚拟制片、游戏开发、虚拟主播和实时叙事等应用场景中,实现高质量数字人的快速生产与驱动至关重要。本文聚焦于利用Mesh to MetaHuman工具链,将Daz Studio中的静态角色模型,通过几何形状映射、纹理烘焙和绑定适配,成功迁

weixin_30628801的博客 596

Rhino 8.26跨平台建模升级:NURBS、SubD与Grasshopper三角协同

NURBS和SubD是工业级三维建模的两大核心范式,前者保障A级曲面精度,后者提升自由塑形效率;Grasshopper则代表参数化逻辑驱动的设计方法论。Rhino 8.26首次在底层实现三者内存统一调度,突破传统工作流割裂——NURBS求交算法优化至O(n log n),SubD升格为G2连续的NURBS片集合,Grasshopper 2.0成为原生内核模块。这一技术融合显著提升汽车曲面评审、船舶船体建模、建筑表皮参数化等高精度场景的响应速度与数据一致性。尤其在跨平台(Windows ARM64/macOS

dgqvhtlwq472235338的博客 346

Decoder如何工作、Transformer如何训练、以及exposure bias问题

1、结合图文描述Decoder中各个模块是什么,以及是如何工作的。2、transformer是如何训练的。3、exposure bias问题造成的原因及解决方法

m0_59113542的博客 3344
上一篇: 树形DP——POJ1947 and POJ2486
下一篇: 【OpenGL Tutorial】Part0:搭建环境
whosemario
博客等级 码龄16年 22粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值