Honeycombs: Difference between revisions
Content added Content deleted
(ActionScript implementation) |
(→{{header|Java}}: added Java) |
||
Line 1,099: | Line 1,099: | ||
{{libheader|Icon Programming Library}} |
{{libheader|Icon Programming Library}} |
||
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides formatting] |
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides formatting] |
||
=={{header|Java}}== |
|||
<lang java>import java.awt.*; |
|||
import java.awt.event.*; |
|||
import javax.swing.*; |
|||
public class Honeycombs extends JFrame { |
|||
HoneycombsPanel panel; |
|||
public static void main(String[] args) { |
|||
JFrame f = new Honeycombs(); |
|||
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|||
f.setVisible(true); |
|||
} |
|||
public Honeycombs() { |
|||
Container content = getContentPane(); |
|||
content.setLayout(new BorderLayout()); |
|||
panel = new HoneycombsPanel(); |
|||
content.add(panel, BorderLayout.CENTER); |
|||
setTitle("Honeycombs"); |
|||
setResizable(false); |
|||
pack(); |
|||
setLocationRelativeTo(null); |
|||
} |
|||
} |
|||
class HoneycombsPanel extends JPanel { |
|||
class Hexagon extends Polygon { |
|||
final Color baseColor = Color.yellow; |
|||
final Color selectedColor = Color.magenta; |
|||
final char letter; |
|||
private boolean hasBeenSelected = false; |
|||
Hexagon(int x, int y, int halfWidth, char c) { |
|||
letter = c; |
|||
for (int i = 0; i < 6; i++) |
|||
addPoint((int) (x + halfWidth * Math.cos(i * Math.PI / 3)), |
|||
(int) (y + halfWidth * Math.sin(i * Math.PI / 3))); |
|||
getBounds(); |
|||
} |
|||
void setSelected() { |
|||
hasBeenSelected = true; |
|||
} |
|||
void draw(Graphics2D g) { |
|||
g.setColor(hasBeenSelected ? selectedColor : baseColor); |
|||
g.fillPolygon(this); |
|||
g.setStroke(new BasicStroke(3)); |
|||
g.setColor(Color.black); |
|||
g.drawPolygon(this); |
|||
g.setColor(hasBeenSelected ? Color.black : Color.red); |
|||
drawCenteredString(String.valueOf(letter), g); |
|||
} |
|||
void drawCenteredString(String s, Graphics2D g) { |
|||
g.setFont(new Font("SansSerif", Font.BOLD, 30)); |
|||
FontMetrics fm = g.getFontMetrics(); |
|||
int asc = fm.getAscent(); |
|||
int dec = fm.getDescent(); |
|||
int x = bounds.x + (bounds.width - fm.stringWidth(s)) / 2; |
|||
int y = bounds.y + (asc + (bounds.height - (asc + dec)) / 2); |
|||
g.drawString(s, x, y); |
|||
} |
|||
} |
|||
Hexagon[] comb; |
|||
public HoneycombsPanel() { |
|||
setPreferredSize(new Dimension(600, 500)); |
|||
setBackground(Color.white); |
|||
setFocusable(true); |
|||
addMouseListener(new MouseAdapter() { |
|||
@Override |
|||
public void mousePressed(MouseEvent e) { |
|||
for (Hexagon hex : comb) |
|||
if (hex.contains(e.getX(), e.getY())) { |
|||
hex.setSelected(); |
|||
break; |
|||
} |
|||
repaint(); |
|||
} |
|||
}); |
|||
addKeyListener(new KeyAdapter() { |
|||
@Override |
|||
public void keyPressed(KeyEvent e) { |
|||
for (Hexagon hex : comb) |
|||
if (hex.letter == Character.toUpperCase(e.getKeyChar())) { |
|||
hex.setSelected(); |
|||
break; |
|||
} |
|||
repaint(); |
|||
} |
|||
}); |
|||
char[] letters = "LRDGITPFBVOKANUYCESM".toCharArray(); |
|||
comb = new Hexagon[20]; |
|||
int x1 = 150, y1 = 100, x2 = 225, y2 = 143, w = 150, h = 87; |
|||
for (int i = 0; i < comb.length; i++) { |
|||
int x = i < 12 ? x1 + (i % 3) * w : x2 + (i % 2) * w; |
|||
int y = i < 12 ? y1 + (i / 3) * h : y2 + ((i - 12) / 2) * h; |
|||
comb[i] = new Hexagon(x, y, w / 3, letters[i]); |
|||
} |
|||
requestFocus(); |
|||
} |
|||
@Override |
|||
public void paintComponent(Graphics gg) { |
|||
super.paintComponent(gg); |
|||
Graphics2D g = (Graphics2D) gg; |
|||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, |
|||
RenderingHints.VALUE_ANTIALIAS_ON); |
|||
for (Hexagon hex : comb) |
|||
hex.draw(g); |
|||
} |
|||
}</lang> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |