wang2046783134 2016-06-29 03:47 采纳率: 100%
浏览 2203
已采纳

java绘图时对多个图形(把这些图形视为一体)进行旋转操作

比如显示一个表,表上有刻度,让刻度进行
旋转(当然,实际中不会旋转,是指针进行旋转),现在我让课都进行旋转,怎么做,
我想到的时计算时将旋转角度进行变化,但是好像效率不高,
如果能将刻度视为一个整体,进行整体的旋转可以吗?
代码如下:

    @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            //去锯齿
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            //清空原来的图形
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
            g2d.setColor(Color.BLACK);

            //圆中心坐标
            int xCenter = this.getWidth() / 2;
            int yCenter = this.getHeight() / 2;
            // 计算半径
            int radius = (int) (Math.min(this.getWidth(), this.getHeight()) * 0.8*0.5);  //因为是半径,所以 1/2
            // 画圆
            g2d.drawOval(xCenter - radius, yCenter - radius, radius * 2, radius * 2);

            //画时钟的12个数字(如果用rotate方法则数字会倾斜倒立)
            for (int i = 0; i < 12; i++) {
                //已知圆中心占坐标(x0,y0),半径r,角度a0,则圆上任一点坐标(x,y)计算:
                //x = x0 + r * cos(ao * 3.14 /180)
                //y = y0 + r * sin(ao * 3.14 /180)

                double dd = Math.PI / 180 * i * (360 / 12); //每次转360/12度
                int x = (xCenter - 4) + (int) ((radius - 12) * Math.cos(dd));
                int y = (yCenter + 4) + (int) ((radius - 12) * Math.sin(dd));

                //因为是从顺时钟3点钟开始画,所以索引i需要加上3
                int j = i + 3; //这里可以改
                if (j > 12) {
                    j = j - 12;
                }
                g2d.drawString(Integer.toString(j), x, y);
            }

            AffineTransform old = g2d.getTransform();

            //时钟的60个刻度
            for (int i = 0; i < 60; i++) {
                int w = i % 5 == 0 ? 5 : 3;
                g2d.fillRect(xCenter - 2, 28, w, 3);
                g2d.rotate(Math.toRadians(6), xCenter, yCenter);  //每一小格转6度, 以圆心为中心点
            }
            //设置旋转重置
            g2d.setTransform(old);

            Calendar calendar = Calendar.getInstance();
            int hour = calendar.get(Calendar.HOUR_OF_DAY);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);

            //画日期和星期
            DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");  //datadormat是一个抽象类
            DateFormat df2 = new SimpleDateFormat("E");  //星期的格式
            g2d.drawRoundRect(xCenter - 30, yCenter + 30, 72, 35, 10, 10);
            g2d.drawString(df1.format(calendar.getTime()), xCenter - 25, yCenter + 45);
            g2d.drawString(df2.format(calendar.getTime()), xCenter - 12, yCenter + 60);

            // 画时钟的图形
            double hAngle = (hour - 12 + minute / 60d) * 360d / 12d;
            g2d.rotate(Math.toRadians(hAngle), xCenter, yCenter);
            int xhArr[] = {xCenter, xCenter + 9, xCenter, xCenter - 9};
            int yhArr[] = {65, yCenter, yCenter + 10, yCenter};
            g2d.drawPolygon(xhArr, yhArr, xhArr.length);
            g2d.setTransform(old);

            // 画分钟的图形
            double mAngle = (minute + second / 60d) * 360d / 60d;
            g2d.rotate(Math.toRadians(mAngle), xCenter, yCenter);
            int xmArr[] = {xCenter, xCenter + 6, xCenter, xCenter - 6};
            int ymArr[] = {45, yCenter, yCenter + 12, yCenter};
            g2d.drawPolygon(xmArr, ymArr, xmArr.length);
            g2d.setTransform(old);

            // 画秒钟的图形
            double sAngle = second * 360d / 60d;
            g2d.rotate(Math.toRadians(sAngle), xCenter, yCenter);
            g.drawLine(xCenter, yCenter + 10, xCenter, 35);
        }

这个该怎么写?除了每次计算时进行 读书+旋转角度 ,这个方法除外
在此感谢

  • 写回答

2条回答 默认 最新

  • wang2046783134 2016-06-29 14:39
    关注

    没人回答,自己回答吧。。。。。

     graphics2D g2 = (graphics2D)g;
     g2.translate(20, 50);
     g2.scale(12, 50);
     g2.rotate();
    

    graphics2D每次translate都会以当前的坐标系为基准:

     g.setColor(Color.black);
            g.drawLine(10, 10, 20, 10);
    
            g.translate(100, 100);
    
            g.setColor(Color.yellow);
            g.drawLine(10, 10, 20, 10);
    
            g.translate(50, 50);
    
            g.setColor(Color.red);
            g.drawLine(10, 10, 20, 10);
    

    试一下就知道了
    呜呜,没人解答,好像是这样吧。。。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退