PHP判断一个点在矩形区域什么位置

原文地址 https://xiegaosheng.com/post/view?id=77

 

PHP判断一个点在矩形区域什么位置;随便标记一个点就生成点的上下最有区域的id;

首先需要准备区域表fgareadata  和点区域对应表 point_region;

/**
 * Created by PhpStorm.
 * function: getRegion
 * User: xiaoxie
 * Description:计算点所在区域
 * @param $x
 * @param $y
 * @param $floor_id
 * @param $id
 * @param string $location
 *
 */
public function getRegion($x,$y,$floor_id,$id,$location='')
{
    $maxxc = 2;//点到区域的最大间隔x
    $maxxy = 2;//点到区域的最大间隔y
    $where['floor_id'] =$floor_id;
    if ($location)
    {
        //如果是修改的话需要先清除方向
        $dataarr['tops'] = null;
        $dataarr['downs'] = null;
        $dataarr['lefts'] = null;
        $dataarr['rights'] = null;
        $dataarr['times'] =time();
        DB::table('point_region')->where('id='.$id)->update($dataarr);
    }
    $lists = Db::table('fgareadata')->where($where)->select();
    if ($lists)
    {

        foreach ($lists as $list)
        {
            $xarr = [];
            $yarr = [];
            $datas = [];
            $data = explode('|',$list['data']);
            foreach ($data as $key=>$value)
            {
                $dataarr = explode(',',$value);
                //将x,y坐标存到数组里
                $xarr[] = $dataarr[0];
                $yarr[] = $dataarr[1];
            }
            //取出数组中的最大x,y值
            $minx = min($xarr);
            $maxx = max($xarr);
            $miny  = min($yarr);
            $maxy = max($yarr);
            //判断左右
            if($y>$miny && $y<$maxy)
            {
                //先判断y坐标是否在区域内,然后去判断区域是在做还是右
                if ($x >$maxx & $x- $maxx < $maxxc)
                {
                    $datas['lefts'] = $list['Id'];
                }

                //如果x小于最小的x坐标 取到点的右侧区域
                if($x < $minx && $minx-$x <$maxxc)
                {
                    $datas['rights'] = $list['Id'];
                }


            }

            //判断上下
            if ($x>$minx && $x<$maxx)
            {

                if($y>$maxy && $y-$maxy < $maxxy)
                {
                    $datas['downs'] = $list['Id'];
                }

                if ($y< $miny && $miny - $y < $maxxy)
                {
                    $datas['tops'] = $list['Id'];
                }

            }

            if($datas)
            {
                //楼层id
                $datas['floor_id'] = $floor_id;
                $datas['times'] = time();
                DB::table('point_region')->where('id='.$id)->update($datas);
            }

        }

    }
}

 

效果图如下

image.png

数据库生成数据

image.png

tops,lefts,downs,rights 表示点的上下左右的区域

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
五种报文 HELLO报文(类型1 ):用来建立和维护邻接关系,选举DR以及BDR 数据库描述报文(类型2 ):也就是DD 报文,用来描述自己的LSDB,还有空的DD报文,用来确定MSTER和SLAVE关系 链路-状态请求报文(类型3 ):也就是LSR报文,用来向对方请求所需的LSA。内容包括所需要的LSA 链路-状态更新报文(类型4 ):也就是LSU报文,用来向对端路由发送所需要的LSA,内容是多格LSA集合 链路-状态应答报文(类型5 );LSACK报文,用来对接收到的LSU报文进行确认 OSPF有七种类型LSA,详细介绍如下: 1、路由器LSA (Router LSA) 由区域内所有路由器产生,并且只能在本个区域内泛洪广播。 这些最基本的LSA通告列出了路由器所有的链路和接口,并指明了它们的状态和沿每条链路方向出站的代价。 2、网络LSA (Network LSA) 由区域内的DR或BDR路由器产生,报文包括DR和BDR连接的路由器的链路信息。 网络LSA也仅仅在产生这条网络LSA的区域内部进行泛洪。 3、网络汇总LSA (Network summary LSA) 由ABR产生,可以通知本区域内的路由器通往区域外的路由信息。 在一个区域外部但是仍然在一个OSPF自治系统内部的缺省路由也可以通过这种LSA来通告。 如果一台ABR路由器经过骨干区域从其他的ABR路由器收到多条网络汇总LSA,那么这台始发的ABR路由器将会选择这些LSA通告中代价最低的LSA,并且将这个LSA的最低代价通告给与它相连的非骨干区域。 4、ASBR汇总LSA (ASBR summary LSA) 也是由ABR产生,但是它是一条主机路由,指向ASBR路由器地址的路由。 5、自治系统外部LSA (Autonomous system external LSA) 由ASBR产生,告诉相同自治区的路由器通往外部自治区的路径。 自治系统外部LSA是惟一不和具体的区域相关联的LSA通告,将在整个自治系统中进行泛洪。 6、组成员LSA (Group membership LSA) * 目前不支持组播OSPF (MOSPF协议) 7、NSSA外部LSA (NSSA External LSA) 由ASBR产生,几乎和LSA 5通告是相同的,但NSSA外部LSA通告仅仅在始发这个NSSA外部LSA通告的非纯末梢区域内部进行泛洪。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢高升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值