Обработка вращающихся линий

Niraj Rajan спросил: 12 мая 2018 в 04:33 в: processing

Я пытаюсь сделать следующее, используя обработку, но расстояние между двумя строками неравномерно.

Пример изображения

Я использовал следующий код

void setup(){
size(300,300);
rectMode(CENTER);
background(0);
translate(150,150);
for(int i=0;i<360;i+=15){
    rect(0,100,5,50);    rotate(i);
    }
}

, но я получаю следующий результат

sample Output

2 ответа

Heron Chubby ответил: 13 мая 2018 в 01:39
OK. Итак, что здесь происходит: вы используете rotate (i), где i находится в градусах. rotate () принимает радианы. Чтобы исправить это, используйте rotate(radians(i)), который преобразует i в радианы со степеней, затем вращается. А также: вращения являются кумулятивными. Он вращается на 0 в первый раз. Затем на 15 градусов второй раз. Затем он добавляет 30 градусов в третий раз, теперь на 45. Таким образом, это выглядит так:
i=0: 0
i=1: 0
i=2: 15
i=3: 45
i=4: 90
i=5: 150
i=6: 225
i=7: 315
i=8: 420
i=9: 540
i=10: 675
i=11: 825
i=12: 990

Как вы можете видеть, интервал увеличивает каждую итерацию через цикл. Чтобы исправить это, у вас есть несколько вариантов для цикла:

for(int i=0;i<360;i+=15){
    rotate(radians(i));//do rotation to apply to the rectangle, converting i to radians
    rect(0,100,5,50);//draw rectangle
    rotate(radians(-i));//undo rotation for next iteration, converting i to radians
}

Или:

for(int i=0;i<360;i+=15){
    pushMatrix();//store current translation and rotation and start rotations/translations from default coordinate system
    translate(150,150);//redo the translation that pushMatrix() put away
    rotate(radians(i));//do the rotation, converting i to radians
    rect(0,100,5,50);//draw the rectangle
    popMatrix();//pop the matrix, now all the translations we just did are forgotten and the translation before pushMatrix() outside of the loop is kept.
    // but the rectangle we drew keeps the translations.
}
John Coleman ответил: 13 мая 2018 в 10:18
pushMatrix();//reset the current rotation AND TRANSLATION ваш комментарий на самом деле не имеет смысла. pushMatrix хранит текущую систему координат - она ​​ничего не сбрасывает. Нет необходимости постоянно ретранслировать, если начальный перевод выполняется до первого pushMatrix (как в коде OP). Если вы используете цикл for в качестве замены цикла OP для цикла, вы увидите, что он не работает так, как предполагалось, поскольку итоговый результат будет иметь значение translate(300,300).
John Coleman ответил: 13 мая 2018 в 02:30
Это все еще неправильно после редактирования. popMatrix() не отменяет никакого перевода, если не было перевода после соответствующего pushMatrix(). Проблема заключалась не только в том, что ваш комментарий был неправильным - в вашем коде есть реальная ошибка. В коде OP код translate(150,150) был до , который зацикливался до pushMatrix(). Таким образом - это ошибка в коде, чтобы следовать pushMatrix() по translate(150,150). Эта строка должна быть удалена, и все ссылки на перевод должны быть удалены из комментариев. Вы нажимаете и выскакиваете вращения . Предыдущий перевод не имеет значения.
kthatoto ответил: 12 мая 2018 в 02:51

Другие ответы / комментарии хорошие, хотя вы можете это сделать ...

void setup(){
  size(300, 300);
  translate(150, 150);
  int count = 12;               //you can change this to any integer
  for(int i=0;i<count;i++){
    rect(0,100,5,50);
    rotate(radians(360/count));
  }
}