Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java图形绘制带线的圆_Java_Geometry_Awt_Java 2d - Fatal编程技术网

使用Java图形绘制带线的圆

使用Java图形绘制带线的圆,java,geometry,awt,java-2d,Java,Geometry,Awt,Java 2d,我有一个有趣的问题。使用Java graphics,我想画一个圆圈,圆圈中有平行线,这些线之间有一些预定义的间隙常数。该圆具有已知的x和y位置以及半径。直线应从圆的中心开始,并向外移动。比如说, 我认为最简单的方法是先画线,填充整个正方形,如下所示: 然后画4个多边形,用白色填充。4个多边形的标签如下所示: 如您所见,在这种情况下,多边形是由左顶点(x,y)、由圆半径定义的宽度和高度的边以及从(x+半径,y+半径)开始的圆弧定义的 需要反馈: 甚至可以在Java中绘制这样的多边形吗 这个逻

我有一个有趣的问题。使用Java graphics,我想画一个圆圈,圆圈中有平行线,这些线之间有一些预定义的间隙常数。该圆具有已知的x和y位置以及半径。直线应从圆的中心开始,并向外移动。比如说,

我认为最简单的方法是先画线,填充整个正方形,如下所示:

然后画4个多边形,用白色填充。4个多边形的标签如下所示:

如您所见,在这种情况下,多边形是由左顶点(x,y)、由圆半径定义的宽度和高度的边以及从(x+半径,y+半径)开始的圆弧定义的

需要反馈:

  • 甚至可以在Java中绘制这样的多边形吗
  • 这个逻辑有意义吗?这对你来说容易吗
  • 另一种方法是以某种方式确定构成圆的像素,并使用这些像素绘制线。但这对我来说似乎很混乱。你同意吗
  • 你能想出另一种方法吗
  • 重要提示:请注意,虽然此解决方案具有垂直线,但这些线应根据某个角度θ来定义。也就是说,它们可以成角度(但彼此平行)

    如果有人能提供真正绘制这幅图的代码,我将永远感激!!:)


    我会用三角法

    直线的
    x
    由原点(圆心)角度的余弦给出。所以,
    arccos(x)
    会给出角度

    获得角度后,可以使用sinus
    sin
    功能获得其最大高度


    当然,所有java trig函数都使用弧度(360度=2*PI弧度)。

    我会使用三角函数

    直线的
    x
    由原点(圆心)角度的余弦给出。所以,
    arccos(x)
    会给出角度

    获得角度后,可以使用sinus
    sin
    功能获得其最大高度

    当然,所有java trig函数都使用弧度(360度=2*PI弧度)。

    使用ol',下面是一段简单的代数。。。

    r是圆的半径。
    x是一个变量,你可以通过知道半径和间距,以增量迭代圆

    知道每条直线的高度(及其x位置),将垂直直线与圆环中心平行居中不会是一个挑战(如果您的放置坐标像通常那样指定左上角,您将希望将其放置在
    y=circle\u center-(line\u length/2)

    也请注意,如果你通过左上角指定垂直线的坐标,你需要考虑X坐标在计算X坐标时有多厚。 这非常简单,使用圆圈建议的x值。
    true\u x=建议的\u x-(线宽/2)

    关于处理斜线,请参考其他更明智的答案

    这个过程仍然是对使用剪辑寻找每条线的确切域/范围的敏感性的证明(因为我在上面浪费了太多的生命)

    这就是我的乐趣结束的地方。

    噢!用“tan(theta)”替换最后一个m,使用ol,下面这个简单的代数。。。

    r是圆的半径。
    x是一个变量,你可以通过知道半径和间距,以增量迭代圆

    知道每条直线的高度(及其x位置),将垂直直线与圆环中心平行居中不会是一个挑战(如果您的放置坐标像通常那样指定左上角,您将希望将其放置在
    y=circle\u center-(line\u length/2)

    也请注意,如果你通过左上角指定垂直线的坐标,你需要考虑X坐标在计算X坐标时有多厚。 这非常简单,使用圆圈建议的x值。
    true\u x=建议的\u x-(线宽/2)

    关于处理斜线,请参考其他更明智的答案

    这个过程仍然是对使用剪辑寻找每条线的确切域/范围的敏感性的证明(因为我在上面浪费了太多的生命)

    这就是我的乐趣结束的地方。


    哦!用“褐色(θ)”替换最后一个m

    只需更改图形剪辑

    public class SimplePaint02 {
    
        public static void main(String[] args) {
            new SimplePaint02();
        }
    
        public SimplePaint02() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                int radius = Math.min(getWidth(), getHeight());
                int x = (getWidth() - radius) / 2;
                int y = (getHeight()- radius) / 2;
    
                BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = buffer.createGraphics();
    
                Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
                Shape clip = g2d.getClip();
                g2d.setClip(circle);
                int gap = getWidth() / 10;
                g2d.setColor(Color.RED);
                for (int index = 0; index < 10; index++) {
    
                    g2d.drawLine(index * gap, 0, index * gap, radius);
    
                }
                g2d.setClip(clip);
                g2d.setColor(Color.BLUE);
                g2d.draw(circle);
                g2d.dispose();
                g.drawImage(buffer, x, y, this);
            }
    
        }
    
    }
    


    简单更改图形剪辑

    public class SimplePaint02 {
    
        public static void main(String[] args) {
            new SimplePaint02();
        }
    
        public SimplePaint02() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                int radius = Math.min(getWidth(), getHeight());
                int x = (getWidth() - radius) / 2;
                int y = (getHeight()- radius) / 2;
    
                BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = buffer.createGraphics();
    
                Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
                Shape clip = g2d.getClip();
                g2d.setClip(circle);
                int gap = getWidth() / 10;
                g2d.setColor(Color.RED);
                for (int index = 0; index < 10; index++) {
    
                    g2d.drawLine(index * gap, 0, index * gap, radius);
    
                }
                g2d.setClip(clip);
                g2d.setColor(Color.BLUE);
                g2d.draw(circle);
                g2d.dispose();
                g.drawImage(buffer, x, y, this);
            }
    
        }
    
    }
    


    我不认为多边形是可行的。相反,使用一点数学(三角学)要根据每条线距中心的半径确定每条线所需的高度,那么你的意思是,对于我知道的所有x点,使用圆的方程确定y位置?在绘制线时设置一个圆形剪辑。这将是另一个合理的解决方案。我不认为多边形是可行的方法。相反,使用一点数学(三角学)要根据每条线距中心的半径确定每条线所需的高度,那么你的意思是,对于我知道我的线落在的所有x点,使用圆的方程确定y位置?在绘制线时设置一个圆夹。这将是另一个合理的解决方案。抱歉,我没有遵循。你能澄清一下并写多一点吗细节。1)你说“你的线的x”…什么“线”?2)你说arccos(x)会给你。给我什么?什么角度?每条垂直线的所有点都具有相同的
    x
    (否则它们不会垂直)。与r的角度
    public class CirlceDraw {
    
        public static void main(String[] args) {
            new CirlceDraw();
        }
    
        public CirlceDraw() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public class TestPane extends JPanel {
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                int radius = Math.min(getWidth(), getHeight());
                int x = (getWidth() - radius) / 2;
                int y = (getHeight() - radius) / 2;
    
                BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = buffer.createGraphics();
    
                Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
                Shape clip = g2d.getClip();
                g2d.setClip(circle);
                AffineTransform at = g2d.getTransform();
                g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(33), radius / 2, radius / 2));
                int gap = getWidth() / 10;
                g2d.setColor(Color.RED);
                for (int index = 0; index < 10; index++) {
    
                    g2d.drawLine(index * gap, 0, index * gap, radius);
    
                }
                g2d.setTransform(at);
                g2d.setClip(clip);
                g2d.setColor(Color.BLUE);
                g2d.draw(circle);
                g2d.dispose();
                g.drawImage(buffer, x, y, this);
            }
    
        }
    
    }