rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Java基础

java swing Koch 雪花

java swing Koch 雪花
//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
顶一下
(0)
踩一下
(0)