【问题标题】:Drawing text in a spiral in Processing在处理中以螺旋形式绘制文本
【发布时间】:2013-10-01 11:02:09
【问题描述】:

我有一个字符串数组,我想将它们画成一个巨大的螺旋。我对从哪里开始只有一个非常非常粗略的想法。首先,我可能需要将字符串分解为单个字符的数组?接下来,我可能需要应用以下几何图形来生成螺旋形状?

float r = 0;
float theta = 0;

void setup() {
  size(200,200);
  background(255);
}

void draw() {

  float x = r * cos(theta);
  float y = r * sin(theta);

  noStroke();
  fill(0);
  ellipse(x+width/2, y+height/2, 6, 6); 

  theta += 0.01;
  r += 0.05;
}

但是,我不知道如何逐步浏览我的字符数组,以便以类似螺旋的格式绘制它们。我为缺乏明确性表示歉意。任何建议都会很棒!我对这一切都很陌生(显然)。

【问题讨论】:

    标签: arrays processing spiral


    【解决方案1】:

    创建螺旋的代码是个好主意。创建旋转文本的一种方法是使用rotate(),结合text()。您将有一个 for 循环,遍历您的字符数组,增加半径,并以这种方式绘制您的文本。请注意,rotate() 具有累积效应。比如:

    String str = "asdflkkjsahfdlkadshflkahdslkfajsdf";
    float radius = 0;
    //so we are rotating around the center, rather than (0,0):
    translate(width/2, height/2); 
    for (int i = 0; i < str.length(); i++) {
      radius += 2;
      // taken out because of non-constant spacing at large radius:
      //rotate(0.5);
      // this should give constant spacing, no matter the radius
      // change 10 to some other number for a different spacing. 
      rotate(10/radius);
      // drawing at (0,radius) because we're drawing onto a rotated canvas
      text(str.charAt(i), 0, radius);
    }
    

    您可能希望角度变化是半径的函数,因为在较大的半径下,字母之间的距离非常远。一种方法是使用公式s = rθ,其中 s 是弧长(在这种情况下,是字母之间的距离),r 是半径,θ 是角度变化。如果您想要字母之间的恒定距离,无论半径如何,那么 θ 必须与 1/r 成比例。当然,您可以根据自己的喜好调整硬编码值。

    另外:rotate()translate() 方法在 draw() 的末尾被撤消,所以如果你在这段代码之后没有做任何事情,那么可以保持原样。如果您确实想在之后绘制更多东西,那么您必须在绘制其他任何东西之前手动撤消旋转和平移。

    编辑:我刚刚意识到我假设您希望字母也可以旋转,而不仅仅是定位成螺旋状,而且仍然正常定向。在这种情况下,您可以使用现有代码并将ellipse(...) 替换为text(str.charAt(...)...),当然还有适当的参数。

    【讨论】:

    • 谢谢 - 但是,我不太确定在哪里/如何实现方程 s=r0 以防止在大半径处出现极端间距。
    • 要使字母之间的距离(即几何弧长“s”)为常数,则将 r 乘以 θ 必须始终得到一个常数。因此,θ 必须等于该常数除以 r。我在答案的代码中添加了一个示例,以便您了解我的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-12-15
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多