本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何使用 Java Graphics 绘制带边框的三角形

发布于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()填充其内部;两者都有所需的签名,如此处所示

图片1

因为“绘制图形轮廓的操作是通过使用像素大小的笔在像素之间遍历无限细的路径来进行的”,所以将图形上下文转换为以便您可以Graphics2Ddraw()相应fill()Shape. 这将允许您使用此处setStroke()所示的指定大纲

图片2

我需要它具有自定义厚度……我也不想使用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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)