如何在 java 中绘制菱形?
How to draw a diamond shape in java?
所以我必须画一个菱形。不是静态钻石,而是我自己拖动和绘制的钻石。我已经使用 General Path 来完成它,但它绘制的菱形不直;菱形向左弯曲,没有被绘制到我鼠标指向的位置。
这是我创建菱形的代码。有人可以帮我解决这个问题吗?
private GeneralPath drawDiamond(int x1, int y1, int x2, int y2){
int x = Math.min(x1, x2);
int y = Math.min(y1, y2);
// Gets the difference between the coordinates and
int width = Math.abs(x1 - x2);
int height = Math.abs(y1 - y2);
Rectangle2D.Double diamond = new Rectangle2D.Double(x1,y1,width,height);
GeneralPath connectedDiamond = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
connectedDiamond.append(diamond, true);
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(20));
connectedDiamond.transform(at);
return connectedDiamond;
}
这是我的绘画方法:
public void paint(Graphics g) {
graphSettings = (Graphics2D) g;
graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
graphSettings.setStroke(new BasicStroke(4));
Iterator<Color> strokeCounter = shapeStroke.iterator();
for (NamedShape s : shapes) {
graphSettings.draw(s.getShape());
}
if (drawStart != null && drawEnd != null) {
graphSettings.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.40f));
graphSettings.setPaint(Color.LIGHT_GRAY);
Shape aShape = null;
if(currentAction == 7){
aShape = drawDiamond(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y);
}
graphSettings.draw(aShape);
}
}
有人可以帮我做这个吗?
如何不旋转矩形,而是在矩形内的 4 个点之间画线:
积分:
原谅我的mspaint技术不好
但我希望你明白我的意思。你取顶部中心、右中、底部中心和左中点并在它们之间画线(我认为使用 generalPath)
将菱形创建为带顶点的多边形会更简单
(x + Width/2, y)
(x + Width, y + Height/2)
(x + Width/2, y + Height)
(x, y + Height/2)
2D Shape API 其实很强大,我最喜欢的 类 之一是 Path2D
,它可以让你简单地 "draw" 一个虚拟的形状,因为例子
public class Diamond extends Path2D.Double {
public Diamond(double width, double height) {
moveTo(0, height / 2);
lineTo(width / 2, 0);
lineTo(width, height / 2);
lineTo(width / 2, height);
closePath();
}
}
现在,您需要使用 AffineTransformation
或翻译 Graphics
上下文来定位它,但这并不难
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class JavaApplication251 {
public static void main(String[] args) {
new JavaApplication251();
}
public JavaApplication251() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Diamond diamond;
public TestPane() {
diamond = new Diamond(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - diamond.getBounds().width) / 2;
int y = (getHeight()- diamond.getBounds().height) / 2;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
Shape shape = at.createTransformedShape(diamond);
g2d.setColor(Color.YELLOW);
g2d.fill(shape);
g2d.setColor(Color.RED);
g2d.draw(shape);
g2d.dispose();
}
}
public class Diamond extends Path2D.Double {
public Diamond(double width, double height) {
moveTo(0, height / 2);
lineTo(width / 2, 0);
lineTo(width, height / 2);
lineTo(width / 2, height);
closePath();
}
}
}
所以我必须画一个菱形。不是静态钻石,而是我自己拖动和绘制的钻石。我已经使用 General Path 来完成它,但它绘制的菱形不直;菱形向左弯曲,没有被绘制到我鼠标指向的位置。
这是我创建菱形的代码。有人可以帮我解决这个问题吗?
private GeneralPath drawDiamond(int x1, int y1, int x2, int y2){
int x = Math.min(x1, x2);
int y = Math.min(y1, y2);
// Gets the difference between the coordinates and
int width = Math.abs(x1 - x2);
int height = Math.abs(y1 - y2);
Rectangle2D.Double diamond = new Rectangle2D.Double(x1,y1,width,height);
GeneralPath connectedDiamond = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
connectedDiamond.append(diamond, true);
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(20));
connectedDiamond.transform(at);
return connectedDiamond;
}
这是我的绘画方法:
public void paint(Graphics g) {
graphSettings = (Graphics2D) g;
graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
graphSettings.setStroke(new BasicStroke(4));
Iterator<Color> strokeCounter = shapeStroke.iterator();
for (NamedShape s : shapes) {
graphSettings.draw(s.getShape());
}
if (drawStart != null && drawEnd != null) {
graphSettings.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.40f));
graphSettings.setPaint(Color.LIGHT_GRAY);
Shape aShape = null;
if(currentAction == 7){
aShape = drawDiamond(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y);
}
graphSettings.draw(aShape);
}
}
有人可以帮我做这个吗?
如何不旋转矩形,而是在矩形内的 4 个点之间画线:
积分:
原谅我的mspaint技术不好
但我希望你明白我的意思。你取顶部中心、右中、底部中心和左中点并在它们之间画线(我认为使用 generalPath)
将菱形创建为带顶点的多边形会更简单
(x + Width/2, y)
(x + Width, y + Height/2)
(x + Width/2, y + Height)
(x, y + Height/2)
2D Shape API 其实很强大,我最喜欢的 类 之一是 Path2D
,它可以让你简单地 "draw" 一个虚拟的形状,因为例子
public class Diamond extends Path2D.Double {
public Diamond(double width, double height) {
moveTo(0, height / 2);
lineTo(width / 2, 0);
lineTo(width, height / 2);
lineTo(width / 2, height);
closePath();
}
}
现在,您需要使用 AffineTransformation
或翻译 Graphics
上下文来定位它,但这并不难
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class JavaApplication251 {
public static void main(String[] args) {
new JavaApplication251();
}
public JavaApplication251() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Diamond diamond;
public TestPane() {
diamond = new Diamond(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - diamond.getBounds().width) / 2;
int y = (getHeight()- diamond.getBounds().height) / 2;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
Shape shape = at.createTransformedShape(diamond);
g2d.setColor(Color.YELLOW);
g2d.fill(shape);
g2d.setColor(Color.RED);
g2d.draw(shape);
g2d.dispose();
}
}
public class Diamond extends Path2D.Double {
public Diamond(double width, double height) {
moveTo(0, height / 2);
lineTo(width / 2, 0);
lineTo(width, height / 2);
lineTo(width / 2, height);
closePath();
}
}
}