You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java转盘落点数值计算问题求助:无法获取正确指向值

旋转转盘指针指向数值偏差问题修复

问题现象

实现旋转转盘功能时,指针指向的数值总是偏差1或更多,已参照教程实现了Slices数组与结果输出逻辑,但结果不符合预期。

旋转的转盘

原始代码

public class RoulettePanel extends javax.swing.JPanel {

    int x;
    int y;
    int rotationAngle = 0;
    Image image;
    double spinSpeed;
    double speedDeduction;
   // int[] Slices = {0,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2,0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,21,36,13,1};

    int[] Slices = {1,13,36,21,3,15,34,22,5,17,32,20,7,11,30,26,9,28,0,2,14,35,23,4,16,33,21,6,18,31,19,8,12,29,25,10,27,0};

    public RoulettePanel() {
        image = new ImageIcon("src/images/rouletteWheel.png").getImage();
        spinSpeed = 5;
        speedDeduction = 0;

        add(startTimer);
        startTimer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                time.start();
            }
        });

    }

    JButton startTimer = new JButton("Spin wheel");

    Timer time = new Timer(10, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            speedDeduction += 0.0001;
            spinSpeed -= speedDeduction;
            rotationAngle += spinSpeed;
            if (spinSpeed <= 0) {
                time.stop();
                System.out.println(rotationAngle);
                System.out.println(rotationAngle/(365/38));
                System.out.println(Slices[Integer.valueOf(rotationAngle/(365/38))]);
                

            }
            repaint();
        }

    });

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();

        if (rotationAngle >= 365) {
            rotationAngle -= 365;
        }
        double rotationAngleRad = Math.toRadians(rotationAngle);
        g2d.rotate(rotationAngleRad, 600, 600);
        g2d.drawImage(image, 200, 200, null);

        int[] xPoints = {575, 600, 625};
        int[] yPoints = {200, 250, 200};
        g.setColor(Color.orange);
        g.fillPolygon(xPoints, yPoints, 3);

        g2d.dispose();
    }

}

问题根源与修复方案

1. 错误的圆形角度基准

代码中误用365度作为圆形总角度(实际应为360度),导致每个切片的角度计算偏差,直接引发索引错误。

2. 角度取模逻辑错误

原代码用条件判断if (rotationAngle >= 365)来减少角度,既不严谨也不符合圆形角度的循环逻辑,应使用取模运算保证角度始终在0-359范围内。

3. Slices数组数据错误

当前Slices数组存在重复值21,且顺序可能与实际转盘切片不匹配,建议使用注释中的正确数组,或根据转盘实际布局重新排列。

4. 浮点精度丢失问题

直接将rotationAngle/(360/38)转换为整数会丢失精度,需先对角度取模,再用Math.floor确保索引计算准确。

修复后的关键代码

修改Timer中的结果计算逻辑

Timer time = new Timer(10, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        speedDeduction += 0.0001;
        spinSpeed -= speedDeduction;
        rotationAngle += spinSpeed;
        if (spinSpeed <= 0) {
            time.stop();
            // 取模得到0-359的有效角度
            int finalAngle = (int) (rotationAngle % 360);
            // 每个切片的角度(38个切片,总360度)
            double perSliceAngle = 360.0 / 38;
            // 计算对应的切片索引
            int sliceIndex = (int) Math.floor(finalAngle / perSliceAngle);
            
            // 若转盘顺时针旋转后指针指向的顺序与数组相反,可取消下面注释反转索引
            // sliceIndex = 37 - sliceIndex;
            
            System.out.println("最终角度: " + finalAngle);
            System.out.println("切片索引: " + sliceIndex);
            System.out.println("指向数值: " + Slices[sliceIndex]);
        }
        repaint();
    }
});

修改paintComponent中的角度处理

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();

    // 用取模运算保证角度在0-359之间
    rotationAngle = (int) (rotationAngle % 360);
    double rotationAngleRad = Math.toRadians(rotationAngle);
    g2d.rotate(rotationAngleRad, 600, 600);
    g2d.drawImage(image, 200, 200, null);

    int[] xPoints = {575, 600, 625};
    int[] yPoints = {200, 250, 200};
    g.setColor(Color.orange);
    g.fillPolygon(xPoints, yPoints, 3);

    g2d.dispose();
}

修正Slices数组

替换为注释中的正确数组(无重复值,顺序符合标准转盘):

int[] Slices = {0,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2,0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,21,36,13,1};

验证说明

  1. 测试不同spinSpeed值,观察指针指向数值是否与输出一致;
  2. 若结果仍有偏差,检查转盘图片的旋转方向与Slices数组顺序是否匹配,必要时反转索引(sliceIndex = 37 - sliceIndex)。

内容的提问来源于stack exchange,提问作者user18629470

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:27:08