Скачиваний:
72
Добавлен:
09.05.2014
Размер:
5.9 Кб
Скачать
package mainframe;

import java.awt.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;


class DrawComponent extends JComponent
{
public DrawComponent()
{
squares = new ArrayList <Rectangle2D>();
current = null;
}
// Ось ОХ
private Line2D buildOsX()
{
double x0 = X_BOUND;
double y0 = G_HEIGHT/2;
double xk = G_WIDTH-X_BOUND;
double yk = G_HEIGHT/2;

Line2D osx = new Line2D.Double(x0, y0, xk, yk);

return osx;
}
// Ось ОУ
private Line2D buildOsY()
{
double x0 = G_WIDTH/2;
double y0 = Y_BOUND;
double xk = G_WIDTH/2;
double yk = G_HEIGHT-Y_BOUND;

Line2D osy = new Line2D.Double(x0, y0, xk, yk);
return osy;
}
// Деления на оси ОХ
private Line2D buildRiskaX(double x0)
{
Line2D risx = new Line2D.Double(x0,
(double)(G_HEIGHT/2-G_HEIGHT/100),
x0,
(double)(G_HEIGHT/2+G_HEIGHT/100));
return risx;
}
// Деления на оси ОУ
private Line2D buildRiskaY(double y0)
{
Line2D risy = new Line2D.Double(G_WIDTH/2-G_HEIGHT/100,
y0,
G_WIDTH/2+G_HEIGHT/100,
y0);
return risy;
}
// Прямоугольник
private Rectangle2D buildRec()
{
double leftX = G_WIDTH/2;
double topY = G_HEIGHT/2-rad/2;
double width = rad+1;
double height = rad/2+1;

Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
return rect;
}
// Треугольник
private GeneralPath buildTr()
{
GeneralPath tr = new GeneralPath();
tr.moveTo(G_WIDTH/2+1, G_HEIGHT/2+1);
tr.lineTo(G_WIDTH/2, G_HEIGHT/2+rad);
tr.lineTo(G_WIDTH/2-rad/2-1, G_HEIGHT/2);
tr.closePath();

return tr;
}
// Сектор
private Arc2D buildSector()
{
Arc2D sector = new Arc2D.Double(G_WIDTH/2-rad/2,
G_HEIGHT/2-rad/2,rad+1,rad+1,90, 90,Arc2D.PIE);

return sector;
}
// Панель, на которой отображаются наша область
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;

g2.setPaint(Color.green);

// Рисуем прямоугольник
Rectangle2D rect = this.buildRec();
g2.fill(rect);

// Рисуем треугольник
GeneralPath tr = this.buildTr();
g2.fill(tr);

// Рисуем сектор
Arc2D sector = this.buildSector();
g2.fill(sector);

g2.setPaint(Color.BLACK); // Заполнение черным
g2.setStroke(new BasicStroke(2)); // Изменение ширины линии

// Рисуем ось ОХ
Line2D linex = this.buildOsX();
g2.draw(linex);

area = new Shape[] {sector, tr, rect};

// Рисуем ось ОУ
Line2D liney = this.buildOsY();
g2.draw(liney);

// Рисуем деления и R
Line2D[] riska = new Line2D[5];
for (int i=0; i<5;i++)
{
riska[i] = this.buildRiskaX(G_WIDTH/2-rad+i*(rad/2));
g2.draw(riska[i]);
riska[i] = this.buildRiskaY(G_HEIGHT/2-rad+i*(rad/2));
g2.draw(riska[i]);
}

g2.drawString("R", G_WIDTH/2+G_WIDTH/160, (int)(G_HEIGHT/2-rad-G_HEIGHT/80));
g2.drawString("R", (int)(G_WIDTH/2+G_WIDTH/160+rad), (int)(G_HEIGHT/2-G_HEIGHT/80));
g2.drawString("R/2", G_WIDTH/2+G_WIDTH/160, (int)(G_HEIGHT/2-rad/2-G_HEIGHT/80));
g2.drawString("R/2", (int)(G_WIDTH/2+G_WIDTH/160+rad/2), (int)(G_HEIGHT/2-G_HEIGHT/80));
g2.drawString("0", (int)(G_WIDTH/2+G_WIDTH/160), (int)(G_HEIGHT/2-G_HEIGHT/80));

g2.setStroke(new BasicStroke(3)); // Изменение ширины линии

for (Rectangle2D r : squares)
if (this.isContain(new Point2D.Double(r.getX(),r.getY())))
{
g2.setPaint(Color.red); // Если попали окрашиваем точку в красный
g2.draw(r);
}
else
{
g2.setPaint(Color.blue); // Если не попали окрашиваем точку в синий
g2.draw(r);
}

}

boolean isContain(Point2D p)
{
for (Shape s: area)
{
if (s.contains(p)) return true;
}
return false;
}

void add(Point2D p)
{
double x = p.getX();
double y = p.getY();

current = new Rectangle2D.Double(x,y,1,1);
squares.add(current); // Добавляем компонент current в контейнер

repaint();
}

void repaintPoints(NPanel panel)
{
Rectangle2D bufrec = new Rectangle2D.Double();
for (int i=0; i<squares.size(); i++)
{
bufrec=squares.get(i);

double nx = panel.setPixelX(((panel.setDecX(bufrec.getCenterX(), this))*
panel.getOldLogicRad()/panel.getLogicRad()), this)-0.5;
double ny = panel.setPixelY(((panel.setDecY(bufrec.getCenterY(), this))*
panel.getOldLogicRad()/panel.getLogicRad()),this)-0.5;

bufrec = new Rectangle2D.Double(nx,ny,1,1);

squares.set(i, bufrec);

repaint();
}
}

public final int G_WIDTH = DrawFrame.getMonWidth()/16*13;
public final int G_HEIGHT = DrawFrame.getMonHeight()/16*15;

public final int X_BOUND = G_WIDTH/10;
public final int Y_BOUND = G_HEIGHT/12;
public final double rad = G_HEIGHT*3/8;

private ArrayList <Rectangle2D> squares;
private Rectangle2D current;
private Shape[] area;
}


Соседние файлы в папке mainframe