Desenhando arco em java
-
27-09-2019 - |
Pergunta
Eu preciso desenhar um arco de torta em java com ângulo de partida 350 e ângulo final 20.O sistema cordinato que eu sigo é o seguinte:-
|0
|
270-----------90
|
|180
O problema aqui é que o ângulo de partida é maior que o ângulo final. Para o outro lado, consegui desenhar o arco. Qualquer ajuda seria ótima.
Solução
Você terá um ângulo de partida e um ângulo de 'extensão' e não um ângulo final. Então, eu não acho que você teria problemas para desenhar um arco.
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);
}
}
Como alternativa, você pode usar o Arc2d classe também. Mais uma coisa para observar que em Java, este é o mecanismo de coordenada padrão.
|90
|
180-----------0
|
|270
Outras dicas
Usar (450 - ângulo) % 360 para trocar de ângulos. Conceito 450 = 180 + 270;
Estendendo-se sobre o código de trabalho do @Bragbog, tive que navegar por uma situação semelhante em que tive que transpor o sistema de coordenadas semelhante ao do OP ao sistema de coordenadas Java.
Isso é o que eu criei:
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);
}
}
Pode ser confuso, mas o sistema Java e o sistema com quem eu estava trabalhando, tinham 45 e 225 permanecerem os mesmos, para que a transposição seja que os sistemas sejam invertidos em sua inclinação (onde 45 e 225 têm o mesmo ângulo de qualquer um dos eixos)
O Absmodangle garante que meu ângulo resultante esteja dentro da minha faixa [0 - 360).
Criei uma imagem adicional, mas não tenho representante suficiente para adicioná -la. Essetencialmente
y = x - F(x), where F(x) is coordChangeOffset noted above ((x Mod 180) - 45) * 2