/home/akc/NetBeansProjects/CS1/src/synesthesia/GraphemeToColorSynesthesia.java
  1 /*
  2  * Program to stimulate the phenomenon known as grapheme to color synesthesia.
  3  * This program is written as an interpreter that recognizes and responds to:
  4  * - exit | terminate the program
  5  * - remap | redifine the mapping from letters to colors
  6  * - WORD OR PHRASE | simply show the word or phrase in synesthetic color
  7  */
  8 package synesthesia;
  9 
 10 import java.awt.Color;
 11 import java.awt.Point;
 12 import javax.swing.JOptionPane;
 13 import javax.swing.SwingUtilities;
 14 import painter.SPainter;
 15 
 16 /**
 17  *
 18  * @author akc
 19  */
 20 public class GraphemeToColorSynesthesia {
 21 
 22     private static final int fontsize = 30;
 23     private static final String theLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 24     private static String[] letters;
 25     private static Color[] colors;
 26 
 27     private void paintingCode() {
 28         // INITIALIZATION
 29         SPainter miro = new SPainter(1200, 220);
 30         miro.setScreenLocation(30, 30);
 31         miro.setFontSize(fontsize);
 32         initializeColorMap(theLetters);
 33 
 34         // INTERPRETATION
 35         while (true) {
 36             String input = JOptionPane.showInputDialog(null, "Please enter a word, or a few words ...");
 37             if (input == null) {
 38                 input = "EXIT";
 39             }
 40             input = input.toUpperCase();
 41             if (input.equals("EXIT")) {
 42                 break;
 43             } else if (input.equals("REMAP")) {
 44                 initializeColorMap(theLetters);
 45                 showLetters(miro, theLetters);
 46             } else {
 47                 showLetters(miro, input.toUpperCase());
 48             }
 49         }
 50         miro.end();
 51     }
 52 
 53     private static void showLetters(SPainter miro, String input) {
 54         // READY
 55         eraseWhiteBoard(miro);
 56         // SET
 57         miro.moveTo(new Point.Double(100, 100));
 58         // GO   
 59         for (int i = 0; i < input.length(); i = i + 1) {
 60             String letter = input.substring(i, i + 1);
 61             Color color = getLetterColor(letter);
 62             miro.setColor(color);
 63             miro.draw(letter);
 64             miro.mrt(fontsize);
 65         }
 66     }
 67     
 68     private static void initializeColorMap(String specialLetters) {
 69         letters = new String[specialLetters.length()];
 70         colors = new Color[specialLetters.length()];
 71         for (int i = 0; i < specialLetters.length(); i = i + 1) {
 72             letters[i] = specialLetters.substring(i, i + 1);
 73             colors[i] = randomColor();
 74         }
 75     }
 76     
 77     private static Color getLetterColor(String letter) {
 78         for (int i = 0; i < letters.length; i = i + 1) {
 79             if (letter.equalsIgnoreCase(letters[i])) {
 80                 return colors[i];
 81             }
 82         }
 83         return Color.BLACK;
 84     }
 85     
 86     private static Color randomColor() {
 87         int rv = (int) (Math.random() * 256);
 88         int gv = (int) (Math.random() * 256);
 89         int bv = (int) (Math.random() * 256);
 90         return new Color(rv, gv, bv);
 91     }
 92     
 93     private static void eraseWhiteBoard(SPainter miro) {
 94         miro.setColor(Color.WHITE);
 95         miro.wash();
 96         miro.paintFrame(Color.black, 5);
 97     }
 98     
 99     // INFRASTRUCTURE FOR SOME SIMPLE PAINTING
100     public GraphemeToColorSynesthesia() {
101         paintingCode();
102     }
103 
104     public static void main(String[] args) {
105         SwingUtilities.invokeLater(new Runnable() {
106             public void run() {
107                 new GraphemeToColorSynesthesia();
108             }
109         });
110     }
111 }
112