【问题标题】:Inclined plane Java (Triangle with angle)斜面Java(带角度的三角形)
【发布时间】:2014-12-10 05:25:13
【问题描述】:

我需要根据一定的角度创建一个斜面,上面有一个块,然后使用物理定律来查看块是否滑动。现在,我用 Path2D.Double 创建了我的 bloc,但我找不到改变 bloc 角度的方法。角度是从应用程序框架中的微调器中选择的。我创建了 2 个类,一个是框架,另一个是面板,我在其中绘制我的块。这是我的路径代码:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.blue);


    Path2D.Double bloc = new Path2D.Double();

    bloc.moveTo(10,0);

    bloc.lineTo(getWidth(), getHeight());
    bloc.lineTo(10, getHeight());
    bloc.closePath();


    g2d.setColor(Color.black);
    g2d.fill(bloc);

}

我知道对于一条线,我只需要这样做

 g2d.rotate(Math.toRadians(theSpinner Value));

但是对于 Path2D,我不知道该怎么做。 有什么建议吗?谢谢!

【问题讨论】:

标签: java jframe jpanel paintcomponent graphics2d


【解决方案1】:

警告的话,我的三角是没有希望的,但我相信这(某些东西)与您正在寻找的东西相符......

基本上,这假设我们知道高度和角度,然后使用 tan(angle) = opposite leg/adjacent leg 计算长度(相邻腿),简单地说 width = height * tan(angle)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                final TestPane tp = new TestPane();
                final JSlider slider = new JSlider(0, 90, 0);
                slider.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        tp.setAngle(slider.getValue());
                    }
                });
                slider.setValue(45);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(tp);
                frame.add(slider, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private int angle;

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            int width = getWidth();
            int height = getHeight();

            Path2D triangle = new Path2D.Double();
            triangle.moveTo(10, 10);
            triangle.lineTo(10, height - 20);

            double b = angle * Math.tan(Math.toRadians(angle));
            triangle.lineTo(10 + b, height - 20);
            triangle.closePath();

            System.out.println("....");
            System.out.println(angle);
            System.out.println(b);

            g2d.setColor(Color.BLACK);
            g2d.draw(triangle);

            g2d.dispose();
        }

        protected void setAngle(int value) {
            angle = value;
            repaint();
        }

    }

}

现在,如果你想计算高度(相反),你需要改用height = width / tan(angle)...但是你必须修改绘图代码;)

改变高度而不是宽度

        double b = width / Math.tan(Math.toRadians(angle));

        Path2D triangle = new Path2D.Double();
        triangle.moveTo(10, height - 20);
        triangle.lineTo(10, height - 20 - b);

        triangle.lineTo(width - 20, height - 20);
        triangle.closePath();

【讨论】:

  • 好的,我明白了,但我需要基础保持不变。只有变体和变体?我还会使用 Math.tan 吗?
  • 假设您想保持宽度,那么您将使用最后一段中的示例,但您需要相应地更改绘图代码
  • 我尝试过这样的事情:Height = getWidth()* Math.tan(Math.toRadians(angle)); Path2D 三角形 = new Path2D.Double(); triangle.moveTo(0, 高度); triangle.lineTo(0,getHeight()); triangle.lineTo(getWidth() , getHeight());三角形.closePath();但是效果不好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2022-01-10
  • 2011-01-09
相关资源
最近更新 更多