1

我需要在Java中绘制一个起始角度为350,结束角度为20的饼图。我遵循的坐标系如下:-

        |0  
        |
270-----------90 
        |
        |180

这里的问题是起始角度大于结束角度。相反,我设法绘制了弧线。任何帮助都会很棒。

4

3 回答 3

6

您将有一个起始角度和一个“范围”角度,而不是结束角度。所以,我不认为你会在绘制弧线时遇到问题。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Test extends JFrame{
    public static void main(String[] args){
        new Test();
    }
    public Test(){
        this.setSize(400,400);
        this.setVisible(true);
    }
    public void paint(Graphics g) {
        g.fillArc(100, 100, 100, 100, 70, 30);
    }
}

在此处输入图像描述

或者,您也可以使用Arc2D类。还有一点需要注意的是,在 java 中,这是默认的坐标机制。

        |90  
        |
180-----------0 
        |
        |270
于 2010-10-29T12:58:14.230 回答
2

使用(450 - angle) % 360切换角度。概念 450 = 180 + 270;

于 2012-01-05T09:04:25.980 回答
0

扩展 @bragbog 的工作代码,我不得不浏览类似的情况,我必须将类似于 OP 的坐标系统转换为 Java 坐标系统。

这就是我想出的:

float coordChangeOffset = ((arcDegree % 180) - 45) * 2;
filterPanel.setArc(absModAngle(arcDegree - coordChangeOffset), 360 - sectorAngle);

private float absModAngle(float deg) {
    return modAngle((deg + 360));
}

public class FilterPanel extends JPanel {

    private final int x, y, w, h;
    private int startAngle, arcFill;

    public FilterPanel(int x, int y, int w, int h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;

        setBackground(UiColorPalette.TRANSPARENT);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) this.getGraphics();

        g2d.setColor(UiColorPalette.FILTER_FILL);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillArc(x, y, w, h, startAngle, arcFill);
    }

    void setArc(float startAngle, float arcFill) {
        this.startAngle = (int) startAngle;
        this.arcFill = (int) arcFill;
        System.err.out("Java Coordinate System - StartAngle: " + startAngle + ", arcFill: " + arcFill);
    }
}

这可能会令人困惑,但 Java 系统和我正在使用的系统使 45 和 225 保持不变,因此系统的转置在其斜率上翻转(其中 45 和 225 与任一轴具有相同的角度)

absModAngle 确保我得到的角度在我的 [0 - 360) 范围内。

我创建了一个额外的图像,但我没有足够的代表来添加它。本质上

y = x - F(x), where F(x) is coordChangeOffset noted above ((x Mod 180) - 45) * 2
于 2018-12-20T18:08:29.550 回答