import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 三角形
* @author tiger
* 每点击一次屏幕,生成现有三角形的内部三角形,重画屏幕
*/
public class Triangle {
Point p1 , p2, p3;
boolean isCenterT = false;
public Triangle(Point p1, Point p2, Point p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public Triangle(Point p1, Point p2, Point p3, boolean isCenterT) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.isCenterT = isCenterT;
}
@SuppressWarnings("unchecked")
public void createInner(List list)
{
Point m1 = this.getMiddle(p1, p2);
Point m2 = this.getMiddle(p1, p3);
Point m3 = this.getMiddle(p2, p3);
list.add(new Triangle(m1, m2, m3, true));
list.add(new Triangle(p1, m1, m2));
list.add(new Triangle(p2, m1, m3));
list.add(new Triangle(p3, m2, m3));
}
private Point getMiddle(Point p1, Point p2)
{
return new Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
}
public void draw(Graphics g)
{
g.drawLine(p1.x, p1.y, p2.x, p2.y);
g.drawLine(p1.x, p1.y, p3.x, p3.y);
g.drawLine(p2.x, p2.y, p3.x, p3.y);
}
@SuppressWarnings("unchecked")
static List list = new LinkedList();
public static void main(String[] args) {
int width = 400;
int height = 400;
//也可以在按键事件中再添加初始图像(最好是随机图形)
Point p1 = new Point(width / 2, 20);
Point p2 = new Point(20, height - 20);
Point p3 = new Point(width - 20, height - 20);
list.add(new Triangle(p1, p2, p3));
JFrame frame = new JFrame("triangle");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel()
{
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
for (int i = 0; i < list.size(); i++) {
Triangle t = (Triangle)list.get(i);
t.draw(g);
}
}
};
panel.addMouseListener(new MouseAdapter()
{
@SuppressWarnings("unchecked")
@Override
public void mouseClicked(MouseEvent e) {
List list2 = new LinkedList();
for (int i = 0; i < list.size(); i++) {
Triangle t = (Triangle)list.get(i);
if(t.isCenterT)continue;
t.createInner(list2);
}
list.clear();
list = list2;
Component c = e.getComponent();
c.repaint();
}
});
panel.setFocusable(true);
panel.setPreferredSize(new Dimension(width,height));
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}