如何在Java中制作星形?

我正在尝试用Java制作一些形状。 我创建了两个有两种不同颜色的矩形,但我想创建一个星形,我找不到有用的来源来帮助我这样做。

这是我的代码:

import java.awt.*; import javax.swing.*; public class shapes extends JPanel{ @Override public void paintComponent(Graphics GPHCS){ super.paintComponent(GPHCS); GPHCS.setColor(Color.BLUE); GPHCS.fillRect(25,25,100,30); GPHCS.setColor(Color.GRAY); GPHCS.fillRect(25,65,100,30); GPHCS.setColor(new Color(190,81,215)); GPHCS.drawString("This is my text", 25, 120); } } 

您可以尝试使用多边形和一些基本数学:

  int midX = 500; int midY = 340; int radius[] = {118,40,90,40}; int nPoints = 16; int[] X = new int[nPoints]; int[] Y = new int[nPoints]; for (double current=0.0; current 

您还可以使用现有的类,例如http://java-sl.com/shapes.html,用于常规多边形和星形。

Polygon类可以被视为自Java 1.0以来一直存在的遗留类,但在新代码中几乎不应该再使用它。 在单独的数组中指定x / y坐标的奇怪方法,更重要的是,它只支持int[]数组这一事实限制了它的应用领域。 虽然它实现了Shape接口,但是此接口有更多现代实现可用于表示多边形。 在大多数情况下,将多边形描述为Path2D更容易,更灵活。 可以创建Path2D p = new Path2D.Double(); 然后执行一系列moveTolineTo调用以生成所需的形状。

以下程序显示了Path2D类如何用于生成星形。 最重要的方法是createStar方法。 它非常通用。 它接收

  • 恒星的中心坐标
  • 恒星的内半径和外半径
  • 恒星应该拥有的光线数量
  • 第一条光线所应的角度(即恒星的旋转角度)

如果需要,可以使用更简单的方法 – 就像下面代码中的createDefaultStar示例一样。

该程序显示不同的星星,绘制为线条,并填充不同的颜色和径向渐变颜料,例如:

明星

作为MCVE的完整程序:

 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RadialGradientPaint; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.Path2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class DrawStarShape { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new DrawStarShapePanel()); f.setSize(600, 600); f.setLocationRelativeTo(null); f.setVisible(true); } } class DrawStarShapePanel extends JPanel { @Override protected void paintComponent(Graphics gr) { super.paintComponent(gr); Graphics2D g = (Graphics2D) gr; g.setColor(Color.WHITE); g.fillRect(0, 0, getWidth(), getHeight()); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(Color.BLACK); g.draw(createDefaultStar(50, 200, 200)); g.setPaint(Color.RED); g.fill(createStar(400, 400, 40, 60, 10, 0)); g.setPaint(new RadialGradientPaint( new Point(400, 200), 60, new float[] { 0, 1 }, new Color[] { Color.RED, Color.YELLOW })); g.fill(createStar(400, 200, 20, 60, 8, 0)); g.setPaint(new RadialGradientPaint( new Point(200, 400), 50, new float[] { 0, 0.3f, 1 }, new Color[] { Color.RED, Color.YELLOW, Color.ORANGE })); g.fill(createStar(200, 400, 40, 50, 20, 0)); } private static Shape createDefaultStar(double radius, double centerX, double centerY) { return createStar(centerX, centerY, radius, radius * 2.63, 5, Math.toRadians(-18)); } private static Shape createStar(double centerX, double centerY, double innerRadius, double outerRadius, int numRays, double startAngleRad) { Path2D path = new Path2D.Double(); double deltaAngleRad = Math.PI / numRays; for (int i = 0; i < numRays * 2; i++) { double angleRad = startAngleRad + i * deltaAngleRad; double ca = Math.cos(angleRad); double sa = Math.sin(angleRad); double relX = ca; double relY = sa; if ((i & 1) == 0) { relX *= outerRadius; relY *= outerRadius; } else { relX *= innerRadius; relY *= innerRadius; } if (i == 0) { path.moveTo(centerX + relX, centerY + relY); } else { path.lineTo(centerX + relX, centerY + relY); } } path.closePath(); return path; } } 

我有2种方法。

1)

 public static Bitmap drawStar(int W, int H, int color, boolean andRing) { Path path = new Path(); Bitmap output = Bitmap.createBitmap(W, H, Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(color); float midW ,min ,fat ,half ,radius; if(andRing) { midW = W / 2; min = Math.min(W, H); half = min / 2; midW = midW - half; fat = min / 17; radius = half - fat; paint.setStrokeWidth(fat); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(midW + half, half, radius, paint); path.reset(); paint.setStyle(Paint.Style.FILL); path.moveTo( half * 0.5f, half * 0.84f); path.lineTo( half * 1.5f, half * 0.84f); path.lineTo( half * 0.68f, half * 1.45f); path.lineTo( half * 1.0f, half * 0.5f); path.lineTo( half * 1.32f, half * 1.45f); path.lineTo( half * 0.5f, half * 0.84f); } else { min = Math.min(W, H); half = min/2; path.reset(); paint.setStyle(Paint.Style.FILL); path.moveTo( half * 0.1f , half * 0.65f); path.lineTo( half * 1.9f , half * 0.65f); path.lineTo( half * 0.40f , half * 1.65f); path.lineTo( half , 0 ); path.lineTo( half * 1.60f, half * 1.65f); path.lineTo( half * 0.1f, half * 0.65f); } canvas.drawPath(path, paint); return output; } 

2)

  public static Bitmap drawStar(int W,int H,int spikes,int innerRadius,int outerRadius, int backColor,boolean border, int borderColor) { if(W < 10) W = 10; if(H < 10) H = 10; if(spikes < 5) spikes = 5; int smallL = W; if(H < W) smallL = H; if(outerRadius > smallL/2) outerRadius = smallL/2; if(innerRadius < 5) innerRadius = 5; if(border) { outerRadius -=2; innerRadius -=2; } Path path = new Path(); Bitmap output = Bitmap.createBitmap(W, H, Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(backColor); int cx = W/2; int cy = H/2; double rot = Math.PI / 2 * 3; float x,y; double step = Math.PI / spikes; path.moveTo(cx, cy - outerRadius); for (int i = 0; i < spikes; i++) { x = (float) (cx + Math.cos(rot) * outerRadius); y = (float) (cy + Math.sin(rot) * outerRadius); path.lineTo(x, y); rot += step; x = (float) (cx + Math.cos(rot) * innerRadius); y = (float) (cy + Math.sin(rot) * innerRadius); path.lineTo(x, y); rot += step; } path.lineTo(cx, cy - outerRadius); path.close(); canvas.drawPath(path, paint); if(border) { paint.setStyle(Style.STROKE); paint.setStrokeWidth(2); paint.setColor(borderColor); canvas.drawPath(path, paint); } return output; }