上一篇结束后,我们在界面上已经可以画出商家大头针了,但是,地图嘛,还是少不了规划的路径,今天讲一下路径的绘制吧。
单纯的路径绘制,还是很方便的,只要有这条路径上的各个点(起始点,拐点,终点)给予出事的路径宽度,连起来就好了,但是这只是一个“光秃秃”的路径。
先让我们实现这个“光秃秃”的路径吧!
先上代码吧,看着代码说比较直接,这一部分也没有什么难度
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 ==