发布于2023-03-16 05:36 阅读(1097) 评论(0) 点赞(30) 收藏(1)
Graphics.drawPolygon()
我正在尝试使用该方法绘制带边框的三角形
三角形绘制正确,但如何计算边界的 3 个点?
我已经用圆圈做了,但我似乎找不到三角形的解决方案。
指导员的要求,因为它不能使用Graphics2D
。
我的代码:
if (xPoints != null && yPoints != null) {
int[] nXPoints = new int[] { xPoints[0] - borderThickness, xPoints[1] - borderThickness,
xPoints[2] - borderThickness };
int[] nYPoints = new int[] { yPoints[0] - borderThickness, yPoints[1] - borderThickness,
yPoints[2] - borderThickness };
g.setColor(borderColor);
g.fillPolygon(nXPoints, nYPoints, 3);
g.setColor(fillColor);
g.fillPolygon(xPoints, yPoints, 3);
}
编辑: 预期结果
使用Graphics
方法drawPolygon()
渲染轮廓并fillPolygon()
填充其内部;两者都有所需的签名,如此处所示。
因为“绘制图形轮廓的操作是通过使用像素大小的笔在像素之间遍历无限细的路径来进行的”,所以将图形上下文转换为以便您可以Graphics2D
在draw()
相应fill()
的Shape
. 这将允许您使用此处setStroke()
所示的指定大纲。
我需要它具有自定义厚度……我也不想使用
Graphics2D
.
API不支持自定义厚度Graphics
。正如此处所建议的,接收到的实际图形上下文paintComponent()
是 的一个实例Graphics2D
,它支持自定义笔画几何图形。
这些东西是老师没教过我的
Graphics2D
,所以我不应该使用它。
然后简单地绘制较大的三角形,然后绘制较小的三角形。如果这不起作用,那么你在计算较大的三角形时有错误,你应该编辑你的问题以包括一个完整的例子。
我正在寻找一种方法来做到这一点,而不是
Graphics2D
……有人在这条评论中正确地解释了这个问题。
正如 @Marco13所观察到的,您需要一个比原始三角形大borderThickness
. 您可以使用AffineTransform
它来进行缩放。虽然Graphics
不能是fill()
任意的Shape
,例如由创建的AffineTransform
,但它可以根据需要裁剪渲染。在下面的示例中,单位三角形被平移并缩放到 N x N 面板的中心;复印件放大delta
. 请注意如何先将渲染裁剪到较大的背景图形,然后再裁剪到较小的前景图形。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @see https://stackoverflow.com/a/39812618/230513
*/
public class GraphicsBorder {
private static class GraphicsPanel extends JPanel {
private static final int N = 256;
private static final Color FILL = new Color(0x990099);
private static final Color BORDER = new Color(0x66FFB2);
private final Shape fore;
private final Shape back;
public GraphicsPanel(Polygon polygon, int delta) {
AffineTransform a1 = new AffineTransform();
a1.translate(N / 2, N / 2);
a1.scale(N / 3, N / 3);
fore = a1.createTransformedShape(polygon);
AffineTransform a2 = new AffineTransform();
a2.translate(N / 2, N / 2 - delta / 3);
a2.scale(N / 3 + delta, N / 3 + delta);
back = a2.createTransformedShape(polygon);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(BORDER);
g.setClip(back);
g.fillRect(0, 0, N, N);
g.setColor(FILL);
g.setClip(fore);
g.fillRect(0, 0, N, N);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(N, N);
}
}
private void display() {
JFrame f = new JFrame("GraphicsBorder");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Polygon p = new Polygon();
p.addPoint(0, -1);
p.addPoint(1, 1);
p.addPoint(-1, 1);
f.add(new GraphicsPanel(p, 16));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new GraphicsBorder()::display);
}
}
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/655951/565ceeb76744185dd3ec/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!