Swift L系统藻类

时间:2016-01-28 09:47:34

标签: swift l-systems

所以这只是我在IBM Swift沙箱中为了好玩而做的事情。我最近在Scala中做了一个L系统藻类,尽管在Swift中做它很酷,看看语言是如何比较的。

https://github.com/I2obiN/L-System-Algorithms-and-Fractals/blob/master/algae.scala

那是Scala的一个向你展示我的目标,这就是我在Swift中所拥有的;

/**
  * Created by t.hood on 26/01/16
  * L-System Algae
  *
  */

 import Foundation

 // Mapping function for string

 func stringmap(x: String) -> String {
 var str = x;

     // Replace characters in string
     str = x.stringByReplacingOccurrencesOfString("A", withString: "AB") +
     str.stringByReplacingOccurrencesOfString("B", withString: "A");

  // Return mapped string;
  return str;
 }

 func lsys() {

 // Declarations

 var iteration : Int = 2;
 var x = 0;
 var lsystem: String = "A";
 let charA: Character = "A";
 let charB: Character = "B";

 while(x != iteration) {

 print(lsystem)

  // Iterate through characters in string
  for chars in lsystem.characters {
    lsystem = stringmap(lsystem);
  }

  // Inc count ..
  x+=1

 }
}

 // Run ..
 lsys();

我遇到的问题是我的映射功能。我需要它来映射x,打印结果,然后在str上执行下一个映射。问题是我在两个地图之间都有操作符+,在第一次操作后我无法快速打印str。

任何有关如何解决这个问题的想法?如果我可以在第一次更换后打印str,我认为它会起作用。

1 个答案:

答案 0 :(得分:1)

我在Xcode中创建了一个项目,所以我可以使用调试器来查看正在发生的事情。这是我找到的。

我将print语句移动到for循环中,因此每次循环执行时都会显示lsystem的值。

当x == 0和1时,while循环执行两次 第一次通过while循环lsystem =='A',所以for循环执行一次。在stringmap()中,'A'变为'ABA'。 'ABA'已打印。 第二次通过while循环,for循环执行三次。 对于循环1:'ABA'被发送到stringmap()并返回'ABBABAAA'。 对于循环2:'ABBABAAA'被发送到stringmap()并返回'ABBBABBABABABAAAAAAAA'。 对于循环3:'ABBBABBABABABAAAAAAAA'被发送到stringmap()并且'ABBBBABBBABBABBABBABABABABABABABABAAAAAAAAAAAAAAAAAAAAA'被返回。

我修改了你的stringmap()函数,逐个字符地迭代字符串,并将语法应用于每个字符,将每个更改附加到一个新字符串,然后返回给lsys()。

while循环的七次迭代返回了这一点,这与我在维基百科关于L系统的文章中看到的一致。 迭代0:A 迭代1:AB 迭代2:ABA 迭代3:ABAAB 迭代4:ABAABABA 迭代5:ABAABABAABAAB 迭代6:ABAABABAABAABABAABABA 迭代7:ABAABABAABAABABAABABAABAABABAABAAB

这是代码。这在iMac的操场上工作,我希望它也能在IBM Swift沙箱中工作。

func stringmap(x: String) -> String
{
    var returnString = ""

    for char in x.characters
    {
        switch (char)
        {
        case "A" :
            returnString += "AB"
            break
        case "B":
            returnString += "A"
            break
        default:
            break
        }
    }
    return returnString
}


func lsys()
{

    // Declarations

    let iteration : Int = 7;
    var x = 0;
    var lsystem: String = "A";

    print("Iteration \(x): \(lsystem)")

    while(x != iteration)
    {
        lsystem = stringmap(lsystem)
        x++
        print("Iteration \(x): \(lsystem)")

    }
}

lsys()