gpt4 book ai didi

Java制作一条定向线并使其移动

转载 作者:行者123 更新时间:2023-11-29 07:59:06 25 4
gpt4 key购买 nike

我想制作一条直线并使其移动。我能够制作一条定向线并移动该线,但是当我移动该线时箭头会移位

这是我的绘画方法

 Line2D.Double line = new Line2D.Double(startX, startY, endX, endY);
g2d.draw(line);
tx.setToIdentity();
double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
tx.translate(line.x2, line.y2);
tx.rotate((angle - Math.PI / 2d));
Graphics2D gClone = (Graphics2D) g2d.create();
gClone.setTransform(tx);
Polygon arrowHead = new Polygon();
arrowHead.addPoint(0, 15);
arrowHead.addPoint(-15, -15);
arrowHead.addPoint(15, -15);
Area area = new Arear(arrowHead );
Area lineArea = new Area(line);
lineArea.subtract(area);
gClone.fill(area);
gClone.dispose();

并且我已经更改了 startx 的值并在按下鼠标时开始 y鼠标拖动时的 endx 和 enny

最佳答案

这是一个基本示例,演示了如何使用 Path2D 来定义自定义形状和使用 AffineTransformation 来转换形状。

这个例子会导致鼠标在面板上移动时箭头指向鼠标

enter image description here

import java.awt.BasicStroke;
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.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class RotateArrow {

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

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

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new RotatePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class RotatePane extends javax.swing.JPanel {

private Point mousePoint;
private PointyThing pointyThing;

public RotatePane() {

pointyThing = new PointyThing();

addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
mousePoint = e.getPoint();
repaint();
}
});

}

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

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

double rotation = 0f;

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

if (mousePoint != null) {
int x = width / 2;
int y = height / 2;

int deltaX = mousePoint.x - x;
int deltaY = mousePoint.y - y;

rotation = -Math.atan2(deltaX, deltaY);
rotation = Math.toDegrees(rotation) + 180;
}

Rectangle bounds = pointyThing.getBounds();

AffineTransform at = new AffineTransform();
at.translate((width - bounds.width) / 2, (height - bounds.height) / 2);
at.rotate(Math.toRadians(rotation), bounds.width / 2, bounds.height / 2);
Shape shape = new Path2D.Float(pointyThing, at);

g2d.setStroke(new BasicStroke(3));
g2d.setColor(Color.RED);

g2d.fill(shape);
g2d.draw(shape);
g2d.dispose();
}
}

public class PointyThing extends Path2D.Float {

public PointyThing() {
moveTo(15, 0);
lineTo(30, 15);
lineTo(0, 15);
lineTo(15, 0);
moveTo(15, 15);
lineTo(15, 60);
}

}
}

更新示例二

基本上,这仅使用 PointyThing 作为箭头,并单独绘制线条。

箭头的方向是指向下方(朝向鼠标)

import java.awt.BasicStroke;
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.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class RotateArrow {

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

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

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new RotatePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

});
}

public class RotatePane extends javax.swing.JPanel {

private PointyThing pointyThing;
private Point mouseStart;
private Point mouseEnd;

public RotatePane() {

pointyThing = new PointyThing();

MouseAdapter ma = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
mouseEnd = e.getPoint();
repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
mouseStart = e.getPoint();
repaint();
}
};

addMouseListener(ma);
addMouseMotionListener(ma);

}

@Override
public Dimension getPreferredSize() {

return new Dimension(200, 200);

}

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();
if (mouseStart != null && mouseEnd != null) {

double rotation = 0f;

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

if (mouseEnd != null) {

int x = mouseStart.x;
int y = mouseStart.y;

int deltaX = mouseEnd.x - x;
int deltaY = mouseEnd.y - y;

rotation = -Math.atan2(deltaX, deltaY);
rotation = Math.toDegrees(rotation) + 180;

}

Rectangle bounds = pointyThing.getBounds();

g2d.setStroke(new BasicStroke(3));
g2d.setColor(Color.RED);
g2d.draw(new Line2D.Float(mouseStart, mouseEnd));

AffineTransform at = new AffineTransform();

at.translate(mouseEnd.x - (bounds.width / 2), mouseEnd.y - (bounds.height / 2));
at.rotate(Math.toRadians(rotation), bounds.width / 2, bounds.height / 2);
Shape shape = new Path2D.Float(pointyThing, at);

g2d.fill(shape);
g2d.draw(shape);
}
g2d.dispose();

}

}

public class PointyThing extends Path2D.Float {

public PointyThing() {
moveTo(15, 0);
lineTo(30, 15);
lineTo(0, 15);
lineTo(15, 0);
}

}

}

关于Java制作一条定向线并使其移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15607427/

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