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

如何用Java图形绘制带边框的三角形,java,swing,graphics,jpanel,jcomponent,Java,Swing,Graphics,Jpanel,Jcomponent,我正在尝试使用Graphics.drawPolygon()方法绘制一个带边框的三角形 三角形画得很好,但如何计算边界的3个点 我已经画了一个圆,但我似乎找不到三角形的解 讲师的要求,因为它不能使用图形2d 我的代码: if (xPoints != null && yPoints != null) { int[] nXPoints = new int[] { xPoints[0] - borderThickness, xPoints[1] - borderThickness

我正在尝试使用
Graphics.drawPolygon()
方法绘制一个带边框的三角形

三角形画得很好,但如何计算边界的3个点

我已经画了一个圆,但我似乎找不到三角形的解

讲师的要求,因为它不能使用
图形2d

我的代码:

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);
}
编辑: 预期结果

使用这些方法渲染轮廓并填充其内部;两者都具有所需的签名,如图所示

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

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

图形中不支持自定义厚度。正如所建议的,由
paintComponent()
接收的实际图形上下文是
Graphics2D
的一个实例,它确实支持自定义笔划几何图形

事情是老师没有教我
图形2d
,所以我不应该使用它

然后简单地画一个大三角形,然后画一个小三角形。如果这不起作用,那么您在计算较大三角形时有一个错误,您应该编辑您的问题以包含一个

我正在寻找一种不用
Graphics2D
的方法……有人在这篇文章中正确地解释了这个问题

作为@Marco13,您需要一个比原始三角形大
边界厚度的三角形。您可以使用来进行缩放。虽然
图形
不能
填充()
任意图形,例如由
仿射变换创建的图形
,但它可以根据需要剪裁渲染。在下面的示例中,单位三角形被平移并缩放到nxn面板的中心;一份拷贝放大了
delta
。请注意,渲染是如何首先剪裁到较大的背景图,然后剪裁到较小的前景图的


我很困惑。如果没有这些点,你怎么可能画出三角形?
我怎么计算边界的3个点?
-。绘制/填充方法在同一组点上工作。@JoeC。。我知道没有分数是不可能画出来的。我正在寻找一种计算边界点的方法。@camickr不,他们没有,请再次检查代码。我对这个问题的解释是,你想计算某种“偏移”。从原始点开始,您需要计算3个新点,这些点描述了一个比原始点“大”的三角形(比
borderThickness
大),这样,当您在另一个点上绘制它们时,它看起来就像一个带边框的三角形。如果这是正确的:不要这样做。这将是一个微妙的权利,即使你得到它的工作,这是一个粗糙的黑客。Swing(尤其是
Graphics2D
)提供了许多很好且简单的方法来实现酷炫的效果。使用它们。谢谢你的帮助,但我可以使用相同的边界点,因为我需要它有一个自定义厚度这两个要求冲突;我已经在上面详细阐述了。谢谢你的帮助,但我正在寻找一种不用
图形2d
的方法。。。我知道
Graphics
不支持笔划,但应该有办法做到这一点。一个人在@JahirFiquitiva中正确地解释了这个问题:我在上面添加了一个例子。
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);
    }
}