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

Project1

 找回密码
 注册会员
搜索
查看: 103|回复: 11

[有事请教] 关于范围内面积公式, 有谁知这些几何形状范围

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2801
在线时间
192 小时
注册时间
2016-9-20
帖子
161
发表于 2018-10-10 23:12:32 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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

形狀

形狀

QQ截图20181010231457.png

Lv3.寻梦者

梦石
0
星屑
3810
在线时间
1003 小时
注册时间
2014-10-4
帖子
321
发表于 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
K
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4900
在线时间
1272 小时
注册时间
2013-1-11
帖子
934
发表于 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
复制代码

评分

参与人数 1+1 收起 理由
有丘直方 + 1 认可答案

查看全部评分

梦 幻 冒 险 记
定 时 器 辅 助
鼠 标 组 件

写脚本,三分靠颜值,七分靠运气。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2801
在线时间
192 小时
注册时间
2016-9-20
帖子
161
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2165
在线时间
945 小时
注册时间
2016-4-7
帖子
897

开拓者

发表于 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
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2018-10-22 04:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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