/* Item7: link movement+color of items to movement of an item */ import java.awt.*; public class Item7 extends Item6 { final static int NKEYS = 10; // MAINTAIN INTERNAL DATABASE FOR PUPPETEERING OTHER ITEMS boolean highlight = false; boolean isLinkingMode = false; int nKeys = 0, nLinked = 0; int xKey[] = new int[NKEYS]; int yKey[] = new int[NKEYS]; int ckx[][] = new int[NKEYS][20]; int cky[][] = new int[NKEYS][20]; int ckc[][] = new int[NKEYS][20]; Item linkedItem[] = new Item[20]; public void setHighlighted(boolean tf) { highlight = tf; } public void setLinkingMode(boolean tf) { isLinkingMode = tf; } public void setKey(int k) { xKey[k] = x0; yKey[k] = y0; nKeys = Math.max(nKeys, k+1); } // ADD LINK FROM THE LINK ITEM TO POSITION/COLOR OF A PUPPETEERED ITEM public void linkAtKey(int k, Item7 item) { int n = findLinkedItem(item); for (int kk = k ; kk >= 0 && ckx[kk][n] == 0 ; kk--) { ckx[kk][n] = 1; ckc[kk][n] = item.color; } for (int kk = k ; kk < NKEYS ; kk++) { ckx[kk][n] = item.x0; cky[kk][n] = item.y0; ckc[kk][n] = item.color; if (item.x0 == 0 && item.y0 == 0) ckx[kk][n] = 1; } } // HIGHLIGHT THE LINK ITEM - DRAW IT IN BLACK AND GIVE IT A WHITE HALO public void draw(Graphics g, Color palette[]) { if (highlight) { g.setColor(Color.white); draw(g, 0, 0, thicken ? r * 5 / 2 : r * 2); } g.setColor(palette[color] == Color.white ? faintColor : Color.black); draw(g, 0, 0, thicken ? 3*r/2 : r); if (! highlight) { g.setColor(palette[color]); draw(g, 0, 0, r-2); } } // MOVING A LINK ITEM FORCES MOVEMENT OR COLOR CHANGES TO OTHER ITEMS public void move(int dx, int dy) { x0 += dx; y0 += dy; if (! isLinkingMode && nKeys > 0) { int xx, yy, rr, k0 = 0, rr0 = 100000, k1 = 0, rr1 = 100000; // FIND TWO NEAREST KEYS for (int k = 0 ; k < nKeys ; k++) if ((rr = distSqr(k)) < rr0) { rr0 = rr; k0 = k; } for (int k = 0 ; k < nKeys ; k++) if ((rr = distSqr(k)) > rr0 && rr < rr1) { rr1 = rr; k1 = k; } // BLEND BETWEEN THEM for (int n = 0 ; n < nLinked ; n++) { Item7 it = (Item7)linkedItem[n]; it.setX( ( rr1 * ckx[k0][n] + rr0 * ckx[k1][n] ) / ( rr0 + rr1 ) ); it.setY( ( rr1 * cky[k0][n] + rr0 * cky[k1][n] ) / ( rr0 + rr1 ) ); it.setColor(ckc[k0][n]); } } } int distSqr(int k) { int x = x0 - xKey[k], y = y0 - yKey[k]; return x * x + y * y; } int findLinkedItem(Item item) { for (int j = 0 ; j < nLinked ; j++) if (item == linkedItem[j]) return j; linkedItem[nLinked] = item; return nLinked++; } }