【问题标题】:How to draw a triangle with border with Java Graphics如何使用 Java Graphics 绘制带边框的三角形
【发布时间】:2016-10-01 21:27:41
【问题描述】:

我正在尝试使用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);
}

编辑: 预期结果

【问题讨论】:

  • 我很困惑。没有这些点,你怎么可能画出三角形呢?
  • how can I calculate the 3 points of the border? - 。绘制/填充方法适用于同一组点。
  • @JoeC .. 我知道没有这些点是不可能画出来的。我正在寻找一种计算边界点的方法。
  • @camickr 不,他们没有,再次检查代码。
  • 我对这个问题的解释是你想计算某种“偏移量”。从原始点中,您想要计算 3 个新点来描述一个比原始点“更大”的三角形(大于 borderThickness),这样当您将它们一个接一个地绘制时,它 看起来像 一个带边框的三角形。 如果这是对的:不要这样做。把它做好会很麻烦,即使你让它工作,它也是一个粗略的黑客攻击。 Swing(尤其是Graphics2D)提供了so许多不错且简单的方法来实现酷炫的效果。使用它们。

标签: java swing graphics jpanel jcomponent


【解决方案1】:

使用Graphics方法drawPolygon()渲染轮廓,使用fillPolygon()填充其内部;两者都有所需的签名,如图here

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

我需要它具有自定义厚度……我也不想使用Graphics2D

Graphics API不支持自定义厚度。正如here 所建议的那样,paintComponent() 收到的实际图形上下文是Graphics2D 的一个实例,它确实支持自定义笔触几何形状。

事情是老师没有教我Graphics2D,所以我不应该使用它。

然后简单地绘制较大的三角形,然后绘制较小的三角形。如果这不起作用,那么您在计算较大的三角形时出错,您应该编辑您的问题以包含complete example

我正在寻找一种不使用Graphics2D 的方法……有人在comment 中正确解释了这个问题。

作为@Marco13 observes,您需要一个比原始三角形大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);
    }
}

【讨论】:

  • 感谢您的帮助,但我可以使用相同的点作为边框,因为我需要它具有自定义厚度
  • 这两个要求冲突;我上面已经详细说明了。
  • 感谢您的帮助,但我正在寻找一种没有Graphics2D 的方法...我知道Graphics 不支持中风,但应该有一种方法可以做到它。一个人在this comment 中正确解释了这个问题
  • @JahirFiquitiva:我在上面添加了一个示例。
猜你喜欢
  • 2012-08-13
  • 2017-09-22
  • 2021-11-07
  • 2014-11-18
  • 2016-03-25
  • 2013-04-08
  • 2017-08-05
  • 2015-03-06
  • 1970-01-01
相关资源
最近更新 更多