2016-02-13 146 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