【问题标题】:Drawing Arc in Java在 Java 中绘制圆弧
【发布时间】:2010-10-29 12:56:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: java graphics coordinate-systems


    【解决方案1】:

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

    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
    

    【讨论】:

    • 其实这是一个自定义的swing组件。我正在制作一个双拇指圆形滑块。需要一个具有透明度的圆弧来指示所选区域。开始时我遇到了问题角度大于结束角度。
    • @Emil:你应该忘记这里的结束角度。弧总是有一个起始角度和一个范围。即使你有一个结束角度,你也应该明确地将它转换为 Java 的弧。
    • @Bragboy:我明天会发布代码。它在我的办公系统中。
    • @BragBoy:我已经发布了code。对不起,代码有点脏。我需要帮助的药水是填充弧。我的意思是我使用的逻辑是从我的坐标转换为弧坐标系是错误的。
    • @BragBoy:感谢您的帮助我解决了它。您无需查看代码。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      扩展 @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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多