2013-05-01 59 views
4

我試圖用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); 
    } 
} 
+0

也參見該相關[示例](http://stackoverflow.com/q/8614972/230513)。 – trashgod 2013-05-02 01:06:49

+0

或者[更一般的方法](http://java-sl.com/shapes.html)。 – trashgod 2013-05-02 01:26:54

回答

6

你可以嘗試使用多邊形和一些基本的數學:

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<nPoints; current++) 
    { 
     int i = (int) current; 
     double x = Math.cos(current*((2*Math.PI)/max))*radius[i % 4]; 
     double y = Math.sin(current*((2*Math.PI)/max))*radius[i % 4]; 

     X[i] = (int) x+midX; 
     Y[i] = (int) y+midY; 
    } 

    g.setColor(Color.WHITE); 
    g.fillPolygon(X, Y, nPoints); 
+0

'我'是什麼?目前是否非零?把所有'y'都歸零,不會有'Polygon'退化嗎? – trashgod 2013-05-02 01:24:13

+0

對不起,我改變了一些變量,忘記更新一切 – 2013-05-02 09:07:30

2

Polygon類可以被視爲一個傳統類,一直以來存在的Java 1.0,但應該很難在新的代碼中使用了。指定x的奇數方式/ y座標在單獨的陣列,而且,更重要的是,事實上,它僅支持int[]陣列限制了其應用領域。雖然它實現了接口,但是這個接口的更多現代實現可以用來表示多邊形。在大多數情況下,將多邊形描述爲Path2D更簡單且更靈活。可以創建一個Path2D p = new Path2D.Double();,然後執行一系列moveTolineTo調用來生成所需的形狀。

下面的程序示出了Path2D類可以如何被用來生成星形形狀。最重要的方法是createStar方法。這是非常通用的。它接收

  • 爲星形
  • 星形
  • 的內,外半徑的中心座標的光線的數量,恆星應具有
  • 的角度,其中所述第一射線應(即星號的旋轉角度)

如果需要,可以在這一個方法上包一個更簡單的方法 - 就像下面代碼中的createDefaultStar例子一樣。

該程序示出了不同分,畫成線和填充有不同的顏色和徑向漸變油漆,作爲例子:

Stars

完整的程序作爲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; 
    } 
} 
0

我有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; 
}