package paz1a.lectures.lecture2;
import java.awt.Color;
import sk.upjs.jpaz2.*;
public class SmartTurtle extends Turtle {
/**
* Metoda na nakreslenie jednoduchej 12-cipej hviezdy.
*
* @param size
* dlzka luca hviezdy
*/
public void star(double size) {
for (int i = 0; i < 12; i++) {
this.step(size);
this.step(-size);
this.turn(30);
}
}
/**
* Metoda na nakreslenie n-cipej hviezdy
*
* @param n
* pocet cipov hviezdy
* @param rayLength
* dlzka luca hviezdy
*/
public void nStar(int n, double rayLength) {
for (int i = 0; i < n; i++) {
this.step(rayLength);
this.step(-rayLength);
// Pozor, nie 360/n. Vtedy je totiz hodnota 360 typu int,
// n je int a preto vysledkom int/int operacie je int,
// t.j. cele cislo a realizuje sa celociselne delenie.
this.turn(360.0 / n);
}
}
/**
* Nakresli rovnoramenny trojuholnik
*
* @param legLength
* dlzka ramena
* @param angle
* uhol, ktory zvieraju ramena
*/
public void isosceles(double legLength, double angle) {
// Do premennych startX a startY si ulozime
// poziciu korytnacky pri zavolani tejto metody
double startX = this.getX();
double startY = this.getY();
// Do premennej natocenie si ulozime natocenie (smer)
// korytnacky pri zavolani tejto metody
double direction = this.getDirection();
// Kreslenie
this.turn(-angle / 2);
this.step(legLength);
// Sme v bode A, ulozime si teda x-ovu a y-ovu suradnicu
// tohto bodu (pouzijeme ich neskor)
// Vytvorime premennu xCoord na hodnoty typu double
double xCoord;
// Do premennej xCoord ulozime aktualnu x-ovu suradnicu
// pozicie korytnacky - ziskame ju tak, ze sa "sami seba" spytame
// na x-ovu suradnicu
xCoord = this.getX();
// Ako predosle, ale s y-ovou suradnicou. Kombinujeme vytvorenie
// premennej aj inicializaciu hodnoty do jedneho prikazu
double yCoord = this.getY();
// Dalsie kreslenie
this.step(-legLength);
this.turn(angle);
this.step(legLength);
// Na zaver sa presunieme na ulozenu poziciu bodu A
this.moveTo(xCoord, yCoord);
// Korytnacku presunieme tam, kde bola na zaciatku, a natocime smerom,
// akym bola natocena na zaciatku (pri volani tejto metody)
this.setPosition(startX, startY);
this.setDirection(direction);
}
/**
* Nakresli usecku spajajucu body [x1, y1] a [x2, y2]
*/
public void line(double x1, double y1, double x2, double y2) {
double startX = this.getX();
double startY = this.getY();
this.setPosition(x1, y1);
this.moveTo(x2, y2);
this.setPosition(startX, startY);
}
/**
* Nakresli stvorcovu spiralu so zadanym poctom stran
*
* @param lineCount
* pocet stran stvorcovej spiraly
*/
public void squareSpiral(int lineCount) {
// V premennej stepLength si budeme pamatat, akej dlzky ma byt krok,
// ktory sa chystame najblizsie vykonat. Na zaciatku je to 150
double stepLength = 150;
// Realizujeme pozadovany pocet krokov
for (int i = 0; i < lineCount; i++) {
this.step(stepLength);
this.turn(90);
// Po kazdom kroku znizime hodnotu ulozenu v premennej stepLength o 5
stepLength = stepLength * 0.95;
}
}
/**
* Realizuje nahodnu pochodzku s kruhovym ohranicenim
*
* @param stepCount
* pocet krokov nahodnej pochodzky
*/
public void randomWalkCircle(int stepCount) {
// Ulozime si pociatocnu poziciu korytnacky
double startX = this.getX();
double startY = this.getY();
// Realizujeme potrebny pocet krokov
for (int i = 0; i < stepCount; i++) {
// Nahodne sa natocime
this.setDirection(Math.random() * 360);
// Na zaklade x-ovej pozicie nastavime vhodnu farbu
if (this.getX() < 150) {
this.setPenColor(Color.green);
} else {
this.setPenColor(Color.red);
}
// Spravime krok
this.step(10);
// Ak je korytnacka viac ako 100 od miesta, kde zacala,
// spravime krok spat
if (this.distanceTo(startX, startY) > 100) {
this.step(-10);
}
JPAZUtilities.delay(30);
}
// Vratime korytnacku tam, kde zacala
this.setPosition(startX, startY);
}
}