Project1

标题: 关于范围内面积公式, 有谁知这些几何形状范围 [打印本页]

作者: ppspssss    时间: 2018-10-10 23:12
标题: 关于范围内面积公式, 有谁知这些几何形状范围
本帖最后由 ppspssss 于 2018-10-10 23:15 编辑

这个NPC范围内会开敌D开关,用于NPC在一定范围内可视, 比如圆范围公式,是x+y <= 半径, 那有没其他形状, 比如矩形,三角形等
RUBY 代码复制
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
  2. # Simple Event Sensor
  3. # Version: 1.10
  4. # Author : LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
  6. #
  7. # Instruction :
  8. #  
  9. # Set the event name to : <Sensor(RANGE)>
  10. # example :
  11. #            <Sensor4>
  12. #
  13. # If player is in event sensor range, Self switch D (default) will turned ON
  14. #
  15. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
  16.  
  17. class Game_Event < Game_Character
  18. #-----------------------------------------------------------------------
  19.   SENSOR_SELF_SWITCH = 'D'
  20. #-----------------------------------------------------------------------
  21.   alias drago64c_update update
  22.   def update
  23.     sensor_updating unless @unsensor
  24.     drago64c_update  
  25.   end
  26.  
  27.   def sensor_updating
  28.     @event.name =~ /<Sensor(\d+)>/i
  29.     s = [$1.to_i,[$game_map.map_id,@id,SENSOR_SELF_SWITCH],[]]
  30.     s[2] = [(($game_player.x-self.x).abs + ($game_player.y-self.y).abs <=  s[0] ##这里是范圍
  31. ), $game_self_switches[s[1]]] if s[0] > 0   
  32.     return unless s[0] > 0 && s[2][0] != s[2][1]
  33.     $game_self_switches[s[1]], $game_map.need_refresh = s[2][0], true
  34.   end
  35. end



作者: SixRC    时间: 2018-10-11 08:08
|x|+|y| 是菱形◇
x²+y² 才是圆形
|x|,|y|<a,b 是矩形
三角形根据形状自己线性规划下吧
作者: 张咚咚    时间: 2018-10-11 08:41

  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
复制代码

作者: ppspssss    时间: 2018-10-11 13:22
张咚咚 发表于 2018-10-11 08:41

三角形為什么这么复杂不就是底*高除2
作者: shitake    时间: 2018-10-11 13:46
本帖最后由 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/





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1