Что такое кардиоида?
Кардиоида – это фигура, созданная с помощью одной точки на окружности и прокатки ее по другой окружности с таким же радиусом. Это то, что я имею в виду:

Но кардиоида на самом деле соответствует уравнению:
r = x + x(sin(theta));

Где «тета» — это угол, под которым катящийся круг (черный, на картинке выше) находится по отношению к неподвижному конгруэнтному кругу (синий, на картинке выше), а «r» — это радиус. Чем выше переменная «х», тем больше кардиоида.

Когда x = 100, вот как выглядит кардиоида, основываясь на коде, который я написал ниже:

(Ссылка на код ближе к концу.)

Такова основная структура кардиоиды.

Так как же мы сделали эту кардиоидную с помощью обработки?

Во-первых, мы объявили наши переменные, r и theta.

// declares the universal variables: r (radius) and theta (the angle)
float r; 
float theta;

Затем настраиваем программу.

//sets up the program.
void setup(){
  size(600, 600);
  r = height * .25;// radius is 1/4 of the height. (this doesn't matter later)
  theta = 0;
  background(0);
  frameRate(1000);
}

После этого все это вычерчиваем.

void draw() {
  stroke(random(255), random(255), 255);// makes a random color (always has blue in it).
  strokeWeight(random(5));// makes a random stroke thickness.
  translate(width/2, height/2);// moves the top left of the grid to the center of the canvas.

Теперь, когда у нас есть правильное позиционирование, мы составим уравнение для перевода декартовых координат в полярные координаты.

  // this translates cartesian coordinates into polar coordinates.
  float x = r*sin(theta) ;
  float y = r*cos(theta) ;

Теперь, когда это сделано, мы расставили точки, чтобы сделать кардиоидную:

  point(x, y);// makes a point at the specified x and y.
  theta+=1; // increases theta by 1.

Затем составим основное уравнение для кардиоиды:

  // this is the equation for a cardioid: r = x + x(sin(theta)).
  // we use 'xc' because we've
  // already used the 'x' variable for the x coordinate
  // play around with xc!
  float xc = 100;
  r = xc + xc* sin(theta);

Наконец, если вы хотите сбросить холст, добавьте следующие строки кода:

// clears the canvas and starts over the process.
  if (theta == 360){
    background(0);
    theta = 0;
  }
}

Поэкспериментируйте с различными переменными, чтобы получить разные кардиоиды. Что дает вам больше лепестков (лепесток — это основная кардиоида, которую я вам показал)? Что делает его более гладким? Можете ли вы сделать кардиоидную больше, если хотите? Как вы можете сделать кардиоидную с линиями? Можете ли вы сделать круги видимыми, как на первой гифке?
Столько вопросов! Я отвечу на них во второй части.
А пока дайте мне знать, если вы разберетесь с ними, и покажите мне, что вы сделали!

Полный код на GitHub здесь.

Выход до следующего раза,

Ави