V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
meteor2013
V2EX  ›  问与答

如何判断一个物体已经移动到圈外?

  •  
  •   meteor2013 · 2015-08-06 03:12:05 +08:00 via iPhone · 2107 次点击
    这是一个创建于 3393 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个物体o(x,y), 它的坐标x,y是可以随时读到的。有一个圈,圆心坐标是(a,b), 半径是r.

    这个物体在圈内开始随机移动,请问怎么判定它已经移出这个圈呢?
    23 条回复    2015-08-07 21:18:48 +08:00
    ligyxy
        1
    ligyxy  
       2015-08-06 03:16:55 +08:00
    欧式距离大于半径?

    据说通宵写代码的质量要低一些
    meteor2013
        2
    meteor2013  
    OP
       2015-08-06 03:19:51 +08:00 via iPhone
    @ligyxy 小弟数学不好,能具体说说吗?
    呵呵,刚喝了红牛兑橙汁。目前精力很好
    manhere
        3
    manhere  
       2015-08-06 03:21:34 +08:00
    话说...物体有多大?
    meteor2013
        4
    meteor2013  
    OP
       2015-08-06 03:23:16 +08:00 via iPhone
    @manhere 这里不考虑物体半径大小。简单处理就行
    blacktulip
        5
    blacktulip  
       2015-08-06 03:23:31 +08:00   ❤️ 2
    sqrt((x-a)(x-a)+(y-b)(y-b)) > r
    meteor2013
        6
    meteor2013  
    OP
       2015-08-06 03:26:58 +08:00 via iPhone
    @blacktulip 谢啊,哥们
    Valyrian
        7
    Valyrian  
       2015-08-06 04:48:31 +08:00
    这不是小学数学么
    msg7086
        8
    msg7086  
       2015-08-06 05:45:11 +08:00   ❤️ 2
    这里有一个优化。
    如果物体移动速度很快,也可以直接判断是否在圆的外切矩形之外来短路判断条件。

    if x > a+r || x < a-r || y > b+r || y < b-r || sqrt() > r

    可以省下一部分sqrt的时间。
    Borden
        9
    Borden  
       2015-08-06 05:49:34 +08:00 via iPad
    现在的程序员都这个水平了???
    Xrong
        10
    Xrong  
       2015-08-06 05:58:34 +08:00
    楼主太迟要多休息,不然不可能脑袋卡壳到连勾股定理都想不起来
    theFool
        11
    theFool  
       2015-08-06 08:06:45 +08:00 via iPhone
    ((x-a)(x-a)+(y-b)(y-b)) > r*r
    省个开方。

    最基础的数学知识还是得好好补补吧。
    hellov22ex
        12
    hellov22ex  
       2015-08-06 08:12:01 +08:00
    楼主需要好好休息,帮你想个不给力的办法,就是求当X轴坐标等于x时的线与圆的交点到和y进行比较啦。

    不要熬夜。
    meteor2013
        13
    meteor2013  
    OP
       2015-08-06 08:25:13 +08:00 via iPhone
    @hellov22ex 这方法好。谢谢啊
    最近的确忙,搞红牛撑着
    hellov22ex
        14
    hellov22ex  
       2015-08-06 08:34:10 +08:00
    @meteor2013 这样子你要先获得圆的函数,这一部分谷歌下吧。顺带注意身体,不是只为你自己。
    leavic
        15
    leavic  
       2015-08-06 10:12:25 +08:00
    @msg7086 如果你直接用或关系符的话,可能还需要考虑编译器的处理问题,编译器可能还是会算一遍sqrt的值,加上if else把sqrt和非sqrt切开也许会好点。
    hinate
        16
    hinate  
       2015-08-06 10:14:52 +08:00 via Android
    要多休息,不然代码都不能码了
    msg7086
        17
    msg7086  
       2015-08-06 11:20:14 +08:00
    @leavic 大多数过程式语言里表达式短路是规范的一部分。
    函数式语言没有深究,不太清楚。
    leavic
        18
    leavic  
       2015-08-06 12:25:04 +08:00
    @msg7086 在C里面,运算符是有优先级的,或运算时从左到右,如果你把sqrt写到了最左边,那肯定会要执行一遍sqrt了,当然你你没有这样写。

    不是说这个问题一定会发生,只是说还的惦记着这种可能,否则结果可能是运算复杂度更高了。
    wkdhf233
        19
    wkdhf233  
       2015-08-06 13:00:57 +08:00
    睡得好才是第一生产力
    Cloudee
        20
    Cloudee  
       2015-08-06 14:41:15 +08:00
    @msg7086 @meteor2013 感觉如果按题主说的,先计算是不是在内接矩形内,然后如果不在再判断到圆心的距离,后面的乘法运算被短路掉的概率比较高
    msg7086
        21
    msg7086  
       2015-08-06 15:10:21 +08:00 via Android
    @leavic 同级就是从左到右。这个初中就学过的知识了。

    @Cloudee 也可以,乘个0.707嘛
    Exin
        22
    Exin  
       2015-08-06 19:40:23 +08:00 via iPhone
    我还以为能看到判断在不规则形状外的方法
    Aksura
        23
    Aksura  
       2015-08-07 21:18:48 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.