gpt4 book ai didi

java - 翻转形状(非图像)

转载 作者:行者123 更新时间:2023-12-04 05:21:10 25 4
gpt4 key购买 nike

已解决:
谢谢@MadProgrammer

我换了 g2.rotate(Math.toRadians(180.0));来自 g2.scale(1, -1);谢谢^^

我写了一个程序来显示带镜子的数字时钟(垂直翻转)

这是我的代码

    import java.awt.*;
import java.awt.font.GlyphVector;
import javax.swing.*;
import java.util.*;

public class DigitalClock extends JFrame implements Runnable {
/**
* @author HASSAN
*/
Thread runner; // declare global objects
Font clockFont;
Shape mirror;

public DigitalClock() {
super("Digital Clock - Hassan Sharaf 12MCMB33");
setSize(600, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false); // create window
setLocationRelativeTo(null);
clockFont = new Font("digifacewide", Font.BOLD, 100); // create font

Container contentArea = getContentPane();
ClockPanel timeDisplay = new ClockPanel();
contentArea.add(timeDisplay); // add components
setContentPane(contentArea);
start(); // start thread running
}

public class ClockPanel extends JPanel {

public void paintComponent(Graphics painter) {
// super.paintComponent(painter);
Graphics2D g2 = (Graphics2D) painter;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(clockFont); // create clock components
g2.setColor(Color.black);
g2.drawString(timeNow(), 20, 140);
GlyphVector v = clockFont.createGlyphVector(getFontMetrics(clockFont).getFontRenderContext(), timeNow());
mirror = v.getOutline();
g2.translate(553, 160);
g2.rotate(Math.toRadians(180.0));
g2.fill(mirror);
g2.draw(mirror);

}
}

// get current time
public String timeNow() {
Calendar now = Calendar.getInstance();
int hrs = now.get(Calendar.HOUR_OF_DAY);
int min = now.get(Calendar.MINUTE);
int sec = now.get(Calendar.SECOND);
String time = zero(hrs) + ":" + zero(min) + ":" + zero(sec);
return time;
}

public String zero(int num) {
String number = (num < 10) ? ("0" + num) : ("" + num);
return number; // Add leading zero if needed
}

public void start() {
if (runner == null) {
runner = new Thread(this);
}
runner.start();
// method to start thread
}

public void run() {
while (runner == Thread.currentThread()) {
repaint();
// define thread task
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread failed");
}
}
}

// create main method
public static void main(String[] args) {
DigitalClock clock = new DigitalClock();
}
}

问题:我使用了 rotate() 方法,但实际上我不想旋转时钟我想垂直翻转它
问题:如何翻转形状 (非图像) ?

最佳答案

根据您想要实现的目标,您有很多选择...

你可以...

  • 创建一个 PathIterator从形状对象,使用 AffineTransform符合您的轮换要求。这将需要您创建一个新路径,并附加 PathIterator到它,所以你可以画它......或
  • 新建 Path2D使用要旋转的形状作为新路径的基础并传递 AffineTransform到它。这与第一个选项几乎相同,但需要更少的代码...

  • 这是一个例子......
    public class SpinningTriangle {

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

    public SpinningTriangle() {
    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 SpinPane());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    });
    }

    public class SpinPane extends JPanel {

    private Triangle triangle;
    private float angle = 0;

    public SpinPane() {
    triangle = new Triangle(50, 100);
    Timer timer = new Timer(40, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    angle += 2;
    repaint();
    }
    });
    timer.setRepeats(true);
    timer.setCoalesce(true);
    timer.start();
    }

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

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    Rectangle bounds = triangle.getBounds();
    // PathIterator pi = triangle.getPathIterator(AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width / 2, bounds.height / 2));
    // Path2D path = new Path2D.Float();
    // path.append(pi, true);
    Path2D path = new Path2D.Float(triangle, AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width / 2, bounds.height / 2));
    int x = (getWidth() - bounds.width) / 2;
    int y = (getHeight() - bounds.height) / 2;
    g2d.translate(x, y);
    g2d.setColor(Color.RED);
    g2d.fill(path);
    g2d.setColor(Color.YELLOW);
    g2d.draw(path);
    g2d.dispose();
    }

    }

    public class Triangle extends Path2D.Float {

    public Triangle(int width, int height) {

    moveTo(width / 2f, 0);
    lineTo(width, height);
    lineTo(0, height);
    closePath();

    }

    }

    }

    更新

    如果您只想“镜像”形状,您可以通过 -1 缩放轴...
    public class SpinningTriangle {

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

    public SpinningTriangle() {
    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 FlipPane());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    });
    }

    public class FlipPane extends JPanel {

    private Triangle triangle;
    private boolean flip;

    public FlipPane() {
    triangle = new Triangle(50, 100);
    Timer timer = new Timer(500, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    flip = !flip;
    repaint();
    }
    });
    timer.setRepeats(true);
    timer.setCoalesce(true);
    timer.start();
    }

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

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

    double scale = flip ? -1 : 1;

    Path2D path = new Path2D.Float(triangle, AffineTransform.getScaleInstance(scale, scale));
    int x = (getWidth() - bounds.width) / 2;
    int y = (getHeight() - bounds.height) / 2;
    if (flip) {

    y += bounds.height;
    x += bounds.width;

    }
    g2d.translate(x, y);
    g2d.setColor(Color.RED);
    g2d.fill(path);
    g2d.setColor(Color.YELLOW);
    g2d.draw(path);
    g2d.dispose();
    }

    }

    public class Triangle extends Path2D.Float {

    public Triangle(int width, int height) {

    moveTo(width / 2f, 0);
    lineTo(width, height);
    lineTo(0, height);
    closePath();

    }

    }

    }

    关于java - 翻转形状(非图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13676364/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com