iOS:Quartz2d绘制平面图

iOS:Quartz2d绘制平面图,ios,objective-c,quartz-2d,Ios,Objective C,Quartz 2d,我正在构建一个应用程序,我想在其中向用户显示楼层平面图,这是一个互动的应用程序,这意味着他们可以点击每个区域,缩放这些区域并找到更精细的细节 我从后端得到一个JSON响应,其中包含平面图、形状信息和点的元数据信息。我计划使用quartz解析点并在视图上绘制形状(开始学习Quartz2d)。作为一个开始,我采取了一个简单的蓝图,看起来像下图。 根据蓝图,中心位于(0,0),有4个点 下面是我从后端得到的关于蓝图的要点 X:-1405.52, Y:686.18 X:550.27, Y:683.97

我正在构建一个应用程序,我想在其中向用户显示楼层平面图,这是一个互动的应用程序,这意味着他们可以点击每个区域,缩放这些区域并找到更精细的细节

我从后端得到一个JSON响应,其中包含平面图、形状信息和点的元数据信息。我计划使用quartz解析点并在视图上绘制形状(开始学习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)
    ,则在负轴上绘制点更有意义一些观察结果:

    使用
    quartz
    没有什么错,但是您可能会发现使用
    OpenGL
    更灵活,因为您提到了命中测试区域和实时缩放模型的要求

    由于使用
    CGContextMoveToPoint
    绘制路径,因此代码假定点的列表是有序的。如果数据合同对此有保证,则罚款;但是,如果JSON中返回了多个闭合路径,则需要编写更智能的渲染器


    问题2和3可以用计算机图形学的入门知识来解决(特别是模型视图矩阵变换)。如果世界坐标以
    (0,0,0)
    为中心,则可以通过对每个顶点应用标量来缩放顶点。当您不使用
    quartz-2d
    坐标系
    (0,0)-(w,h)
    时,在负轴上绘制点会更有意义。我已经找到了问题的解决方案。现在,我能够从一组点绘制形状,并将其适配到屏幕上,还可以在不损失质量的情况下进行缩放。请在下面找到该项目的链接。这可以调整,以支持颜色,不同的形状,我目前只处理多边形


    我找到了解决这个问题的办法。现在,我能够从一组点绘制形状,并将其适配到屏幕上,还可以在不损失质量的情况下进行缩放。请在下面找到该项目的链接。这可以调整,以支持颜色,不同的形状,我目前只处理多边形


    谢谢您提供的信息。我不是OpenGL的专家,这就是为什么我计划使用Quartz。我的另一种方法是为每个形状创建多个uiview,这样我就可以有手势识别器,我正在重写代码。但问题是,即使我给出了坐标,如果你检查屏幕截图,所画的线也不正确。我在一些书中读到,坐标被剪裁了。我已经完成了点的翻译,我更新了我的答案…你能看一下吗?谢谢你提供的信息。我不是OpenGL的专家,这就是为什么我计划使用Quartz。我的另一种方法是为每个形状创建多个uiview,这样我就可以有手势识别器,我正在重写代码。但问题是,即使我给出了坐标,如果你检查屏幕截图,所画的线也不正确。我在一些书中读到-我的坐标被剪裁了。我已经完成了点的翻译,我更新了我的答案…你能看一下吗?你找到了相同的解决方案吗?检查下面我发布的答案,因为我记得我已经修复了它。。。但是很久以前,希望项目仍然有效Anop4Real好的,当然我会检查,但我需要实现类似magicplan的楼层规划,你找到了解决方案吗?检查下面我发布的答案,因为我记得我已经修复了它。。。但是很久以前,希望项目仍然有效Anop4Real好的,我会检查,但我需要实现magicplan地板规划我们可以通过手势修改图纸吗?我们可以通过手势修改图纸吗?