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

游戏中的数学计算

游戏中的数学计算

判断点是否在圆形区域内

对于一个点 (x,y),它到圆心 (xCenter,yCenter) 的最短距离d_sqr= (xxCenter)^2 +(yyCenter)^2,如果d_sqr小于等于半径 radius^2,那么这个点就在圆内(包括边界)。

判断点是否在正方形区域内

public static bool IsPointInRotatedSquareWithQuickReject(float pointX, float pointY,float squareCenterX, float squareCenterY,float squareSize, float rotationRadians){// 平移坐标到正方形中心float dx = pointX - squareCenterX;float dy = pointY - squareCenterY;// 1. 快速拒绝:外接圆检测 外接圆半径 = (size/2) * √2// √2 ≈ 1.41421356237 → 0.5*1.4142 ≈ 0.7071float circumcircleRadius = squareSize * 0.70710678118f; float distanceSqr = dx * dx + dy * dy;// 如果距离平方 > 外接圆半径平方,直接返回falseif (distanceSqr > circumcircleRadius * circumcircleRadius){return false;}// 2. 精确检测:坐标变换 + 边界判断float cosTheta = MathF.Cos(rotationRadians);float sinTheta = MathF.Sin(rotationRadians);// 将点坐标反向旋转到正方形局部坐标系float localX = dx * cosTheta + dy * sinTheta;float localY = -dx * sinTheta + dy * cosTheta;// 判断局部坐标是否在轴对齐正方形内float halfSize = squareSize / 2;return Math.Abs(localX) <= halfSize && Math.Abs(localY) <= halfSize;}

判断圆形区域与矩形区域 相交

public bool CheckCircleSquareIntersect(LVector2 circleCenter, LFloat circleRadius, LVector2 squareCenter, LFloat squareSize)
{// 计算圆心在正方形坐标系中的偏移量LFloat dx = circleCenter.x - squareCenter.x;LFloat dy = circleCenter.y - squareCenter.y;// 正方形的半边长LFloat halfSize = squareSize / 2;// 约束到正方形边界内的最近点// 即在正方形内 找一个距离圆 最近的点LFloat closestX = LMath.Clamp(dx, -halfSize, halfSize);LFloat closestY = LMath.Clamp(dy, -halfSize, halfSize);// 计算平方距离LFloat distanceSqr = (dx - closestX) * (dx - closestX) + (dy - closestY) * (dy - closestY);// 判断是否相交var checkCircleSquareIntersect = distanceSqr <= (circleRadius * circleRadius);if (checkCircleSquareIntersect){Log.Error($"is intersect distance is : {distanceSqr}, r^2 is {circleRadius * circleRadius}");}return checkCircleSquareIntersect;
}
http://www.xdnf.cn/news/9445.html

相关文章:

  • ORB-SLAM2学习笔记:ExtractorNode::DivideNode和ORBextractor::DistributeOctTree函数详解
  • SAP学习笔记 - 开发14 - 前端Fiori开发 HelloWorld
  • Linux基础指令(一)
  • 木愚科技闪亮第63届高博会 全栈式智能教育解决方案助力教学升级
  • 【容器】docker使用问题处理
  • IoT/基于NB28-A/BC28-CNV通信模组使用AT指令连接华为云IoTDA平台(HCIP-IoT实验2)
  • 打印Yolo预训练模型的所有类别及对应的id
  • 【Rust】Rust获取命令行参数以及IO操作
  • Gartner《2025 年软件工程规划指南》报告学习心得
  • ubuntu国内镜像源手动配置
  • TextIn OCR Frontend前端开源组件库发布!
  • ABP VNext + CRDT 打造实时协同编辑
  • linux中echo命令
  • 深入解析Linux死锁:原理、原因及解决方案
  • 【unity游戏开发——编辑器扩展】EditorUtility编辑器工具类实现如文件操作、进度条、弹窗等操作
  • 计算机网络学习20250528
  • (增强)基于sqlite、mysql、redis的消息存储
  • OpenCV---Canny边缘检测
  • 在 CAD C# 二次开发中,Clipper2、CGAL 和 NTS(NetTopologySuite)对比
  • 上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略
  • 11.14 LangGraph检查点系统实战:AI Agent会话恢复率提升287%的企业级方案
  • cuda编程笔记(2)--传递参数、设备属性
  • RabbitMQ监控:关键技术、技巧与最佳实践
  • 【华为战报】4月、5月 HCIP考试战报!
  • 理解并解决高丢包率问题,构建清晰流畅的实时音视频通话
  • 硬件实时时钟(RTC)
  • java调用C语言的dll方法
  • JWT安全:假密钥.【签名随便写实现越权绕过.】
  • PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
  • TypeScript 中的剩余参数:灵活处理可变数量参数