import java.awt.*; import java.awt.Graphics.*; import java.awt.event.*; import java.awt.image.*; //on üks klass, mis laiendab lihtsalt graafilist klassi Canvas, ning hakkab enda sisse spiraali joonestama public class Spiraal2 extends Canvas implements Runnable, AdjustmentListener { final double PI = 3.141592653589793; double a, b, samm = 10; //x, y ja x1, y1 on need, mille vahele veetakse alati joon //r on raadius, mis peaks siis suurenema alati ilusti iga keeru lõpuks samm võrra double x, y, x1, y1, r; //sek nigu "sektoreid" mida suurem on see arv, seda väiksemateks juppideks jaotame ringi, //seda sujuvam tuleb spiraal ja seda kauem võtab arvutil aega, et seda teha double sek = 48; //rad on nurk, mis on nii mitu kraadi, mille võrra silinder enne joonistamise algust pööratud on. seda hakkab usinasti //suurendama thread osa oma run() meetodis.. ja seejärel magama ja uuesti joonistama kogu komponendi // pilti ja joonistamine toimub nii, et algväärtuseks saabki see rad :) // kraad on vajalik selleks, et run() sees rad += kraad st kraad muutuja võrra suurendatakse nurka //pii/24 just seetõttu, et kui on 2pii radiaani, siis saab ring täis double rad = 0, kraad = PI/24; Spiraal2(){ new Thread(this).start(); } //otsib suuruse järgi keskkoha ja hakkab siis sinna ringi võrrandi järgi // x - a = r * cos(a) ja y - b = r * sin(a) jupp haaval ringi joonistama kuni raadius läheb teatud väärtusele public void paint(Graphics g){ //Leiame siis keskkoha x = a = getSize().width / 2; y = b = getSize().height / 2; //Raadius nulliks joonistamise alguses r = 0; //for tsükkel hakkab spiraali sektor haaval joonistama, nurka järjest suurendades //tähtis on ka raadiust suurendada.. sest selle järgi toimub tsükli lõpetamine //nurka z suurendatakse niikaua, kuni spiraali suurus on aknas seinast seina for(double z = rad+(2*PI/sek);(r<10) || (r<20);z+=2*PI/sek){ //raadius sektori jagu suuremaks r += samm/sek; //arvutame uued koordinaadid x1 = r * Math.cos(z) + a; y1 = r * Math.sin(z) + b; //ja tõmbame joone eelmise ja vast arvutatud koordinaadi vahele g.drawLine((int)x, (int)y, (int)x1, (int)y1); //teeme vast arvutatud koordinaadist eelmise ja ... x = x1; y = y1; // ...hakkabki tsükkel jälle otsast peale :) } } public void run(){ while(true){ //suurendab algnurka pii/24 võrra rad += kraad; try{ Thread.sleep(100); }catch(InterruptedException e){} repaint(); } } public void adjustmentValueChanged(AdjustmentEvent e){ samm = ((Scrollbar)e.getSource()).getValue(); System.out.println("" + samm); repaint(); } public static void main(String args[]){ Frame f = new Frame("Spiraal"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setLayout(new BorderLayout()); f.setSize(200, 200); //Teeb isendi käesolevast klassist Spiraal Spiraal2 s = new Spiraal2(); f.add(s, BorderLayout.CENTER); Scrollbar c = new Scrollbar(Scrollbar.VERTICAL); c.setMinimum(1); c.setMaximum(300); c.setValue(10); c.addAdjustmentListener(s); f.add(c, BorderLayout.EAST); f.show(); } }