基于ios的室内地图基本绘制 —— (2)路径的绘制

上一篇结束后,我们在界面上已经可以画出商家大头针了,但是,地图嘛,还是少不了规划的路径,今天讲一下路径的绘制吧。

单纯的路径绘制,还是很方便的,只要有这条路径上的各个点(起始点,拐点,终点)给予出事的路径宽度,连起来就好了,但是这只是一个“光秃秃”的路径。

先让我们实现这个“光秃秃”的路径吧!

先上代码吧,看着代码说比较直接,这一部分也没有什么难度

for (NSDictionary * dic in self.points) {
        
        NSString * pointx = dic[@"x"];
        NSString * pointy = dic[@"y"];
        
        ZHPoint * point = [ZHPoint initWithX:pointx.doubleValue / indoorImage.size.width * oldFrame.width y:pointy.doubleValue / indoorImage.size.height * oldFrame.height width:0];
        
        if(isFirst){
            
            // 起点
            [linePath moveToPoint:CGPointMake(point.x, point.y)];
            isFirst = false;
            
        }else {
            
            [linePath addLineToPoint:CGPointMake((float)point.x, (float)point.y)];
            
        }
        
        index ++;
        
    }

首先self.points是存放路径上的各个点,接下来的三行代码是对点数组进行转化,然后我们开始绘制路径。

这里linePath的类型是UIBezierPath的,也就是说我们这里是用UIBezierPath来绘制路径,下面的代码有一个判断语句,是用来判断当前点是不是数组中第一个点,也就是起始点,然后把一个个点加入其中,然后直接绘制,万事ok了。

然后在缩放的监听事件里,对路径的宽度做出改变

self.defaultLineWidth = self.defaultLineWidth / pinchGestureRecognizer.scale;

从上一篇中我们已经分析了单个控件的大小变化,这里不再赘述。

emmmm。。。路径是画上去了,但是,没有方向箭头,对用户来说不太好吧,虽然可以标明起始点和终点,来表示方向,但是,一是不够直观,再者如果把地图放大看详细的路线的话,屏幕上没有起始点终点的话,用户可能会暂时忘记方向,对用户来说操作不便,再退一步说,百度高德啥的反正都有吧,好歹得做做吧。

emmmm。。。让我们来分析一下,怎么加方向标吧。

加方向标其实还是有很多问题需要解决的:

1.方向标的方向的确立

2.方向标加载的位置

3.方向标在这条路径上的个数

4.方向标个数的变化(缩放地图,多线程加载)

我们一个一个的说:

1. 方向标方向的确立

这个上来就是一个数学运算问题吧,我们首先在数组里取到相邻的两个点,我们肯定是要知道这两个点的顺序的,我们是根据数组的顺序来判断方向标的方向的,比如数组X[n],n=1,2,3,4...n  我们取出x1和x2。从人的角度来思考,从x1到x2画一条射线,这个射线的方向,便是我们要的方向标的方向。这么看确实是很直观,但是从机器的角度来算,就很麻烦了,因为我们要计算角度

 

这里的计算可能比较绕,但是重要的是算法思想,先简单的说一下算法的思想:

首先根据两个点的相关信息的求出偏移角度(可能存在坐标轴变化的问题,可以对于坐标轴的变化而变化,也可以不变。变得话,就是坐标轴变为屏幕坐标轴,但是角度的偏移量是根据常用坐标轴来计算的。不变的话,就是还是常用坐标轴求出来的偏移量,在新的坐标轴仍然是通用的,只不过在后面求解方向标的三个点的时候会有不同的处理,下面展示的是我采取变化的代码,还是有些冗余和绕的)

 

上代码

// 计算两个点之间偏离的角度
+ (double)calcDirectionIconOffset:(ZHPoint *)point1 and:(ZHPoint *)point2{
    
    if(point2.x - point1.x == 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值