Рисование дуги в Java

Мне нужно нарисовать круговую дугу на Java с начальным углом 350 и конечным углом 20. Система координат, которой я следую, выглядит следующим образом: -

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

Проблема здесь в том, что начальный угол больше конечного угла. Наоборот, мне удалось нарисовать дугу. Любая помощь была бы отличной.


person Emil    schedule 29.10.2010    source источник


Ответы (3)


У вас будет начальный угол и угол «протяженность», а не конечный угол. Итак, я не думаю, что у вас возникнут проблемы с рисованием дуги.

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
person bragboy    schedule 29.10.2010
comment
На самом деле это для пользовательского компонента качания. Я делаю круговой слайдер с двойным большим пальцем. Для обозначения выбранной области необходима круговая дуга с прозрачностью. Я сталкиваюсь с проблемой, когда начальный угол больше, чем конечный угол. - person Emil; 29.10.2010
comment
@Emil: Здесь вы должны забыть о конечном угле. Дуга всегда имеет начальный угол и протяженность. Даже если у вас есть конечный угол, вы должны явно преобразовать его в дугу Java. - person bragboy; 29.10.2010
comment
@Bragboy: Я выложу код завтра. Он в моей офисной системе. - person Emil; 29.10.2010
comment
@BragBoy: я разместил код. Мне жаль, что код немного грязный. Мне нужно зелье помощь предназначена для заполнения дуги. Я имею в виду, что логика, которую я использую, состоит в том, чтобы преобразовать мои координаты в систему координат дуг, которая неверна. - person Emil; 30.10.2010
comment
@BragBoy: Спасибо за вашу помощь, я решил эту проблему. Вам не нужно смотреть в код. - person Emil; 30.10.2010

Используйте (450 - angle) % 360 для переключения углов. Концепция 450 = 180 + 270;

person Sagar S. De    schedule 05.01.2012

Расширяя рабочий код @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
person DarceVader    schedule 20.12.2018