【问题标题】:xcode swift 3D arraysxcode swift 3D数组
【发布时间】:2015-01-21 18:07:14
【问题描述】:

我正在尝试构建一个 3D 数组。这是我从二维数组修改的代码。 3D 数组不会从我定义的值中打印出我的数组。我的下标中的 getter 和 setter 有问题。有人可以给我建议吗?

import UIKit


class Array3D {
    var zs:Int, ys:Int, xs:Int
    var matrix: [Int]


    init(zs: Int, ys:Int, xs:Int) {
        self.zs = zs
        self.ys = ys
        self.xs = xs
        matrix = Array(count:zs*ys*xs, repeatedValue:0)
    }

    subscript(z:Int, ys:Int, xs:Int) -> Int {
        get {
            return matrix[ zs * ys * xs + ys ]
        }
        set {
            matrix[ zs* ys * xs + ys ] = newValue
        }
    }

    func zsCount() -> Int {
        return self.zs
    }

    func colCount() -> Int {
        return self.ys
    }

    func rowCount() -> Int {
        return self.xs
    }
}

var dungeon = Array3D(zs: 5, ys: 5, xs: 5)


dungeon[1,0,0] = 1
dungeon[0,4,0] = 2
dungeon[0,0,4] = 3
dungeon[0,4,4] = 4

print("You created a dungeon with \(dungeon.zsCount()) z value \(dungeon.colCount()) columns and \(dungeon.rowCount()) rows. Here is the dungeon visually:\n\n")


for z in 0..<5 {
for y in 0..<5 {
    for x in 0..<5 {
        print(String(dungeon[z,x,y]))
    }
    print("\n")
}
    print("\n")
}

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:

    下标中索引的计算方式有误。要将(z, y, x) 转换为线性坐标,您可以使用:

    z * ys * xs + y * xs + x
    

    所以下标应该固定如下:

    subscript(z:Int, y:Int, x:Int) -> Int {
        get {
            return matrix[ z * ys * xs + y * xs + x ]
        }
        set {
            matrix[ z * ys * xs + y * xs + x ] = newValue
        }
    }
    

    注意循环内打印语句中的索引是倒置的:

    print(String(dungeon[z,x,y]))
    

    应该改为[z, y, x]

    通过这些更改,这是我在操场上获得的输出:

    00003
    00000
    00000
    00000
    20004
    
    10000
    00000
    00000
    00000
    00000
    
    00000
    00000
    00000
    00000
    00000
    
    00000
    00000
    00000
    00000
    00000
    
    00000
    00000
    00000
    00000
    00000
    

    附录 zsysxs 表示 3d 矩阵的大小:有xs 列、ys 行和zs 平面。每列的大小为xs,每个平面的大小为xs * ys

    对于 y = 0 和 z = 0,数组中对应于 x = 3 的元素是第 4 个元素,索引为 3(数组从零开始,以及 3d 坐标)。如果 y = 1,则元素为 3 + 行的大小,即 3 + 5 = 8。为了使其更通用

    x + xs * y = 3 + 1 * 5 = 8
    

    每个平面的大小改为xs * ys,对应25。所以z坐标必须乘以那个大小。这导致了我使用的公式:

    z * ys * xs + y * xs + x
    

    如果z = 0,坐标为(0, 1, 3):

    0 + 1 * 5 + 3 = 8
    

    若z = 1,则坐标为(1, 1, 3),公式结果为:

    1 * 5 * 5 + 1 * 5 + 3 = 33
    

    等等。

    如果这听起来很复杂,请查看代码生成的输出,该输出由 5 个 5 行的块组成,每个块包含 5 个数字。如果将其转换为单行(通过删除换行符),则可以通过从零到所需元素从左到右计数来获得数组索引。索引加 5 可以跳到下一行,加 25 可以跳到下一个平面。

    希望能澄清一点。

    【讨论】:

    • @Antonion 谢谢!有用! z 和 zs、y 和 ys、x 和 xs 有什么区别?你能解释一下为什么线性坐标是 z * ys * xs + y * xs + x 吗?非常感谢您的帮助!
    • 感谢您的详细解释。我仍然需要一些时间来理解它,我很感激。
    • 嗨。我有一个问题想征求你的意见。你知道Basic C语言和swift之间的多维数组结构有什么区别吗?因为,我有一个带有 3D 数组的基本 C 代码来进行某些计算(减法、加法、乘法和减法)以获得一些结果。现在,我正在使用 SWIFT 语言将它带到 Xcode。这可能吗?
    • 我现在仍然不确定,因为它似乎是运行时错误,我还没有找到问题...
    • 我没有使用过 C 和 swift,所以我无法回答这个问题。在 swift 参考手册中有 section 讨论与 C 代码的交互 - 您可能可以在那里找到答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2016-01-15
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多