code: import java.awt.*;
  import java.awt.event.*;
  import static java.lang.Math.*;
  import javax.swing.*;
  
  public class Cuboid extends JPanel {
      double[][] nodes = {{-1, -1, -1}, {-1, -1, 1}, {-1, 1, -1}, {-1, 1, 1},
      {1, -1, -1}, {1, -1, 1}, {1, 1, -1}, {1, 1, 1}};
  
      int[][] edges = {{0, 1}, {1, 3}, {3, 2}, {2, 0}, {4, 5}, {5, 7}, {7, 6},
      {6, 4}, {0, 4}, {1, 5}, {2, 6}, {3, 7}};
  
      int mouseX, prevMouseX, mouseY, prevMouseY;
  
      public Cuboid() {
          setPreferredSize(new Dimension(640, 640));
          setBackground(Color.white);
  
          scale(80, 120, 160);
          rotateCube(PI / 5, PI / 9);
  
          addMouseListener(new MouseAdapter() {
              @Override
              public void mousePressed(MouseEvent e) {
                  mouseX = e.getX();
                  mouseY = e.getY();
              }
          });
  
          addMouseMotionListener(new MouseAdapter() {
              @Override
              public void mouseDragged(MouseEvent e) {
                  prevMouseX = mouseX;
                  prevMouseY = mouseY;
                  mouseX = e.getX();
                  mouseY = e.getY();
  
                  double incrX = (mouseX - prevMouseX) * 0.01;
                  double incrY = (mouseY - prevMouseY) * 0.01;
  
                  rotateCube(incrX, incrY);
                  repaint();
              }
          });
      }
  
      private void scale(double sx, double sy, double sz) {
          for (double[] node : nodes) {
              node[0] *= sx;
              node[1] *= sy;
              node[2] *= sz;
          }
      }
  
      private void rotateCube(double angleX, double angleY) {
          double sinX = sin(angleX);
          double cosX = cos(angleX);
  
          double sinY = sin(angleY);
          double cosY = cos(angleY);
  
          for (double[] node : nodes) {
              double x = node[0];
              double y = node[1];
              double z = node[2];
  
              node[0] = x * cosX - z * sinX;
              node[2] = z * cosX + x * sinX;
  
              z = node[2];
  
              node[1] = y * cosY - z * sinY;
              node[2] = z * cosY + y * sinY;
          }
      }
  
      void drawCube(Graphics2D g) {
          g.translate(getWidth() / 2, getHeight() / 2);
  
          for (int[] edge : edges) {
              double[] xy1 = nodes[edge[0]];
              double[] xy2 = nodes[edge[1]];
              g.drawLine((int) round(xy1[0]), (int) round(xy1[1]),
                      (int) round(xy2[0]), (int) round(xy2[1]));
          }
  
          for (double[] node : nodes) {
              g.fillOval((int) round(node[0]) - 4, (int) round(node[1]) - 4, 8, 8);
          }
      }
  
      @Override
      public void paintComponent(Graphics gg) {
          super.paintComponent(gg);
          Graphics2D g = (Graphics2D) gg;
          g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                  RenderingHints.VALUE_ANTIALIAS_ON);
  
          drawCube(g);
      }
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(() -> {
              JFrame f = new JFrame();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.setTitle("Cuboid");
              f.setResizable(false);
              f.add(new Cuboid(), BorderLayout.CENTER);
              f.pack();
              f.setLocationRelativeTo(null);
              f.setVisible(true);
          });
      }
  }
  