使用for循环制作多个drawLine形状

时间:2019-02-09 01:21:34

标签: java graphics

我正在使用绘制线制作星星。我想运行一个for循环,以星形形式将星星扩展为多个星星。我对Java相当陌生,可以在我的代码中使用一些帮助。就列x行而言,我也希望星星也可以打开的网格图案不太具体。只要以网格状排列,甚至制作6星或9星也可以。

到目前为止,我已经用drawLine绘制了星星。有一次我得到了两颗星,但是它们彼此靠近。当我运行代码时,看起来好像有一大堆星星彼此交错排列,并且能够在“星场”上获得两颗星星,我希望以这种5x6模式或接近的形状获得更多。我相信我可能很难在for循环中计算数学以使这种情况发生。

我应该运行多个嵌套的for循环,还是有一种使用最少数量的for循环来做到这一点的方法?

public static void drawFlag(int stars, int stripes, java.awt.Graphics 
g, int x, int y, int width, int height) {
// Sets backround rectangle color to white
g.setColor(Color.WHITE);
g.fillRect(x, y, width, height);

// Draw filled red rectangles *stripes*
int stripeHeight = height/stripes;
g.setColor(Color.RED);
int lastStripeDrawnY = 0;
// For loop runs red stripes
for (int i = y; i < y + height - 2*stripeHeight; i = i + 2*stripeHeight) 
{ 
g.fillRect(x, i, width, stripeHeight);
lastStripeDrawnY = i;
}
    // expands strips across the rectangle
    int lastStripeY = lastStripeDrawnY+2*stripeHeight;
    int lastStripeHeight = y + height - lastStripeY;
    if (stripes%2 != 0) {
    g.fillRect(x, lastStripeY, width, lastStripeHeight);
            }   

    int stars1 = 15; 
    for (int cols = 1; cols  <= stars1; cols++) {
    int rows = stars1/cols;
    if (cols > rows && cols <2*rows && cols*rows == stars1) {

}
}
            // Draws the starField
    int numberOfRedStripes = (int)Math.ceil(stripes/2.0);
    int starFieldHeight = numberOfRedStripes*stripeHeight;
    int starFieldWidth = starFieldHeight*width/height;
    g.setColor(Color.BLUE);
    g.fillRect(x, y, starFieldWidth, starFieldHeight);


for (int x1 = 0; x1+100 <+ starFieldWidth-5; x1++) {
    if(x1/5*4 == stars) {
        drawStar(g,x1,y,50);
    for(int y1 = 0; y1 <=starFieldHeight-5;y1++) {
                if(y1/4*2 == stars) {
        drawStar(g,x,y1,50);
            }
        }
    }
}
}
        // drawLine the star
public static void drawStar(java.awt.Graphics g, int x, int y, int size) 
{
g.setColor(Color.WHITE);
g.drawLine(x+size/2, y+size/6, x+4*size/5, y+5*size/6);
g.drawLine(x+4*size/5,y+5*size/6, x+size/6, y+2*size/5);
g.drawLine(x+size/6, y+2*size/5, x+5*size/6, y+2*size/5);
g.drawLine(x+5*size/6, y+2*size/5, x+size/5, y+5*size/6);
g.drawLine(x+size/5, y+5*size/6, x+size/2, y+size/6); 
}
} 

将一颗星星扩展为方格状的格子图案。

2 个答案:

答案 0 :(得分:0)

有多种方法可以解决此问题,从开始就可以简单地尝试根据所需的x / y位置分别构建每颗恒星。

您可以使一颗恒星始终位于0x0位置translateGraphics的{​​{1}}位置

或者,您可以利用x/y API。

这使您可以定义一个自包含的对象,该对象描述您要创建的形状。

Shape

这样做有很多附带好处,但是直接好处是它是“可绘制的”。您可以将其实例直接传递到public class StarShape extends Path2D.Double { public StarShape(double size) { double mid = size / 2d; moveTo(mid, 0); lineTo((size * 0.6d), (size * 0.4d)); lineTo(size, (size * 0.4d)); lineTo((size * 0.72d), (size * 0.58d)); lineTo((size * 0.85d), size); lineTo((size * 0.5d), (size * 0.72d)); lineTo((size * 0.2), size); lineTo((size * 0.325d), (size * 0.58d)); lineTo(0, (size * 0.4d)); lineTo((size * 0.4d), (size * 0.4d)); closePath(); } } ,并根据需要对其进行绘画和/或填充。

现在,有了这些,您可以做类似...

Stars

Graphics2D

我之所以喜欢这种方法,是因为它不会影响原始public class TestPane extends JPanel { private StarShape star; private double starSize = 10;; public TestPane() { star = new StarShape(starSize); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); double y = 0; for (int yIndex = 0; yIndex < getHeight() / starSize; yIndex++) { double x = 0; for (int xIndex = 0; xIndex < getWidth() / starSize; xIndex++) { AffineTransform at = AffineTransform.getTranslateInstance(x, y); PathIterator path = star.getPathIterator(at); GeneralPath p = new GeneralPath(); p.append(path, true); g2d.fill(p); x += starSize; } y += starSize; } g2d.dispose(); } } 的来源。您还可以使用该技术来缓存结果,因此您不必在starShape方法中重复进行此操作。

您也可以做类似...

paintComponent

改为更改protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); double y = 0; for (int yIndex = 0; yIndex < getHeight() / starSize; yIndex++) { double x = 0; for (int xIndex = 0; xIndex < getWidth() / starSize; xIndex++) { Graphics2D starg = (Graphics2D) g2d.create(); starg.translate(x, y); starg.fill(star); starg.dispose(); x += starSize; } y += starSize; } g2d.dispose(); } 上下文的来源或类似的内容...

Graphics

这将更改protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); double xCount = getWidth() / starSize; for (int yIndex = 0; yIndex < getHeight() / starSize; yIndex++) { for (int xIndex = 0; xIndex < getWidth() / starSize; xIndex++) { g2d.fill(star); star.transform(AffineTransform.getTranslateInstance(starSize, 0)); } star.transform(AffineTransform.getTranslateInstance(-(starSize) * xCount, starSize)); } g2d.dispose(); } 本身的来源。

我个人不希望影响原始图像,而只是简单地更改其绘制方式,但是您使用哪种方法将取决于您的需求。

好的,这似乎需要花很多功夫,但star的API非常强大。由于它是基于点的(而不是基于像素的),因此可以更轻松地调整其大小,而不会产生像素化。通过使用Shape进行旋转非常简单,并且可以大大简化重复使用的过程。

想让星星更大吗?只需更改AffineTransform,例如...

starStar

其余部分由API负责...

Upsize

答案 1 :(得分:-1)

我使用了您的drawStar()函数并构建了此StarPanel。试试看,看看是否能为您提供一些提示,以帮助您实现目标。

请注意,我从您的g.setColor(Color.WHITE);函数中删除了drawStar()行。设置Graphics对象的颜色时需要小心。在许多情况下,这就是为什么我们看不到画的原因。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;

public class StarPanel extends JPanel
{
  private int xStarting;
  private int yStarting;

  private int numberOfRows;
  private int numberOfColumns;

  private int xDisplacement;
  private int yDisplacement;

  public StarPanel(int xStarting, int yStarting,
                   int numberOfRows, int numberOfColumns,
                   int xDisplacement, int yDisplacement)
  {
    this.xStarting = xStarting;
    this.yStarting = yStarting;
    this.numberOfRows = numberOfRows;
    this.numberOfColumns = numberOfColumns;
    this.xDisplacement = xDisplacement;
    this.yDisplacement = yDisplacement;
  }

  public static void main(String[] args)
  {
    StarPanel starPanel = new StarPanel(50, 50, 5, 6, 75, 75);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(starPanel);
    frame.setBounds(300, 200, 500, 600);
    frame.setVisible(true);
  }

  @Override
  protected void paintComponent(Graphics g)
  {
    super.paintComponent(g);

    for (int row = 0; row < numberOfRows; row++) {
      for (int column = 0; column < numberOfColumns; column++) {
        drawStar(g, xStarting + (row * xDisplacement), yStarting + (column * yDisplacement), 50);
      }
    }
  }

  // drawLine the star
  public static void drawStar(java.awt.Graphics g, int x, int y, int size)
  {
    g.drawLine(x+size/2, y+size/6, x+4*size/5, y+5*size/6);
    g.drawLine(x+4*size/5,y+5*size/6, x+size/6, y+2*size/5);
    g.drawLine(x+size/6, y+2*size/5, x+5*size/6, y+2*size/5);
    g.drawLine(x+5*size/6, y+2*size/5, x+size/5, y+5*size/6);
    g.drawLine(x+size/5, y+5*size/6, x+size/2, y+size/6);
  }
}