在处理中以螺旋形式绘制文本

时间:2013-10-01 11:02:09

标签: arrays processing spiral

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

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;
}

但是,我不知道如何逐步浏览我的字符数组,以便以类似螺旋的格式绘制它们。我为缺乏清晰度而道歉。任何建议都很棒!我很清楚所有这些(显然)。

1 个答案:

答案 0 :(得分:2)

您创建螺旋的代码是个好主意。创建旋转文本的一种方法是使用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是arclength(在这种情况下,是字母之间的距离),r是半径,θ是角度变化。如果你想要字母之间的距离恒定,无论半径如何,那么θ必须与1 / r成比例。当然,您可以根据自己的喜好调整硬编码值。

此外:rotate()translate()方法在draw()结束时撤消,因此如果您在此代码后没有执行任何操作,则可以将其保留为原样。如果你确实想要绘制更多的东西,那么你必须在绘制其他东西之前手动撤消旋转和平移。

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