Рисование текста по спирали в Processing

У меня есть массив строк, которые я хотел бы нарисовать в виде гигантской спирали. У меня есть только очень, очень приблизительное представление о том, с чего начать. Во-первых, мне, вероятно, нужно будет разбить строки на массив отдельных символов? Далее мне, вероятно, потребуется применить следующую геометрию, чтобы создать форму спирали?

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

Однако я не знаю, как пройтись по моему массиву символов, чтобы нарисовать их в спиралевидном формате. Прошу прощения за отсутствие ясности. Любые предложения были бы потрясающими! Я очень новичок во всем этом (очевидно).


person hapless_cap    schedule 01.10.2013    source источник


Ответы (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(...)...), конечно, с соответствующими параметрами.

person kevinsa5    schedule 01.10.2013
comment
Спасибо, однако я не совсем уверен, где и как реализовать уравнение s=r0, чтобы предотвратить возникновение экстремального расстояния при больших радиусах. - person hapless_cap; 04.10.2013
comment
Чтобы сделать расстояние между буквами (которое является геометрической длиной дуги s) постоянным, умножение r на θ всегда должно давать константу. Таким образом, θ должно быть равно этой константе, деленной на r. Я добавил пример этого в код в ответе, чтобы вы могли понять, что я имею в виду. - person kevinsa5; 04.10.2013