如何标记个人3D盒子?

时间:2015-07-01 16:22:43

标签: java swing jframe jpanel

我即将完成一个程序,该程序使用JFrame和JTextField(不涉及j3d)打印出一个3D框的循环。

我希望能够点击一个方框,它会提供有关该方框的具体信息(例如方框编号,简短说明等)。这纯粹是为了修行目的。

下面我有一个关于我的程序的截图[编辑:没关系它因为缺乏声誉而让我失望]和我的屏幕课程,它完成了程序的大部分繁重工作。我有很多代码,所以如果有人想要任何具体的东西,请告诉我。

public class Screen extends JPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener{

    static ArrayList<Box3D> Boxes3D = new ArrayList<Box3D>();

    static ArrayList<Cube> Cubes = new ArrayList<Cube>();

    static ArrayList<Trapezoid> Traps = new ArrayList<Trapezoid>();

    static ArrayList<BigTrapezoid> BTraps = new ArrayList<BigTrapezoid>();

    static Box3DObject PolygonOver = null;

    Robot r;

    //Change starting location of center-cross
    static double[] ViewFrom = new double[] { 80, 200, 100},    
                    ViewTo = new double[] {0, 0, 0},
                    LightDir = new double[] {1, 1, 1};


    //Only change MovementSpeed if desired
    static double zoom = 1000, MinZoom = 500, MaxZoom = 1500, MouseX = 0, MouseY = 0, MovementSpeed = 10;

    double drawFPS = 0, MaxFPS = 1000, SleepTime = 1000.0/MaxFPS, LastRefresh = 0, StartTime = System.currentTimeMillis(), LastFPSCheck = 0, Checks = 0;
    //VertLook goes from 0.999 to -0.999, minus being looking down and plus being looking up, HorLook goes round in radians
    //aimSight changes the size of the center-cross. The lower HorRotSpeed or VertRotSpeed, the faster the camera will rotate in those directions
    double VertLook = -0.999, HorLook = -1.57, aimSight = 4, HorRotSpeed = 800, VertRotSpeed = 800, SunPos = 0;

    int[] NewOrder;

    static boolean OutLines = true;
    boolean[] Keys = new boolean[7];

    long repaintTime = 0;

    double step = 5.3;

    //Constants
    final int MAXY = 23;
    final int MAXX = 28;

    public Screen()
    {       
        this.addKeyListener(this);
        setFocusable(true);     

        this.addMouseListener(this);
        this.addMouseMotionListener(this);
        this.addMouseWheelListener(this);

        invisibleMouse();   
        /*             
        for(int k=0;k<=MAXY;k++){
            for(int i=0;i<=(MAXX-k);i++){
                double x=(k/2+i)*step;
                double y=k*step;
                Cubes.add(new Cube(x, y, 0, 5.2, 5.2, 2.8, Color.cyan));
            }
        }*/
        //Cubes.add(new Cube(0, 0, 0, 5.2, 5.2, 2.8, Color.cyan));
        //Cubes.add(new Cube(0, 0, 0, 10, 10, 2.8, Color.yellow));


        /*
        Cube(x Plane location,y Plane location,z Plane location,x size,y size,z size, color)
        This is the same for Trapezoid and BigTrapezoid constructors
        The x,y,z Plane locations are the starting points for the objects
        */
        for(int k=0;k<=MAXY/2;k++){
            for(int i=MAXX/2;i<=MAXX-k;i++){

                Cubes.add(new Cube((i)*step,k*2*step,0,5.2,5.2,2.8,Color.cyan));  

                Cubes.add(new Cube((i)*step-step/2,k*2*step+step,0,5.2,5.2,2.8,Color.cyan));  

            }  
        }
        for(int k=0;k<=MAXY/2;k++){
            for(int i=MAXX/2;i>=0+k;i--){

                Cubes.add(new Cube((i)*step,k*2*step,0,5.2,5.2,2.8,Color.cyan));  

                Cubes.add(new Cube((i)*step+step/2,k*2*step+step,0,5.2,5.2,2.8,Color.cyan));  

            }  
        }
        Traps.add(new Trapezoid(-2.65,0,2.9,159,127.2,-66.8,Color.white));  
        BTraps.add(new BigTrapezoid(-2.65,0,3.9,159.127,127.2,-68.8,Color.white)); 

    }

    public void paintComponent(Graphics g)
    {
        //Clear screen and draw background color
        g.setColor(new Color(140, 180, 180));           
        g.fillRect(0, 0, (int)Box3DApp.ScreenSize.getWidth(), (int)Box3DApp.ScreenSize.getHeight());

        CameraMovement();

        //Calculated all that is general for this camera position
        Calculator.SetPrederterminedInfo();

        //Updates each polygon for this camera position
        for(int i = 0; i < Boxes3D.size(); i++)
            Boxes3D.get(i).updatePolygon();

        //Set drawing order so closest polygons gets drawn last
        setOrder();

        //Set the polygon that the mouse is currently over
        setPolygonOver();

        //draw polygons in the Order that is set by the 'setOrder' function
        for(int i = 0; i < NewOrder.length; i++)
            Boxes3D.get(NewOrder[i]).DrawablePolygon.drawPolygon(g);

        //draw the cross in the center of the screen
        drawMouseAim(g);            

        //Message display
        g.drawString("FPS: " + (int)drawFPS + " (Benchmark)", 40, 40);
        g.drawString("To Zoom Press:",40,60);
        g.drawString("-W for in",40,80);
        g.drawString("-S for out",40,100);
        g.drawString("To Move Press:",40,120);
        g.drawString("-A to move left",40,140);
        g.drawString("-D to move right", 40,160);
        g.drawString("-E to move up", 40,180);
        g.drawString("-Q to move down", 40,200);
        g.drawString("To Move Automatically:", 40,220);
        g.drawString("-1 to move", 40,240);
        g.drawString("-2 to stop", 40,260);

        SleepAndRefresh();
    }

    void setOrder()
    {
        double[] k = new double[Boxes3D.size()];
        NewOrder = new int[Boxes3D.size()];

        for(int i=0; i<Boxes3D.size(); i++)
        {
            k[i] = Boxes3D.get(i).AvgDist;
            NewOrder[i] = i;
        }

        double temp;
        int tempr;      
        for (int a = 0; a < k.length-1; a++)
            for (int b = 0; b < k.length-1; b++)
                if(k[b] < k[b + 1])
                {
                    temp = k[b];
                    tempr = NewOrder[b];
                    NewOrder[b] = NewOrder[b + 1];
                    k[b] = k[b + 1];

                    NewOrder[b + 1] = tempr;
                    k[b + 1] = temp;
                }
    }

    void invisibleMouse()
    {
         Toolkit toolkit = Toolkit.getDefaultToolkit();
         BufferedImage cursorImage = new BufferedImage(1, 1, BufferedImage.TRANSLUCENT); 
         Cursor invisibleCursor = toolkit.createCustomCursor(cursorImage, new Point(0,0), "InvisibleCursor");        
         setCursor(invisibleCursor);
    }

    void drawMouseAim(Graphics g)
    {
        g.setColor(Color.black);
        g.drawLine((int)(Box3DApp.ScreenSize.getWidth()/2 - aimSight), (int)(Box3DApp.ScreenSize.getHeight()/2), (int)(Box3DApp.ScreenSize.getWidth()/2 + aimSight), (int)(Box3DApp.ScreenSize.getHeight()/2));
        g.drawLine((int)(Box3DApp.ScreenSize.getWidth()/2), (int)(Box3DApp.ScreenSize.getHeight()/2 - aimSight), (int)(Box3DApp.ScreenSize.getWidth()/2), (int)(Box3DApp.ScreenSize.getHeight()/2 + aimSight));         
    }

    void SleepAndRefresh()
    {
        long timeSLU = (long) (System.currentTimeMillis() - LastRefresh); 

        Checks ++;          
        if(Checks >= 15)
        {
            drawFPS = Checks/((System.currentTimeMillis() - LastFPSCheck)/1000.0);
            LastFPSCheck = System.currentTimeMillis();
            Checks = 0;
        }

        if(timeSLU < 1000.0/MaxFPS)
        {
            try {
                Thread.sleep((long) (1000.0/MaxFPS - timeSLU));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }   
        }

        LastRefresh = System.currentTimeMillis();

        repaint();
    }

    void CameraMovement()
    {
        Vector ViewVector = new Vector(ViewTo[0] - ViewFrom[0], ViewTo[1] - ViewFrom[1], ViewTo[2] - ViewFrom[2]);
        double xMove = 0, yMove = 0, zMove = 0;
        Vector HorizontalVector = new Vector (0, 0, 1);
        Vector VerticalVector = new Vector (0,1,0);
        Vector SideViewVector = ViewVector.CrossProduct(HorizontalVector);
        Vector FrontViewVector = ViewVector.CrossProduct(VerticalVector);
        //w key (zoom in)
        if(Keys[0])
        {
            xMove += ViewVector.x ;
            yMove += ViewVector.y ;
            zMove += ViewVector.z ;
        }
        //s key (zoom out)
        if(Keys[2])
        {
            xMove -= ViewVector.x ;
            yMove -= ViewVector.y ;
            zMove -= ViewVector.z ;
        }
        //a key (move left)
        if(Keys[1])
        {
            xMove += SideViewVector.x ;
            yMove += SideViewVector.y ;
            zMove += SideViewVector.z ;     
        }
        //d key (move right)
        if(Keys[3])
        {
            xMove -= SideViewVector.x ;
            yMove -= SideViewVector.y ;
            zMove -= SideViewVector.z ;     
        }
        //q key (move down)
        if(Keys[4])
        {                     
            zMove -= FrontViewVector.z ;            
        }
        //e key (move up)
        if(Keys[5])
        {                     
            zMove += FrontViewVector.z ;
        }
        //1 & 2 key (move right automatic and stop)
        if(Keys[6])
        {            
            xMove += SideViewVector.x ;
            yMove += SideViewVector.y ;                    
        }

        Vector MoveVector = new Vector(xMove, yMove, zMove);
        MoveTo(ViewFrom[0] + MoveVector.x * MovementSpeed, ViewFrom[1] + MoveVector.y * MovementSpeed, ViewFrom[2] + MoveVector.z * MovementSpeed);
    }

    void MoveTo(double x, double y, double z)
    {
        ViewFrom[0] = x;
        ViewFrom[1] = y;
        ViewFrom[2] = z;
        updateView();
    }

    void setPolygonOver()
    {
        PolygonOver = null;
        for(int i = NewOrder.length-1; i >= 0; i--)
            if(Boxes3D.get(NewOrder[i]).DrawablePolygon.MouseOver() && Boxes3D.get(NewOrder[i]).draw 
                && Boxes3D.get(NewOrder[i]).DrawablePolygon.visible)
            {
                PolygonOver = Boxes3D.get(NewOrder[i]).DrawablePolygon;
                break;
            }
    }

    void MouseMovement(double NewMouseX, double NewMouseY)
    {       
        double difX = (NewMouseX - Box3DApp.ScreenSize.getWidth()/2);
        double difY = (NewMouseY - Box3DApp.ScreenSize.getHeight()/2);
        difY *= 6 - Math.abs(VertLook) * 5;
        VertLook -= difY  / VertRotSpeed;
        HorLook += difX / HorRotSpeed;

        if(VertLook>0.999)
            VertLook = 0.999;

        if(VertLook<-0.999)
            VertLook = -0.999;

        updateView();
    }

    void updateView()
    {
        double r = Math.sqrt(1 - (VertLook * VertLook));
        ViewTo[0] = ViewFrom[0] + r * Math.cos(HorLook);
        ViewTo[1] = ViewFrom[1] + r * Math.sin(HorLook);        
        ViewTo[2] = ViewFrom[2] + VertLook;
    }

    void CenterMouse() 
    {
        try {
            r = new Robot();
            r.mouseMove((int)Box3DApp.ScreenSize.getWidth()/2, (int)Box3DApp.ScreenSize.getHeight()/2);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W)
            Keys[0] = true;
        if(e.getKeyCode() == KeyEvent.VK_A)
            Keys[1] = true;
        if(e.getKeyCode() == KeyEvent.VK_S)
            Keys[2] = true;
        if(e.getKeyCode() == KeyEvent.VK_D)
            Keys[3] = true; 
        if(e.getKeyCode() == KeyEvent.VK_Q)
            Keys[4] = true;
        if(e.getKeyCode() == KeyEvent.VK_E)
            Keys[5] = true;
        if(e.getKeyCode() == KeyEvent.VK_1)
            Keys[6] = true;
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
            System.exit(0);
    }

    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W)
            Keys[0] = false;
        if(e.getKeyCode() == KeyEvent.VK_A)
            Keys[1] = false;
        if(e.getKeyCode() == KeyEvent.VK_S)
            Keys[2] = false;
        if(e.getKeyCode() == KeyEvent.VK_D)
            Keys[3] = false;
        if(e.getKeyCode() == KeyEvent.VK_Q)
            Keys[4] = false;
        if(e.getKeyCode() == KeyEvent.VK_E)
            Keys[5] = false;
        if(e.getKeyCode() == KeyEvent.VK_2)
            Keys[6] = false;
    }

    public void keyTyped(KeyEvent e) {
    }

    public void mouseDragged(MouseEvent arg0) {
        MouseMovement(arg0.getX(), arg0.getY());
        MouseX = arg0.getX();
        MouseY = arg0.getY();
        CenterMouse();
    }

    public void mouseMoved(MouseEvent arg0) {
        MouseMovement(arg0.getX(), arg0.getY());
        MouseX = arg0.getX();
        MouseY = arg0.getY();
        CenterMouse();
    }

    public void mouseClicked(MouseEvent arg0) {
    }

    public void mouseEntered(MouseEvent arg0) {
    }

    public void mouseExited(MouseEvent arg0) {
    }

    public void mousePressed(MouseEvent arg0) {
        /*
        if(arg0.getButton() == MouseEvent.BUTTON1)
            if(PolygonOver != null)
                //PolygonOver.
                //PolygonOver.Transparent = false;

        if(arg0.getButton() == MouseEvent.BUTTON3)
            if(PolygonOver != null)
                //PolygonOver.Transparent = true;
        */
    }

    public void mouseReleased(MouseEvent arg0) {
    }

    public void mouseWheelMoved(MouseWheelEvent arg0) {
        if(arg0.getUnitsToScroll()>0)
        {
            if(zoom > MinZoom)
                zoom -= 25 * arg0.getUnitsToScroll();
        }
        else
        {
            if(zoom < MaxZoom)
                zoom -= 25 * arg0.getUnitsToScroll();
        }   
    }
}

0 个答案:

没有答案