2016-02-13 31 views
1

我有一个项目,我必须绘制奥林匹克环,而且我很难让它看起来像环形互锁。这是一幅展示我的意思的图片。如何在Java中互锁形状

enter image description here

通知他们如何联动?这就是我现在想要的,我只有形状坐在彼此顶部。这就是我现在所拥有的。

import javax.swing.JFrame; 
import java.awt.Graphics; 
import java.awt.Color; //sets color 
import java.awt.BasicStroke; 
import java.awt.Graphics2D; 
import java.awt.AlphaComposite; 

class ColoredOlypmicRings extends JFrame { 

    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     float strokeThickness = 27.0f; 
     float arcThickness = 9.0f; 
     BasicStroke Outline = new BasicStroke(strokeThickness); 
     BasicStroke arcOutline = new BasicStroke(arcThickness); 
     g2d.setStroke(Outline); 
     g2d.setColor(Color.blue); 
     g2d.drawOval(100, 100, 300, 300); 
     g2d.setColor(Color.yellow); 
     g2d.drawOval(265, 300, 300, 300); 
     g2d.setColor(Color.black); 
     g2d.drawOval(430, 100, 300, 300); 
     g2d.setColor(Color.green); 
     g2d.drawOval(595, 300, 300, 300); 
     g2d.setColor(Color.red); 
     g2d.drawOval(760, 100, 300, 300); 
     g2d.setStroke(arcOutline); 
     g2d.setColor(Color.white); 
     g2d.drawArc(253, 378, 50, 75, -230, 58); // -270 start 
     g2d.drawArc(290, 370, 50, 75, -230, 58); 
     g2d.drawArc(360, 285, 50, 75, -230, 58); 
     g2d.drawArc(405, 285, 50, 75, -230, 58); 

    } 

    public ColoredOlypmicRings() { 
     setSize(1200, 800); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     ColoredOlypmicRings guiWindow = new ColoredOlypmicRings(); 
     guiWindow.setVisible(true); 
    } 

} 
+0

挂在例如... .. –

回答

5
  1. 的颜色绘制圆弧形成自己的圈子结合时,而不是抽取全椭圆形。
  2. 弧的顶层需要最后绘制。这可能需要一些试验和错误,但你可以做到这一点。
  3. 一般建议不要在顶层窗口中绘制JFrame等。
  4. 改为在JPanel的paintComponent方法中绘制,然后在JFrame中显示该JPanel。
  5. 始终在覆盖的方法中调用super的绘画方法。
  6. 通过使用Graphics2D setRenderingHints来平滑绘图并在上打开抗锯齿

第一次迭代 - 尚未完全固定的:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class OlympicRings extends JPanel { 
    private static final Color BG = Color.WHITE; 
    private static final int OVAL_WIDTH = 300; 
    private static final int OVAL_HEIGHT = OVAL_WIDTH; 
    private static final int X_START = 100; 
    private static final int Y_START = X_START; 
    private static final int DELTA_X = 175; 
    private static final int DELTA_Y = 180; 
    private static final Color COLOR_GOLD = new Color(242, 205, 25); 
    private static final Stroke INNER_STROKE = new BasicStroke(30f); 
    private static final Stroke OUTER_STROKE = new BasicStroke(40f); 
    private static final int ARC_LENGTH = 30; 
    private static final int CIRCLE_DEGREES = 360; 

    public OlympicRings() { 
     setBackground(BG); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     int x = X_START; 
     int y = Y_START; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH); 
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH);   
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH);   
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH);   
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.RED, OVAL_WIDTH); 

     x = X_START; 
     y = Y_START; 
     int angle = CIRCLE_DEGREES - ARC_LENGTH; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH); 
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 0, ARC_LENGTH); 
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);   
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 0, ARC_LENGTH);   

     g2.dispose();   
    } 

    private void myDrawArc(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y, 
      Color bg2, Color color, int ovalWidth, int start, int end) { 
     g2.setStroke(outerStroke); 
     g2.setColor(bg2); 
     g2.drawArc(x, y, ovalWidth, ovalWidth, start, end); 

     g2.setStroke(innerStroke); 
     g2.setColor(color); 
     g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);   
    } 

    private void myDrawOval(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y, 
      Color bg2, Color color, int ovalWidth) { 
     g2.setStroke(outerStroke); 
     g2.setColor(bg2); 
     g2.drawOval(x, y, ovalWidth, ovalWidth); 

     g2.setStroke(innerStroke); 
     g2.setColor(color); 
     g2.drawOval(x, y, ovalWidth, ovalWidth); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     int w = 2 * X_START + DELTA_X * 4 + OVAL_WIDTH; 
     int h = 2 * Y_START + DELTA_Y + OVAL_HEIGHT; 
     return new Dimension(w, h); 
    } 

    private static void createAndShowGui() { 
     OlympicRings mainPanel = new OlympicRings(); 

     JFrame frame = new JFrame("OlympicRings"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

这是不太有我的背景中风延伸三分线外的末尾:

enter image description here

仍在工作在上面。

稍微好一点:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class OlympicRings extends JPanel { 
    private static final Color BG = Color.WHITE; 
    private static final int OVAL_WIDTH = 300; 
    private static final int OVAL_HEIGHT = OVAL_WIDTH; 
    private static final int X_START = 100; 
    private static final int Y_START = X_START; 
    private static final int DELTA_X = 175; 
    private static final int DELTA_Y = 180; 
    private static final Color COLOR_GOLD = new Color(242, 205, 25); 
    private static final Stroke INNER_STROKE = new BasicStroke(30f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND); 
    private static final Stroke OUTER_STROKE = new BasicStroke(40f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); 
    private static final int ARC_LENGTH = 30; 
    private static final int CIRCLE_DEGREES = 360; 

    public OlympicRings() { 
     setBackground(BG); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     int x = X_START; 
     int y = Y_START; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH); 
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH);   
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH);   
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH);   
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.RED, OVAL_WIDTH); 

     x = X_START; 
     y = Y_START; 
     int angle = CIRCLE_DEGREES - ARC_LENGTH; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH); 
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 0, ARC_LENGTH); 
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);   
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 0, ARC_LENGTH);   

     g2.dispose();   
    } 

    private void myDrawArc(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y, 
      Color bg2, Color color, int ovalWidth, int start, int end) { 
     g2.setStroke(outerStroke); 
     g2.setColor(bg2); 
     g2.drawArc(x, y, ovalWidth, ovalWidth, start, end); 

     g2.setStroke(innerStroke); 
     g2.setColor(color); 
     g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);   
    } 

    private void myDrawOval(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y, 
      Color bg2, Color color, int ovalWidth) { 
     g2.setStroke(outerStroke); 
     g2.setColor(bg2); 
     g2.drawOval(x, y, ovalWidth, ovalWidth); 

     g2.setStroke(innerStroke); 
     g2.setColor(color); 
     g2.drawOval(x, y, ovalWidth, ovalWidth); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     int w = 2 * X_START + DELTA_X * 4 + OVAL_WIDTH; 
     int h = 2 * Y_START + DELTA_Y + OVAL_HEIGHT; 
     return new Dimension(w, h); 
    } 

    private static void createAndShowGui() { 
     OlympicRings mainPanel = new OlympicRings(); 

     JFrame frame = new JFrame("OlympicRings"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

enter image description here

最新变化:

 x = X_START; 
     y = Y_START; 
     int angle = CIRCLE_DEGREES - ARC_LENGTH; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH); 
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 57, ARC_LENGTH); 
     x += DELTA_X; 
     y -= DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);   
     x += DELTA_X; 
     y += DELTA_Y; 
     myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 57, ARC_LENGTH); 

和结果:

enter image description here

+0

以后再回来工作。 –

+0

你是错误的网格 - 看到预期的输出 – tucuxi

1

这就是OP发布的代码的输出: Output of OP's code

白色边框戒指 - 而不是试图进行硬编码,只有当环相互交叉边界,你应该在你面前画一个白色的弧线画出任何颜色的弧线,其中白色弧线比彩色弧线更宽。

重叠 - 如果您一个接一个地绘制所有戒指,则必须修复至少4个重叠部分,以使其看起来像您之后的徽标。通过重新绘制相应的弧线部分,您应该重新绘制4个重叠部分(蓝色 - 黄色,黄色 - 黑色,黑色 - 绿色,绿色 - 红色)中的每一个。

颜色&距离 - 使用颜色选择工具从您的样本图像中查找颜色的确切RGB值。你还应该把你的戒指水平放置多一点,并且把最上面一排画得更靠近最下面一排。


编辑:这里下我自己的意见,是我的输出

olympic logo

而且程序来生成它(import语句ommitted)

public static void paintRing(Graphics2D g, BasicStroke bs, BasicStroke fs, 
     double x, double y, 
     double r, double rw, Color color, int a0, int a) { 
    g.setColor(Color.white); 
    g.setStroke(new BasicStroke((float)rw*1.5f)); 
    g.drawArc((int)x, (int)y, (int)r, (int)r, a0+5, a-10); 
    g.setColor(color); 
    g.setStroke(new BasicStroke((float)rw)); 
    g.drawArc((int)x, (int)y, (int)r, (int)r, a0, a); 
} 

public void paintComponent(Graphics g) { 
    Graphics2D g2d = (Graphics2D)g; 
    RenderingHints rh = new RenderingHints(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    rh.put(RenderingHints.KEY_RENDERING, 
      RenderingHints.VALUE_RENDER_QUALITY); 
    g2d.setRenderingHints(rh); 

    double w = getWidth(); 

    // eyeballed measurements 
    double m = w/12; 
    double dx = w/7; 
    double dy = w/8; 
    double x = m; 
    double y = .7 * m; 
    double r = w/4; 

    // for partial lines 
    int fwdStart = -30; 
    int topStart = 90-30; 

    // background & foreground strokes 
    float rw = (float)w/40; 
    BasicStroke bs = new BasicStroke(rw*1.5f); 
    BasicStroke fs = new BasicStroke(rw); 

    // colors 
    Color blue = new Color(0, 133, 199); 
    Color gold = new Color(244, 195, 0); 
    Color black = Color.black; 
    Color green = new Color(0, 159, 61); 
    Color red = new Color(223, 0, 36); 

    paintRing(g2d, fs, bs, x, y, r, rw, blue, 0, 360); 
    paintRing(g2d, fs, bs, x+dx, y+dy, r, rw, gold, 0, 360);   
    paintRing(g2d, fs, bs, x+2*dx, y, r, rw, black, 0, 360); 

    // mesh blue-gold-black 
    paintRing(g2d, fs, bs, x+dx, y+dy, r, rw, gold, topStart, 60); 
    paintRing(g2d, fs, bs, x, y, r, rw, blue, fwdStart, 60); 

    paintRing(g2d, fs, bs, x+3*dx, y+dy, r, rw, green, 0, 360); 
    paintRing(g2d, fs, bs, x+4*dx, y, r, rw, red, 0, 360); 

    // mesh red-green-black 
    paintRing(g2d, fs, bs, x+3*dx, y+dy, r, rw, green, topStart, 60); 
    paintRing(g2d, fs, bs, x+2*dx, y, r, rw, black, fwdStart, 60); 
} 

public static void main(String[] args) { 
    JFrame jf = new JFrame("Test"); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.add(new Olympic()); 
    jf.setSize(800, 400); 
    jf.setLocationByPlatform(true); 
    jf.setVisible(true); 
} 
+0

黄色圆圈顶部的圆弧是错误的 –

+0

这是OP发布的代码 - 我只是在我的答案中显示它以评论它 – tucuxi