C. Kružnice

Úloha 1

Vytvorte skeč, ktorý vykreslí n čiar zo stredu obrazovky do bodov na kružnici. Body sú na kružnici rovnomerne rozmiestnené.

n=100
Riešenie
size(400, 400);
background(0);
stroke(255);

// Stred kruhu
PVector C = new PVector(width/2, height/2);  

// Polomer kruhu
float r = height/2-10;

// Pocet ciar
int n = 100;

// Uhlovy rozostup medzi ciarami  
float du = TWO_PI / n;

for (int i = 0; i < n; i++)
{
  float u = i*du;
  float x = C.x + r * cos(u);
  float y = C.x + r * sin(u);
  line(C.x, C.y, x, y);
}

Úloha 2

Upravte skeč tak, aby body na kružnici neboli rovnomerne rozmiestnené, ale aby bol uhol pre každú čiaru náhodný.

Riešenie
size(400, 400);
background(0);
stroke(255);

// Stred kruhu
PVector C = new PVector(width/2, height/2);  

// Polomer kruhu
float r = height/2-10;

// Pocet ciar
int n = 100;

for (int i = 0; i < n; i++)
{
  float u = random(TWO_PI);
  float x = C.x + r * cos(u);
  float y = C.x + r * sin(u);
  line(C.x, C.y, x, y);
}

Úloha 3

Upravte skeč tak, aby každá čiara spájala dva rôzne náhodné body na kružnici.

Riešenie
size(400, 400);
background(0);
stroke(255);

// Stred kruhu
PVector C = new PVector(width/2, height/2);  

// Polomer kruhu
float r = height/2-10;

// Pocet ciar
int n = 100;

for (int i = 0; i < n; i++)
{
  float u1 = random(TWO_PI);
  float x1 = C.x + r * cos(u1);
  float y1 = C.x + r * sin(u1);

  float u2 = random(TWO_PI);
  float x2 = C.x + r * cos(u2);
  float y2 = C.x + r * sin(u2);
    
  line(x1, y1, x2, y2);
}

Úloha 4

Upravte skeč tak, aby body na čiare mali ten istý náhodný uhol u ale začiatočný bod je na menšom polomere r1 a koncový bod čiary je na väčšom polomere r2.

Riešenie
size(400, 400);
background(0);
stroke(255);

// Stred kruhu
PVector C = new PVector(width/2, height/2);  

// Polomery
float r1 = height/2 - 50;
float r2 = height/2 - 10;

// Pocet ciar
int n = 100;

for (int i = 0; i < n; i++)
{
  float u = random(TWO_PI);
  
  float x1 = C.x + r1 * cos(u);
  float y1 = C.x + r1 * sin(u);

  float x2 = C.x + r2 * cos(u);
  float y2 = C.x + r2 * sin(u);
    
  line(x1, y1, x2, y2);
}

Úloha 5

Vytvorte animovaný pohyb po kružnici. Uhol u v každom draw() trochu zväčšite, a tým docielite animáciu.

Riešenie
PVector C; // Stred kruhu
float r;   // Polomer
float u;   //Uhol

void setup()
{
  size(400, 400);
  background(0);
  noStroke();
  colorMode(HSB);
  
  C = new PVector(width/2, height/2);
  r = width/3;
}

void draw()
{
  background(0);  
  float x = C.x + r * cos(u);
  float y = C.x + r * sin(u);
  circle(x,y,20);
  
  u = u + 0.03;  // Animovany uhol  
}

Úloha 6

Upravte skeč tak, aby sa zmenila farba na inú náhodnú farbu ak uhol opíše celú kružnicu. Nezabudnite, že treba v takom prípade aj vynulovať uhol, inak by sa odvtedy farba menila v každom frame. A vypnite prekresľovanie pozadia, nech obrázok zostáva na obrazovke.

Riešenie
PVector C; // Stred kruhu
float r;   // Polomer
float u;   //Uhol

void setup()
{
  size(400, 400);
  background(0);
  noStroke();
  colorMode(HSB);
  
  C = new PVector(width/2, height/2);
  r = width/3;
}

void draw()
{
  float x = C.x + r * cos(u);
  float y = C.x + r * sin(u);  
  circle(x,y,20);
 
  u = u + 0.03;  // Animovany uhol  
  if (u > TWO_PI)
  {
    fill(0,255,255);
    u = 0;
  }
}

Úloha 7

Vytvorte skeč, ktorý nakreslí kruh z n čiar. Aký uhol má začiatočný bod i-tej čiary a aký uhol má koncový bod i-tej čiary?

Riešenie
size(400,400);
background(0);
stroke(255);

PVector C = new PVector(width/2, height/2);
float r = width/3;
int n = 13;

float du = TWO_PI/n;

for (int i = 0; i < n; i++)
{
  // Zaciatocny bod ciary
  float x1 = C.x + r * cos(i*du);
  float y1 = C.y + r * sin(i*du);
  
  // Koncovy bod ciary
  float x2 = C.x + r * cos(i*du + du);
  float y2 = C.y + r * sin(i*du + du);
  
  line(x1,y1,x2,y2); 
}

Úloha 8

Upravte skeč tak, aby okrem začiatočného a koncového bodu čiary vypočítal aj bod uprostred medzi nimi. Aký uhol bude mať tento bod? Vykreslite do tohto bodu bodku:

Riešenie
size(400,400);
background(0);
stroke(255);

PVector C = new PVector(width/2, height/2);
float r = width/3;
int n = 13;

float du = TWO_PI/n;

for (int i = 0; i < n; i++)
{
  // Zaciatocny bod
  float x1 = C.x + r * cos(i*du);
  float y1 = C.y + r * sin(i*du);
  
  // Stredny bod
  float xs = C.x + r * cos(i*du + du/2);
  float ys = C.y + r * sin(i*du + du/2);
  
  // Koncovy bod
  float x2 = C.x + r * cos(i*du + du);
  float y2 = C.y + r * sin(i*du + du);
  
  line(x1,y1,x2,y2);
  circle(xs,ys,5);
}

Úloha 9

Stiahnite tento stredný bod bližšie k stredu kružnice. Použite na jeho výpočet menší polomer:

Riešenie
size(400,400);
background(0);
stroke(255);

PVector C = new PVector(width/2, height/2);
float r = width/3;
float rs = width/4;

int n = 13;

float du = TWO_PI/n;

for (int i = 0; i < n; i++)
{
  // Zaciatocny bod
  float x1 = C.x + r * cos(i*du);
  float y1 = C.y + r * sin(i*du);
  
  // Stredny bod
  float xs = C.x + rs * cos(i*du + du/2);
  float ys = C.y + rs * sin(i*du + du/2);
  
  // Koncovy bod
  float x2 = C.x + r * cos(i*du + du);
  float y2 = C.y + r * sin(i*du + du);
  
  line(x1,y1,x2,y2);
  circle(xs,ys,5);
}

Úloha 10

Teraz upravte skeč tak, aby nekreslil čiaru zo začiatočného do koncového bodu, ale aby kreslil jednu čiaru zo začiatočného do stredného bodu a druhú čiaru zo stredného bodu do koncového. Dostanete hviezdicu:

Riešenie
size(400,400);
background(0);
stroke(255);

PVector C = new PVector(width/2, height/2);
float r = width/3;
float rs = width/4;

int n = 13;

float du = TWO_PI/n;

for (int i = 0; i < n; i++)
{
  // Zaciatocny bod
  float x1 = C.x + r * cos(i*du);
  float y1 = C.y + r * sin(i*du);
  
  // Stredny bod
  float xs = C.x + rs * cos(i*du + du/2);
  float ys = C.y + rs * sin(i*du + du/2);
  
  // Koncovy bod
  float x2 = C.x + r * cos(i*du + du);
  float y2 = C.y + r * sin(i*du + du);
  
  line(x1,y1,xs,ys);
  line(xs,ys,x2,y2);
}

Úloha 11

Prerobte predošlý skeč tak, aby sa pri kliknutí myšou vykreslila hviezdica so stredom na pozícii myši:

Riešenie
void setup()
{
  size(400, 400);
  background(0);
  stroke(255);
}

void mousePressed()
{
  PVector C = new PVector(mouseX, mouseY);
  float r = width/3;
  float rs = width/4;

  int n = 13;

  float du = TWO_PI/n;

  for (int i = 0; i < n; i++)
  {
    // Zaciatocny bod
    float x1 = C.x + r * cos(i*du);
    float y1 = C.y + r * sin(i*du);

    // Stredny bod
    float xs = C.x + rs * cos(i*du + du/2);
    float ys = C.y + rs * sin(i*du + du/2);

    // Koncovy bod
    float x2 = C.x + r * cos(i*du + du);
    float y2 = C.y + r * sin(i*du + du);

    line(x1, y1, xs, ys);
    line(xs, ys, x2, y2);
  }
}

void draw()
{
  
}

Úloha 12

Upravte skeč tak, aby sa mala každá hviezdica iný polomer, iný počet vrcholov a inú farbu.

Riešenie
void setup()
{
  size(400, 400);
  background(0);
  stroke(255);
}

void mousePressed()
{
  PVector C = new PVector(mouseX, mouseY);
  float r = random(30,50);
  float rs = random(r-25,r-10);
  int n = int(random(5,15));
  stroke(random(256), random(256), random(256));

  float du = TWO_PI/n;

  for (int i = 0; i < n; i++)
  {
    // Zaciatocny bod
    float x1 = C.x + r * cos(i*du);
    float y1 = C.y + r * sin(i*du);

    // Stredny bod
    float xs = C.x + rs * cos(i*du + du/2);
    float ys = C.y + rs * sin(i*du + du/2);

    // Koncovy bod
    float x2 = C.x + r * cos(i*du + du);
    float y2 = C.y + r * sin(i*du + du);

    line(x1, y1, xs, ys);
    line(xs, ys, x2, y2);
  }
}

void draw()
{
  
}

Last updated