【问题标题】:Cannot draw pixels, Pi number in a Synesthetic way无法以综合方式绘制像素,Pi 编号
【发布时间】:2010-04-13 03:11:00
【问题描述】:

我想将 pi 数的每个数字打印为彩色像素,因此,我得到一个带有 pi 数的输入,然后将其解析为一个列表,每个节点都包含一个数字(我知道,我将使用数组稍后),但我从来没有把这个画到屏幕上......有人可以帮我看看我错在哪里吗?

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.MemoryImageSource;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PiPainter extends JPanel
{
    private static final long   serialVersionUID    = 6416932054834995251L;

    private static int pixels[];
    private static List<Integer> pi = new ArrayList<Integer>();
    private final static int[] color = {
        0xFF000000, 0xFF787878, 0xFF008B00, 0xFF00008B, 0xFF008B8B,
        0xFF008B00, 0xFFCDCD00, 0xFFFF4500, 0xFF8B0000, 0xFFFF0000
        };

    public static void readFile(String name)
    {
        File file = new File(name);
        BufferedReader reader = null;
        char[] digits;

        try
        {
            reader = new BufferedReader(new FileReader(file));

            String text = null;

            while((text = reader.readLine()) != null)
            {
                digits = text.toCharArray();

                for(char el : digits)
                    if(el != ' ')
                    pi.add(Character.getNumericValue(el));
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void paint(Graphics gg) 
    {
        // page containing pi number, http://gc3.net84.net/pi.htm
        // other source, http://newton.ex.ac.uk/research/qsystems/collabs/pi/pi6.txt
        readFile("c:\\pi.txt");
        int h = 300;
        int w = 300;
        int digit;
        int i = 0;  

        pixels = new int[w * h];

        for (int y = 0; y < h; y++) 
        {
          for (int x = 0; x < w; x++) 
          {
              pixels[i] = color[pi.get(i)];
              i++;
          }
        }

        Image art = createImage(new MemoryImageSource(w, h, pixels, 0, w));

        gg.drawImage(art, 0, 0, this);
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.getContentPane().add(new PiPainter(), BorderLayout.CENTER);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,400);
        frame.setVisible(true);
    }
}

【问题讨论】:

    标签: java pi memoryimagesource


    【解决方案1】:

    我不熟悉MemoryImageSource。这是 π 的前 16 300 位数字,在 BufferedImage 中重复并使用您的颜色表。

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class PiRaster extends JPanel {
    
        private static final int W = 30;
        private static final int H = 30;
        private static List<Integer> pi = new ArrayList<Integer>();
        BufferedImage image;
        private int[] clut = {
            0x000000, 0x787878, 0x008B00, 0x00008B, 0x008B8B,
            0x008B00, 0xCDCD00, 0xFF4500, 0x8B0000, 0xFF0000
        };
    
        public PiRaster() {
            this.setPreferredSize(new Dimension(W * 16, H * 10));
            String s = ""
                + "31415926535897932384626433832795028841971693993751"
                + "05820974944592307816406286208998628034825342117067"
                + "98214808651328230664709384460955058223172535940812"
                + "84811174502841027019385211055596446229489549303819"
                + "64428810975665933446128475648233786783165271201909"
                + "14564856692346034861045432664821339360726024914127";
            for (int i = 0; i < s.length(); i++) {
                pi.add(s.charAt(i) - '0');
            }
        }
    
        @Override
        public void paintComponent(Graphics g) {
            if (image == null) {
                image = (BufferedImage) createImage(W, H);
                int i = 0;
                for (int row = 0; row < H; row++) {
                    for (int col = 0; col < W; col++) {
                        image.setRGB(col, row, clut[pi.get(i)]);
                        if (++i == pi.size()) {
                            i = 0;
                        }
                    }
                }
            }
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new PiRaster());
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      @trashgod

      感谢您的回答,我对其进行了一些更改以实现我想要的; )

      现在您可以轻松更改宽度以更好地查看图像并适合内容,并且数字不会重复,从而易于感知图案(如果可能的话)。哦,我在最后添加了大约 2~3 行,以澄清它。

      package edu.pi;
      
      import java.awt.Dimension;
      import java.awt.Graphics;
      import java.awt.image.BufferedImage;
      import java.util.ArrayList;
      import java.util.List;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.SwingUtilities;
      
      public class PiRaster extends JPanel
      {
          private static final long       serialVersionUID    = -1298205187260747210L;
      
          private static int              W;
          private static int              H;
          private static List<Integer>    pi                  = new ArrayList<Integer>();
          BufferedImage                   image;
          private int[]                   clut                = { 
                  0x000000, 0x787878, 0x008B00, 0x00008B, 0x008B8B,
                  0x008B00, 0xCDCD00, 0xFF4500, 0x8B0000, 0xFF0000
                  };
      
          public PiRaster()
          {
              String s = "3."
                      + "14159265358979323846264338327950288419716939937510"
                      + "58209749445923078164062862089986280348253421170679"
                      + "82148086513282306647093844609550582231725359408128"
                      + "48111745028410270193852110555964462294895493038196"
                      + "44288109756659334461284756482337867831652712019091"
                      + "45648566923460348610454326648213393607260249141273"
                      + "72458700660631558817488152092096282925409171536436"
                      + "78925903600113305305488204665213841469519415116094"
                      + "33057270365759591953092186117381932611793105118548"
                      + "07446237996274956735188575272489122793818301194912"
                      + "98336733624406566430860213949463952247371907021798"
                      + "60943702770539217176293176752384674818467669405132"
                      + "00056812714526356082778577134275778960917363717872"
                      + "14684409012249534301465495853710507922796892589235"
                      + "42019956112129021960864034418159813629774771309960"
                      + "51870721134999999837297804995105973173281609631859"
                      + "50244594553469083026425223082533446850352619311881"
                      + "71010003137838752886587533208381420617177669147303"
                      + "59825349042875546873115956286388235378759375195778"
                      + "18577805321712268066130019278766111959092164201989";
      
              char temp;
      
              for (int i = 0; i < s.length(); i++)
              {
                  temp = s.charAt(i);
                  if (temp >= 48 && temp <= 57)
                      pi.add(s.charAt(i) - '0');
              }
      
              W = 50;
              H = s.length() / W + 3;
              this.setPreferredSize(new Dimension(W * 10, H * 10));
          }
      
          @Override
          public void paintComponent(Graphics g)
          {
              if (image == null)
              {
                  image = (BufferedImage) createImage(W, H);
                  int i = 0;
                  boolean end = false;
      
                  for (int row = 0; row < H && !end; row++)
                  {
                      for (int col = 0; col < W && !end; col++)
                      {
                          image.setRGB(col, row, clut[pi.get(i)]);
                          if (++i == pi.size())
                          {
                              i = 0;
                              end = true;
                          }
                      }
                  }
              }
      
              g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
          }
      
          public static void main(String[] args)
          {
              SwingUtilities.invokeLater(new Runnable()
              {
      
                  @Override
                  public void run()
                  {
                      JFrame frame = new JFrame("Pi raster");
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.add(new PiRaster());
                      frame.pack();
                      frame.setLocationRelativeTo(null);
                      frame.setVisible(true);
                  }
              });
          }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多