最近做到一个项目,设计到室内地图路径规划,其实一般的项目也很少设计到室内路径规划,室内也就那么点大。
但是上面怎么说我们就怎么做吧,或者是人性化,或者是多此一举的项目,既然写了就分享出来吧。
先说下大致思想流程吧,语言表达不是很好,有不懂的可以加我的qq24272779询问!
上图例子:
基本思路把上图建筑区域全部用坐标扣选出来,也就是不能走到的地方,蓝色区域和灰色区域。
坐标点以像素为单位。
扣选出来以后把整个图片地图分成由好多小方格组成的!
选择两个点,用A*算法求出需要经过非蓝色和灰色区域的最短路径。
(A*算法不懂的可以百度)。
代码:
//添加地图图片
SKIndoorMapView *indoorMap = [[SKIndoorMapView alloc]initWithIndoorMapImageName:@"WHTerminalBD.png" Frame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; [self.view addSubview:indoorMap];
#pragma mark - Zoom methods -(void)longRequired:(UIGestureRecognizer*)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { if (Points.count == 0 || Points.count >= 2) { [Points removeAllObjects]; for (UIView *view in [self.mapView subviews]) { [view removeFromSuperview]; } //坐标 CGPoint touchPoint = [gesture locationInView:self.mapView]; UIImage *Img = [UIImage imageNamed:@"startPoint"]; UIImageView *imgView = [[UIImageView alloc]initWithImage:Img]; [imgView setFrame:CGRectMake(touchPoint.x - (Img.size.width / (self.zoomScale*2)), touchPoint.y - (Img.size.width / (self.zoomScale)), Img.size.width / self.zoomScale, Img.size.height / self.zoomScale)]; [self.mapView addSubview:imgView]; [Points addObject:NSStringFromCGPoint(touchPoint)]; } else if (Points.count == 1) { //坐标 CGPoint touchPoint = [gesture locationInView:self.mapView]; UIImage *Img = [UIImage imageNamed:@"endPoint"]; UIImageView *imgView = [[UIImageView alloc]initWithImage:Img]; [imgView setFrame:CGRectMake(touchPoint.x - (Img.size.width / (self.zoomScale*2)), touchPoint.y - (Img.size.width / (self.zoomScale)), Img.size.width / self.zoomScale, Img.size.height / self.zoomScale)]; [self.mapView addSubview:imgView]; [Points addObject:NSStringFromCGPoint(touchPoint)]; [self RoadRecevied:Points]; } } }
#pragma 路径 -(void)RoadRecevied:(NSMutableArray *)Arr { /* 路径规划 */ AStar *astar = [[AStar alloc]init]; data = [astar findPath:CGPointFromString(Arr[0]).x curY:CGPointFromString(Arr[0]).y aimX:CGPointFromString(Arr[1]).x aimY:CGPointFromString(Arr[1]).y]; /* size——同UIGraphicsBeginImageContext opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。 scale—–缩放因子 */ UIGraphicsBeginImageContextWithOptions(CGSizeMake(320, 480), NO, [UIScreen mainScreen].scale); UIBezierPath *path = [UIBezierPath bezierPath]; [[UIColor redColor] setStroke]; [path setLineWidth:0.5]; [path setLineJoinStyle:kCGLineJoinRound]; [path setLineCapStyle:kCGLineCapRound]; BOOL isfirst = YES; if (data && [data count] > 0) { for (id obj in data) { if (isfirst) { isfirst = NO; [path moveToPoint:CGPointMake([obj id_col], [obj id_row])];//设置起始路径的点 } [path addLineToPoint:CGPointMake([obj id_col], [obj id_row])]; } } [path stroke]; UIImage *img =UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *imgV = [[UIImageView alloc]initWithImage:img]; [_mapView addSubview:imgV]; [self setNeedsDisplay]; }
<pre name="code" class="objc">- (bool)checkMap:(int)col row:(int)row { CGPoint point = CGPointMake(col, row); /* 150,45,180,45,180,70,150,70 值班室 200,10,225,10,225,50,180,50,180,45,200,45 不明区域 160,75,180,75,180,150,150,150,150,135,120,135,120,145,195,150,95,125,120,110,140,110,160,95 包裹打包区 100,165,125,65,125,270,140,270,140,280,85,280,85,260,95,260, 候机大厅 150,170,170,170,170,260,150,260 安检区 10,310,60,280,150,290,150,275,180,275,180,305,150,305,150,360,170,360,170,390,200,405,200,475,150,475,150,380 休息区 */ /* 180,350,220,250,220,370,180,380 不明区域 0,0,200,0,200,45,150,45,150,75,10,145,60,170,70,28010,310,150,380,150,420,190,425,150,480,0,480 左边灰色 230,0,320,0,320,480,230,480 右边灰色 */ NSString *obstacle00 = @"150,45,180,45,180,70,150,70"; NSString *obstacle01 = @"200,10,225,10,225,50,180,50,180,45,200,45"; NSString *obstacle02 = @"160,75,180,75,180,150,150,150,150,135,120,135,120,145,195,150,95,125,120,110,140,110,160,95"; NSString *obstacle03 = @"100,165,125,65,125,270,140,270,140,280,85,280,85,260,95,260"; NSString *obstacle04 = @"150,170,170,170,170,260,150,260 "; NSString *obstacle05 = @"10,310,60,280,150,290,150,275,180,275,180,305,150,305,150,360,170,360,170,390,200,405,200,475,150,475,150,380"; NSString *obstacle06 = @"180,350,220,250,220,370,180,380"; UIBezierPath *path00 = [Utils bezierPathFromCoordinateString:obstacle00]; UIBezierPath *path01 = [Utils bezierPathFromCoordinateString:obstacle01]; UIBezierPath *path02 = [Utils bezierPathFromCoordinateString:obstacle02]; UIBezierPath *path03 = [Utils bezierPathFromCoordinateString:obstacle03]; UIBezierPath *path04 = [Utils bezierPathFromCoordinateString:obstacle04]; UIBezierPath *path05 = [Utils bezierPathFromCoordinateString:obstacle05]; UIBezierPath *path06 = [Utils bezierPathFromCoordinateString:obstacle06]; // NSString *str110 = @"10,145,65,170,65,280,10,310,150,385,150,423,190,425,190,475,230,475,230,5,200,5,200,45,150,45,150,75"; if (CGPathContainsPoint(path00.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path01.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path02.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path03.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path04.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path05.CGPath,NULL,point,false)) { return NO; } else if (CGPathContainsPoint(path06.CGPath,NULL,point,false)) { return NO; } return YES; }
我们来看下最终效果!
原文地址:http://blog.csdn.net/apple_wkf/article/details/41693513