设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

关于范围内面积公式, 有谁知这些几何形状范围

查看数: 2570 | 评论数: 4 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-10-10 23:12

正文摘要:

本帖最后由 ppspssss 于 2018-10-10 23:15 编辑 这个NPC范围内会开敌D开关,用于NPC在一定范围内可视, 比如圆范围公式,是x+y <= 半径, 那有没其他形状, 比如矩形,三角形等 RUBY 代码复制# ...

回复

shitake 发表于 2018-10-11 13:46:24
本帖最后由 shitake 于 2018-10-11 13:47 编辑

和面积没关系把 你这描述 需要的是碰撞检测算法
a npc 的范围包围盒 和 b npc 的包围盒【当然也可以是个点】

看你之后的讨论 你npc的包围盒是当点来抽象的
那么你需要的是点和多边形的碰撞检测方法

对于圆来说
直接两边平方做比较
轴对齐包围盒【边和坐标轴平行的矩形】
min_x < x < max_x && min_y < y < max_y
三角形之类的大家一般都是统一算到多边形里【矩形当然也是多边形了】

如果只是凸多边形的话 那么只需要把欲检测的点和多边形的每个顶点相连,然后判断这个线和多边形的边有没有交点,没有交点 那么这个点就在多变形内部。


对于线段和线段的碰撞检测
作者:周智
链接:https://www.zhihu.com/question/31763307/answer/53243067
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

问题二:线段与线段的关系线段与线段也只有两种关系:两线段相交两线段无关联这种判断稍微复杂一些,为了更方便计算,涉及到了“平移”、“旋转”等操作。给定线段AB和CD,先将两线段整体平移(注意是整体),让线段AB的A端点与原点(0,0)重合,接着将两线段整体旋转(注意是整体),让线段AB与X轴的正方向重合。

如上图,将任意两线段AB和CD按照“先整体平移,再整体旋转”的顺序操作一遍,最终让线段AB的A端点与原点(0,0)重合,并让线段AB与X轴正方向重合。很显然,任意线段均可以进行以上操作。接下来,再在此基础上进行判断就比较简单了,如果线段CD的两个端点C和D的Y坐标均大于零(分布在第一、二象限)或者均小于零(分布在第三、四象限),那么AB与CD肯定不相交,换句话说,CD的两个端点必须一个在X轴上方另一个在X轴下方时,两条线段才有可能相交。如果线段CD的端点确实是一个在X轴上方一个在X轴下方,接下来再计算直线AB和直线CD(注意这里说的是直线)的交点(这时候两条直线一定有交点,并且交点在X轴上),这里暂定交点为P,如果P在X轴的负方向上(P.X<0),那么说明线段AB和CD不相交,如果P在X轴正方向但是P的X坐标大于线段AB的长度,那么说明线段AB和CD也不相交,其他情况下,线段AB和CD才属于“相交”关系。


还有一个更高效更通用(凹凸都行)的点和多边形碰撞检测的算法 叫 PNPoly
http://riyueshi.github.io/2015/10/07/is_point_in_polygon/

点评

什么形狀最易? 三角形完全看不懂, 略过略过,  发表于 2018-10-11 23:28
ppspssss 发表于 2018-10-11 13:22:13

三角形為什么这么复杂不就是底*高除2

点评

最后 如果你稍微百度一下 就会知道他给出的是三角形面积的行列式求法 这种方法只需要知道三角形的三个顶点坐标就可以了  发表于 2018-10-11 13:55
然后你会发现你要先用三角函数用两个顶点的坐标来算出底的长,而且除非你的三角形都是某一类特殊三角形,否则高也不好给出  发表于 2018-10-11 13:53
硬要说的话 也只能是所指定为底的那条线段的两个顶点坐标和高才能在二维平面下确定一个三角形  发表于 2018-10-11 13:51
首先 请给出底和高 通常三角形的表述都是用三个顶点的坐标来描述 底和高并不能在二维空间内描述一个确定的三角形  发表于 2018-10-11 13:50
张咚咚 发表于 2018-10-11 08:41:34

  1. # 三角
  2. def TriangleArea(x1,y1, x2,y2, x3,y3)
  3.   return ((x1 * y2 + x2 * y3 + x3 * y1 - x2 * y1 - x3 * y2 - x1 * y3) / 2.0).abs
  4. end
  5. x1,y1,x2,y2,x3,y3 = 100,100,50,200,150,200
  6. x,y = 100,150
  7. t = TriangleArea(x1, y1, x2, y2, x3, y3)
  8. a = TriangleArea(x1, y1, x2, y2, x, y) +
  9.   TriangleArea(x1, y1, x, y, x3, y3) +
  10.   TriangleArea(x, y, x2, y2, x3, y3)
  11. if (t - a).abs <= 0.01
  12.   p 'in_triangle'
  13. end

  14. # 矩形
  15. rect = Rect.new(100,100,100,100)
  16. x,y = 150,150
  17. if x.between?(rect.x, rect.x+rect.width) and
  18.   y.between?(rect.y, rect.y+rect.height)
  19.   p 'in_rect'
  20. end

  21. # 圆
  22. rx,ry,rd = 100,100,50
  23. x,y = 120,120
  24. if ((x-rx).abs ** 2 + (y-ry).abs ** 2) ** 0.5 <= rd
  25.   p 'in_circle'
  26. end
复制代码

点评

什么東西完全看不懂  发表于 2018-10-31 22:29

评分

参与人数 2星屑 +90 +1 收起 理由
RyanBern + 90 认可答案
有丘直方 + 1 认可答案

查看全部评分

SixRC 发表于 2018-10-11 08:08:38
|x|+|y| 是菱形◇
x²+y² 才是圆形
|x|,|y|<a,b 是矩形
三角形根据形状自己线性规划下吧

点评

看上下文也应该知道xy指与判断的点的坐标 矩形长宽是a和b  发表于 2018-10-11 13:48
矩形x,y 分別是長宽?  发表于 2018-10-11 13:21
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 13:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表