
//start
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class Mtest {
JFrame mf;
Container root ;
Mypaper paper;
public Mtest() {
// TODO Auto-generated constructor stub
mf = new JFrame();
mf.setSize(800,600);
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mf.setLocation(50, 50);
mf.setTitle("yjy JFrame");
root=mf.getContentPane();
paper = new Mypaper();
root.add(paper);
paper.addMouseListener(new Myhandle());
public static void main(String[] args) {
Mtest test = new Mtest();
test.mf.show();
//end
//start
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
public class Myhandle extends MouseAdapter{
int cnt;
Point st,ed;
int SIZE = 10;
public Myhandle() {
// TODO Auto-generated constructor stub
cnt=0;
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
super.mousePressed(e);
cnt++;
Mypaper src = (Mypaper) e.getSource();
if (cnt==2){
cnt=0;
src.repaint();
Graphics2D g=(Graphics2D)src.getGraphics();
st=e.getPoint();
g.drawRect(st.x-SIZE/2, st.y-SIZE/2, SIZE, SIZE);
//pan.repaint();//不能重画 ,会擦去以前的
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseReleased(e);
if (cnt==1){
Mypaper src = (Mypaper) e.getSource();
Graphics2D g=(Graphics2D)src.getGraphics();
ed=e.getPoint();
g.drawRect(ed.x-SIZE/2, ed.y-SIZE/2, SIZE, SIZE);
g.setColor(Color.BLUE);
g.setStroke(new BasicStroke(2.5f));
g.drawLine(st.x,st.y,ed.x,ed.y);
g.setColor(Color.BLACK);
g.fillRect(50, 100, 650 , 450);
g.setColor(Color.WHITE);
g.setStroke(new BasicStroke(1));
mykoch(st,ed,5,g);
private void mykoch(Point p1 , Point p2 , int lev, Graphics2D g) {
// TODO Auto-generated method stub
if (lev==0){
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}else{
//x=(x1+λx2)/(1+λ),y=(y1+λy2)/(1+λ)
//λ = AP/PB;
double lemda = 1/2.0;
Point t1 = new Point((int)((p1.x+lemda*p2.x)/(lemda+1)),(int)((p1.y+lemda*p2.y)/(lemda+1)));
lemda =2.0;
Point t2 = new Point((int)((p1.x+lemda*p2.x)/(lemda+1)),(int)((p1.y+lemda*p2.y)/(lemda+1)));
Point v1 = new Point(t2.x-t1.x , t2.y-t1.y);
* 利用旋转变换矩阵 找出正三角形的顶点
* |cos a -sin a 0| |x|
* |sin a cos a 0| * |y|
* |0 0 0| |1|
*
* tx = x*cos(a) -y*sin(a);
* ty = x*sin(a) +y*cos(a);
double thta = -Math.PI/3.0; //60 deg
/*但是方向是反的 , -60 应该顺时针转 , 图里是逆时针的
Point v2 = new Point((int)(v1.x*Math.cos(thta) - v1.y*Math.sin(thta)) ,(int)(v1.x*Math.sin(thta)+v1.y*Math.cos(thta)));
Point mid = new Point(v2.x+t1.x,v2.y+t1.y);
mykoch(p1, t1, lev-1, g);
mykoch(t1, mid, lev-1, g);
mykoch(mid, t2, lev-1, g);
mykoch(t2, p2, lev-1, g);
}
}
//end
//start
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Mypaper extends JPanel{
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setFont(new Font("宋体",Font.PLAIN,20));
g.setColor(Color.GRAY);
g.drawString("按下鼠标 , 拖动出一条线", 40, 70);
}
//end