Среда программирования:
Eclipce
import java.awt.*; import javax.swing.*; public class Window extends JFrame{ /* Инициализация окна*/ public Window(int x, int y, boolean b) { setSize(x, y); setDefaultCloseOperation(3); Canvas canvas=new Canvas(); add(canvas); setVisible(b); } public static void main(String[] args) { new Window(1000,700,true); } } @SuppressWarnings("serial") class Canvas extends JComponent{ // переменная для хранения текущего состояния прорисовки int cycle=0; // Переменная, задающая количество линий в одном круге double delta=6.28/20; // Переменная, задающая расстояние между кругами double deltaDist=15; // Переменная, хранящая момент анимации double mom=0.01; // Функция, рисующая анимируемое изображение void draw(int c, double moment, Graphics2D g2){ for(double distance=deltaDist,step=1;distance<200;distance+=deltaDist){ for(double d=0 ;d<6.28;d+=delta){ // Для удобства обращения создаётся массив точек, вокруг текущей (той, что будет рисоваться) Point p[]={ new Point((int)(distance*Math.cos(d)),(int)( distance*Math.sin(d))), new Point((int)(distance*Math.cos(d+step*delta)),(int)( distance*Math.sin(d+step*delta))), new Point((int)((distance+deltaDist)*Math.cos(d+step*delta)),(int)( (distance+deltaDist)*Math.sin(d+step*delta))), new Point((int)((distance+deltaDist)*Math.cos(d)),(int)( (distance+deltaDist)*Math.sin(d))), new Point((int)((distance+deltaDist)*Math.cos(d-step*delta)),(int)( (distance+deltaDist)*Math.sin(d-step*delta))), new Point((int)(distance*Math.cos(d-step*delta)),(int)(distance*Math.sin(d-step*delta))), }; // Вычисление второй координаты, в зависимости от момента анимации int X=(int)(p[c+1].x+(-p[c+1].x+p[c+2].x)*mom), Y=(int)(p[c+1].y+(-p[c+1].y+p[c+2].y)*mom); // Рисование линии по уже вычисленным ранее координатам g2.drawLine(p[0].x,p[0].y, X,Y); } step*=-1; } repaint(); } public void paintComponent(Graphics g){ Graphics2D g2=(Graphics2D)g; // Тип линии, которой будет рисоваться: Толщина 3, закруглённые концы g2.setStroke(new BasicStroke(3.0f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); // Цвет рисования - синий g2.setPaint(new Color(33,55,243)); // Перенос центра координат в центр окна g2.translate(getWidth()/2, getHeight()/2); // Вызов функции рисования draw(cycle, mom,g2); // Приращение момента анимации if(mom<1)mom+=0.01; else { mom=0.01; cycle+=1; cycle%=4; } } }
Прикрепленный файл | Размер |
---|---|
okyo_circle_lines.rar | 3.35 кб |