import java.util.*; import java.awt.*; import java.util.concurrent.atomic.*; public class MyPolygon implements Runnable { // ? public AtomicInteger vx = new AtomicInteger(); public AtomicInteger vy = new AtomicInteger(); public AtomicInteger pp = new AtomicInteger(0); Random rnd = new Random(); public AtomicInteger isColors = new AtomicInteger(0); public ArrayList colors = new ArrayList(); public boolean isLife=true; Thread t; int pCount; // точки полигона public ArrayList points; // точки полигона для вывода на экран с поворотом public ArrayList drawPoints; public Color color; // координаты полигона, т.е. его центра вращения public int x; public int y; // окно int WinX=1000, WinY=600; public int SpeedX; public int SpeedY; public int SRotate; public int CRotate; public MyPolygon () { colors.add(Color.red); colors.add(Color.black); colors.add(Color.yellow); colors.add(Color.green); colors.add(Color.orange); colors.add(Color.magenta); colors.add(Color.blue); colors.add(Color.cyan); colors.add(Color.pink); points = new ArrayList(); drawPoints = new ArrayList(); // создание потока t = new Thread(this,"Polygon"); //запуск потока t.start(); } public int getCRotate() { return CRotate; } public void setCRotate(int rotate) { CRotate = rotate; } public int getSpeedX() { return SpeedX; } public void setSpeedX(int speedX) { SpeedX = speedX; } public int getSpeedY() { return SpeedY; } public void setSpeedY(int speedY) { SpeedY = speedY; } public int getSRotate() { return SRotate; } public void setSRotate(int rotate) { SRotate = rotate; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } // Добавляет в коллекцию новую точку. public void addPoint(int x, int y, Color color) { points.add( new PointXY(x,y,color)); drawPoints.add( new PointXY(x,y,color)); pCount++; } // Удаляет точку по номеру public void deletePoint(int ID){ points.remove(ID); drawPoints.remove(ID); pCount--; } // Возвращает истину если точка x,y находиться внутри полигона (смотрим по реальным коорд.) public boolean isPointInPolygon (int x, int y) { int cp=0,cm=0; int d=0; // Возьмем первую точку и добавим в конец int xa = drawPoints.get(0).getX(); int ya = drawPoints.get(0).getY(); drawPoints.add(new PointXY(xa,ya,Color.black)); xa+=this.x; ya+=this.y; // Теперь последняя точка повторяет первую, и можно сделать замкнутый цикл по всем точкам... // Получим коорд. i-ой точки int xi = this.x + drawPoints.get(0).getX(); int yi = this.y + drawPoints.get(0).getY(); int i=1; do { // получим координаты i-ой и i+1-ой точек int xip1 = this.x + drawPoints.get(i).getX(); int yip1 = this.y + drawPoints.get(i).getY(); // имеем коорд. i-ой(xi,yi) и i+1(xip1,yip1) //System.out.println(i+"-ая точка, d = "+d); //System.out.println(xi+" "+yi); //System.out.println(xip1+" "+yip1); d = xi*y+x*yip1+xip1*yi-xip1*y-x*yi-xi*yip1; if (d > 0) { cp++; } else { cm++; } xi = this.x + drawPoints.get(i).getX(); yi = this.y + drawPoints.get(i).getY(); i++; } while (i