在Java中绘制一个漂亮的圆圈

前端之家收集整理的这篇文章主要介绍了在Java中绘制一个漂亮的圆圈前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 Java Graphics而且我一直在变得“丑陋”.

这是我的Java程序所做的

这是在Matlab中做的同样的事情

我认为Java显然不像Matlab那样“好看”,特别是在圆的边缘.请注意,这与分辨率无关……这些图像的大小几乎相同.另请注意,我已经设置了渲染提示.

这是一个独立的主要功能,你可以运行来测试这个.

  1. package test;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Color;
  5. import java.awt.Dimension;
  6. import java.awt.EventQueue;
  7. import java.awt.Graphics;
  8. import java.awt.Graphics2D;
  9. import java.awt.RenderingHints;
  10. import java.awt.Shape;
  11. import java.awt.geom.AffineTransform;
  12. import java.awt.geom.Ellipse2D;
  13. import java.awt.image.BufferedImage;
  14.  
  15. import javax.swing.JFrame;
  16. import javax.swing.JPanel;
  17. import javax.swing.UIManager;
  18.  
  19. public class SimplePaint02 {
  20.  
  21. private static final int LINE_THICKNESS = 4;
  22. private static final int LINE_GAP = 10;
  23. private Color lineColor = Color.red;
  24.  
  25. public static void main(String[] args) {
  26. new SimplePaint02();
  27. }
  28.  
  29. public SimplePaint02() {
  30. EventQueue.invokeLater(new Runnable() {
  31. @Override
  32. public void run() {
  33. try {
  34. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  35. } catch (Exception ex) {
  36. }
  37.  
  38. JFrame frame = new JFrame();
  39. frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  40. frame.setLayout(new BorderLayout());
  41. frame.add(new TestPane());
  42. frame.pack();
  43. frame.setLocationRelativeTo(null);
  44. frame.setVisible(true);
  45. }
  46. });
  47. }
  48.  
  49. public class TestPane extends JPanel {
  50.  
  51. @Override
  52. public Dimension getPreferredSize() {
  53. return new Dimension(100,100);
  54. }
  55.  
  56. @Override
  57. public void paintComponent(Graphics g) {
  58.  
  59. int radius = 50;
  60. BufferedImage buffer = new BufferedImage(radius,radius,BufferedImage.TYPE_INT_ARGB);
  61. Graphics2D g2d = buffer.createGraphics();
  62. g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  63. g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  64.  
  65. Ellipse2D circle = new Ellipse2D.Float(0,radius);
  66. Shape clip = g2d.getClip();
  67. g2d.setClip(circle);
  68. AffineTransform at = g2d.getTransform();
  69.  
  70. g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(45),radius / 2,radius / 2));
  71.  
  72. int gap = LINE_GAP;
  73.  
  74. g2d.setColor(Color.WHITE);
  75. g2d.fill(circle);
  76.  
  77. g2d.setColor(lineColor);
  78. //g2d.setStroke(new BasicStroke(LINE_THICKNESS));
  79. for (int index = 0; index < 10; index++) {
  80. int x1 = index*gap-(LINE_THICKNESS/2);
  81. int y1 = 0;
  82. int x2 = index*gap+(LINE_THICKNESS/2);
  83. int y2 = radius;
  84. int width = x2 - x1;
  85. int height = y2 - y1;
  86.  
  87. g2d.fillRect(x1,y1,width,height);
  88. //g2d.drawLine(index * gap,index * gap,getRadius());
  89. }
  90.  
  91. g2d.setTransform(at);
  92. g2d.setClip(clip);
  93. g2d.dispose();
  94. g.drawImage(buffer,this);
  95. }
  96.  
  97. }
  98.  
  99. }

解决方法

编辑:请参阅Code Guy的答案以获得解决方案.这是正确的,因为Joey Rohan最初想出来了!

当我尝试同样的事情时,我得到了顺利的优势:

  1. g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  1. import java.awt.Color;
  2. import java.awt.Graphics2D;
  3. import java.awt.RenderingHints;
  4. import java.awt.image.BufferedImage;
  5. import java.io.File;
  6. import javax.imageio.ImageIO;
  7.  
  8. public class DrawSmoothCircle {
  9. public static void main(String[] argv) throws Exception {
  10. BufferedImage bufferedImage = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
  11. Graphics2D g2d = bufferedImage.createGraphics();
  12.  
  13. g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  14. g2d.setPaint(Color.green);
  15. g2d.fillOval(10,10,50,50);
  16. g2d.dispose();
  17.  
  18. ImageIO.write(bufferedImage,"png",new File("e:\\newimage.png"));
  19. }
  20. }

更新:

搜索了很多:

代码没有错,但是,

好吧,不幸的是Java 2D(或者至少Sun目前的实现)不支持“软剪辑”.

但也有一个技巧的剪辑:
按照This link,您可以实现您的要求.

(另外,我有一个平滑的边缘,因为我不会使用剪辑的东西,在我上面的图像)

猜你在找的Java相关文章