iOS:Quartz2d 绘制平面图
iOS:Quartz2d to Draw floor plans
我正在构建一个应用程序,我想在其中向用户显示平面图,这是交互式的,这意味着他们可以点击每个区域缩放这些区域并找到更详细的信息。
我从后端收到 JSON 响应,其中包含平面图、形状信息和点的元数据信息。我打算使用石英解析点并在视图上绘制形状(开始学习 Quartz2d)。作为开始,我做了一个简单的蓝图,如下图所示。
根据蓝图,中心位于 (0,0) 并且有 4 个点。
以下是我从后端获得的蓝图要点。
X:-1405.52, Y:686.18
X:550.27, Y:683.97
X:1392.26, Y:-776.79
X:-1405.52, Y:-776.79
我试着画了这个
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
for (Shape *shape in shapes.shapesArray) {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
BOOL isFirstPoint = YES;
for (Points *point in shape.arrayOfPoints) {
NSLog(@"X:%f, Y:%f",point.x,point.y);
if (isFirstPoint) {
CGContextMoveToPoint(context, point.x, point.y);
//[bpath moveToPoint:CGPointMake(point.x,point.y)];
isFirstPoint = NO;
continue;
}
CGContextAddLineToPoint(context, point.x, point.x);
}
CGContextStrokePath(context);
}
}
但我得到的结果是下面的图片,看起来不正确
问题:
我的方向是否正确?
如何在-ve方向画点?
根据坐标,绘图会很大,我想先画出来,然后缩小以适合屏幕,以便用户稍后可以放大/平移等
更新:
我已经使用平移和缩放实现了一些基本的东西。现在的问题是我如何将绘制的内容适合视图边界。由于我的坐标很大,它超出了范围,我希望它适合。
请在下面找到我拥有的测试代码。
知道如何搭配吗?
几点观察:
为此使用 quartz
没有什么 错误 ,但您可能会发现使用 OpenGL
更灵活,因为您提到了命中测试的要求区域并实时缩放模型。
您的代码假设一个 有序 点列表,因为您使用 CGContextMoveToPoint
绘制路径。如果这是由数据合同保证的,那很好;但是,如果 JSON.
中返回了多个闭合路径,则需要编写更智能的渲染器
问题 2 和 3 可以用计算机图形学的入门知识来解决(特别是 模型-视图矩阵 和 变换)。如果您的世界坐标以 (0,0,0)
为中心,您可以通过对每个顶点应用标量来缩放顶点。当您不使用 quartz-2d
坐标系 (0,0)-(w, h)
时,在负轴上绘制点更有意义
我找到了解决问题的方法。现在我可以从一组点绘制形状并将它们适合屏幕,还可以在不损失质量的情况下缩放它们。请在下面找到项目的 link。这可以调整以支持颜色、不同的形状,我目前只处理多边形。
我正在构建一个应用程序,我想在其中向用户显示平面图,这是交互式的,这意味着他们可以点击每个区域缩放这些区域并找到更详细的信息。
我从后端收到 JSON 响应,其中包含平面图、形状信息和点的元数据信息。我打算使用石英解析点并在视图上绘制形状(开始学习 Quartz2d)。作为开始,我做了一个简单的蓝图,如下图所示。
根据蓝图,中心位于 (0,0) 并且有 4 个点。
以下是我从后端获得的蓝图要点。
X:-1405.52, Y:686.18
X:550.27, Y:683.97
X:1392.26, Y:-776.79
X:-1405.52, Y:-776.79
我试着画了这个
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
for (Shape *shape in shapes.shapesArray) {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
BOOL isFirstPoint = YES;
for (Points *point in shape.arrayOfPoints) {
NSLog(@"X:%f, Y:%f",point.x,point.y);
if (isFirstPoint) {
CGContextMoveToPoint(context, point.x, point.y);
//[bpath moveToPoint:CGPointMake(point.x,point.y)];
isFirstPoint = NO;
continue;
}
CGContextAddLineToPoint(context, point.x, point.x);
}
CGContextStrokePath(context);
}
}
但我得到的结果是下面的图片,看起来不正确
问题:
我的方向是否正确?
如何在-ve方向画点?
根据坐标,绘图会很大,我想先画出来,然后缩小以适合屏幕,以便用户稍后可以放大/平移等
更新:
我已经使用平移和缩放实现了一些基本的东西。现在的问题是我如何将绘制的内容适合视图边界。由于我的坐标很大,它超出了范围,我希望它适合。
请在下面找到我拥有的测试代码。 知道如何搭配吗?
几点观察:
为此使用 quartz
没有什么 错误 ,但您可能会发现使用 OpenGL
更灵活,因为您提到了命中测试的要求区域并实时缩放模型。
您的代码假设一个 有序 点列表,因为您使用 CGContextMoveToPoint
绘制路径。如果这是由数据合同保证的,那很好;但是,如果 JSON.
问题 2 和 3 可以用计算机图形学的入门知识来解决(特别是 模型-视图矩阵 和 变换)。如果您的世界坐标以 (0,0,0)
为中心,您可以通过对每个顶点应用标量来缩放顶点。当您不使用 quartz-2d
坐标系 (0,0)-(w, h)
我找到了解决问题的方法。现在我可以从一组点绘制形状并将它们适合屏幕,还可以在不损失质量的情况下缩放它们。请在下面找到项目的 link。这可以调整以支持颜色、不同的形状,我目前只处理多边形。