【问题标题】:how to randomly filter and select a CGPoint from arrays如何从数组中随机过滤和选择 CGPoint
【发布时间】:2016-01-18 20:36:12
【问题描述】:

我有许多 CGPoints 数组,如下面的方法所示。我正在尝试为我的精灵过滤一个位置,该位置按上述顺序循环地向下、向左、向上和向右移动。如何从数组组(下,左等)中随机选择一个数组,然后从所选数组中随机选择一个点,同时注意数组组,以便当再次调用该方法时,将使用以下组进行生成(按照周期性顺序)。例如,因为 down 是循环中的第一个,所以随机选择一个“down 数组”,如果选择 down2,则应该从 down2 中随机选择一个点,比如 p5。下次调用此方法时,“左数组”应遵循相同的过程,依此类推。它似乎相当复杂。

func nextPosition ()->CGPoint   {
        let down1 = [p1, p2]
        let down2 = [p3, p4, p5]
        let left1 = [p6, p7]
        let left2 = [p8, p9, p10]
        let left3 = [p11, p12, p13]
        let up1 = [p14, p15]
        let up2 = [p16, p17]
        let up3 = [p18, p19]
        let right1 = [p20, p21]
        let right2 = [p22, p23]
        let right3 = [p24, p25]
        let right4 = [p26, p27, p28, p29, p30]

        //return point    
  }

【问题讨论】:

    标签: arrays swift sorting filter swift2


    【解决方案1】:

    这应该可行:

    func nextPosition () -> CGPoint   {
    
        var pointsArray:[[CGPoint]] = [[]]
    
        let down1 = [p1, p2]
        pointsArray.append(down1)
        let down2 = [p3, p4, p5]
        pointsArray.append(down2)
    
        let left1 = [p6, p7]
        pointsArray.append(left1)
        let left2 = [p8, p9, p10]
        pointsArray.append(left2)
        let left3 = [p11, p12, p13]
        pointsArray.append(left3)
    
        let up1 = [p14, p15]
        pointsArray.append(up1)
        let up2 = [p16, p17]
        pointsArray.append(up2)
        let up3 = [p18, p19]
        pointsArray.append(up3)
    
        let right1 = [p20, p21]
        pointsArray.append(right1)
        let right2 = [p22, p23]
        pointsArray.append(right2)
        let right3 = [p24, p25]
        pointsArray.append(right3)
        let right4 = [p26, p27, p28, p29, p30]
        pointsArray.append(right4)
    
    
        let randomDirection: Int = Int(arc4random_uniform(UInt32(pointsArray.count)))
        let randomPoint: Int = Int(arc4random_uniform(UInt32(pointsArray[randomDirection].count)))
    
        return pointsArray[randomDirection][randomPoint]
    
    }
    

    我所做的基本上是创建一个二维数组。第一个维度表示方向,第二个维度表示该方向上的点。

    【讨论】:

    • 附加第一个数组应该是up1 而不是up11。建议进行编辑,但它只有一个字符。
    • 是的,抱歉,错字,我已修正。
    • 此外,此函数适用于从每个点中选择一个随机变量,但不会按顺序返回 4 个不同的点(一个从下、左、上和右)。
    • 也许我不太明白这个问题。不过由此看来,选择4个不同的点,返回一个数组,确实应该没问题。
    【解决方案2】:

    试试这个。该函数的返回是一个包含 4 个 CGPoints 的数组——接下来的四个点,每个方向一个,即第一个是向下的点,下一个是左侧的点等。从函数返回的示例可以是 [p3, p7, p19, p25]

    func nextPosition() -> [CGPoint] {
    
        // Make a separate array for each group of points in each direction
        let down1 = [p1, p2]
        let down2 = [p3, p4, p5]
        let left1 = [p6, p7]
        let left2 = [p8, p9, p10]
        let left3 = [p11, p12, p13]
        let up1 = [p14, p15]
        let up2 = [p16, p17]
        let up3 = [p18, p19]
        let right1 = [p20, p21]
        let right2 = [p22, p23]
        let right3 = [p24, p25]
        let right4 = [p26, p27, p28, p29, p30]
    
        // Make separate arrays for each direction which contains the previous arrays
        let dArray = [down1, down2]
        let lArray = [left1, left2, left3]
        let uArray = [up1, up2, up3]
        let rArray = [right1, right2, right3, right4]
    
        // Make an array to group all the directions
        let array = [dArray, lArray, uArray, rArray]
    
        var nextPositions = [CGPoint]()
    
        // loop through dArray, lArray etc.
        for arr in array {
            // pick random direction array
            var length = UInt32(arr.count)
            let random = Int(arc4random_uniform(length))
    
            // pick random point from sub array
            length =  UInt32(arr[random].count)
            let random2 = Int(arc4random_uniform(length))
    
            // print final random point
            print(arr[random][random2])
            nextPositions.append(arr[random][random2])
        }
        return nextPositions
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2021-10-18
      • 1970-01-01
      • 2017-09-16
      • 2020-10-04
      相关资源
      最近更新 更多