Я сделал навигационное приложение, чтобы показать кратчайшее расстояние между двумя точками на графике с узлами. Я рисую путь между каждым узлом, но углы плохо подходят друг к другу, и это выглядит так:
To draw На маршруте я сделал следующее:
if (ms.path != nil) {
NodeModel *startNode = nil;
bool isOverview = [self isOverviewMap];
for (NodeInPath *endNode in ms.path.allNodes) {
if (startNode != nil) {
if (isOverview || ([startNode.mapId isEqualToString:mapsource.map->mapId] && [endNode.mapId isEqualToString:mapsource.map->mapId])) {
CAShapeLayer *elemLayer = [CAShapeLayer layer];
#ifdef HALL_DEBUG
if ([startNode.mapId intValue] == 0 && [endNode.mapId intValue] == 0) {
elemLayer.strokeColor = [UIColor redColor].CGColor;
} else if ([startNode.mapId intValue] == 0 || [endNode.mapId intValue] == 0) {
elemLayer.strokeColor = [UIColor orangeColor].CGColor;
} else {
if (startNode.kartenelementId.length != 0 || endNode.kartenelementId.length != 0) {
elemLayer.strokeColor = [UIColor greenColor].CGColor;
} else {
elemLayer.strokeColor = [UIColor blueColor].CGColor;
}
}
#else
elemLayer.strokeColor = [UIColor blueColor].CGColor;
#endif
elemLayer.fillRule = kCAFillRuleNonZero;
elemLayer.position = CGPointZero;
elemLayer.lineWidth = 30;
CGMutablePathRef path = CGPathCreateMutable();
if (isOverview) {
CGPathMoveToPoint(path, 0, startNode.overviewX, startNode.overviewY);
CGPathAddLineToPoint(path, 0, endNode.overviewX, endNode.overviewY);
} else if ([startNode.mapId isEqualToString:mapsource.map->mapId] && [endNode.mapId isEqualToString:mapsource.map->mapId]) {
CGPathMoveToPoint(path, 0, startNode.mapX, startNode.mapY);
CGPathAddLineToPoint(path, 0, endNode.mapX, endNode.mapY);
}
CGPathCloseSubpath(path);
elemLayer.path = path;
CGPathRelease(path);
[markerLayer addSublayer:elemLayer];
// p1
path = CGPathCreateMutable();
CAShapeLayer *circleLayer = [CAShapeLayer layer];
circleLayer.strokeColor = [UIColor redColor].CGColor;
circleLayer.fillColor = [UIColor redColor].CGColor;
circleLayer.fillRule = kCAFillRuleNonZero;
circleLayer.position = CGPointZero;
circleLayer.lineWidth = 30;
circleLayer.path = path;
CGPathRelease(path);
CGRect rect;
if (isOverview) {
rect = CGRectOffset(CGRectMake(startNode.overviewX, startNode.overviewY, 5, 5), -2, -2);
} else {
rect = CGRectOffset(CGRectMake(startNode.mapX, startNode.mapY, 5, 5), -2, -2);
}
CGPathAddEllipseInRect((CGMutablePathRef)circleLayer.path, 0, rect);
[markerLayer addSublayer:circleLayer];
if (endNode == [ms.path.allNodes objectAtIndex:ms.path.allNodes.count - 1]) {
// p2
path = CGPathCreateMutable();
circleLayer = [CAShapeLayer layer];
circleLayer.strokeColor = [UIColor redColor].CGColor;
circleLayer.fillColor = [UIColor redColor].CGColor;
circleLayer.fillRule = kCAFillRuleNonZero;
circleLayer.position = CGPointZero;
circleLayer.lineWidth = 30;
circleLayer.path = path;
CGPathRelease(path);
if (isOverview) {
rect = CGRectOffset(CGRectMake(endNode.overviewX, endNode.overviewY, 5, 5), -2, -2);
} else {
rect = CGRectOffset(CGRectMake(endNode.mapX, endNode.mapY, 5, 5), -2, -2);
}
CGPathAddEllipseInRect((CGMutablePathRef)circleLayer.path, 0, rect);
[markerLayer addSublayer:circleLayer];
}
if (endNode.description.length > 0) {
if (isOverview) {
rect = CGRectOffset(CGRectMake(endNode.overviewX, endNode.overviewY, 5, 5), -2, -2);
} else {
rect = CGRectOffset(CGRectMake(endNode.mapX, endNode.mapY, 5, 5), -2, -2);
}
[self addMarkerAtPosition:CGPointMake(rect.origin.x + rect.size.width/2, rect.origin.y + rect.size.height/2) withTitle:endNode.description favorite:false];
}
}
}
startNode = endNode;
}
}
Есть идеи, как сделать так, чтобы это больше походило на карты apple или google maps? Или, по крайней мере, чтобы углы хорошо подходили друг к другу.