import java.awt.*; import java.applet.*; /* Project Java, LICIL Author: Konstantin Lukin */ public class Interaction extends Applet implements Runnable { private Rectangle border, graph, clip, control, space[], base[], part[]; private SineWave wave[], store_wave[]; private SumWaves sum; private Box box[], speed_box[]; private Handle[] handle; private Scrollbar bar[], speed[]; private Image[] image; private Graphics[] offg; private FontMetrics fm; private Font label_font, graph_font, title_font; private int index, update_mode, values_mode, runner_state, speed_value[]; private Thread runner; Button button; public void init() { title_font = new Font("Helvetica", Font.BOLD , 16); label_font = new Font("Helvetica", Font.PLAIN, 14); graph_font = new Font("Helvetica", Font.PLAIN, 12); speed_value = new int[2]; for(int i=0; i5 && evt.target == speed[i-6]) break; } switch(i) { case 0: case 3: wave[i/3].wavelength = bar[i].getValue() * 20/9; values_mode = (i==0) ? 0 : 2; break; case 1: case 4: wave[i/3].amplitude = bar[i].getValue() * 1/2; values_mode = (i==1) ? 0 : 2; break; case 2: case 5: wave[i/3].phase = bar[i].getValue() * 4; values_mode = (i==2) ? 1 : 3; break; case 6: case 7: speed_value[i-6] = (speed[i-6].getValue()/3); values_mode = (i==6) ? 4 : 5; break; default: } update_mode = i/3; } else return super.handleEvent(evt); repaint(); return true; } //--------------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { if(runner_state==1) return super.mouseDown(evt,x,y); index = insideHandle(x,y); if(index==-1) return super.mouseDown(evt, x, y); else { notifyBars(Color.lightGray); } return true; } public boolean mouseUp(Event evt, int x, int y) { if(runner_state==1) return super.mouseDown(evt,x,y); notifyBars(Color.gray); index = -1; return super.mouseUp(evt, x, y); } public boolean mouseDrag(Event evt, int x, int y) { int i, newx, newy; switch(index) { case -1: return super.mouseDrag(evt, x, y); case 0: case 2: i = index/2; newx = x - space[i].x - base[i].x; int phase = AdjustPhase(newx*360/wave[i].wavelength); wave[i].phase = phase; updateBars(); update_mode = (index==0) ? 0 : 1; values_mode = (index==0) ? 1 : 3; break; case 1: case 3: i = index/2; newx = x - space[i].x - base[i].x; newy = y - space[i].y - base[i].y; int amp = AdjustAmp(base[i].height/2 - newy); wave[i].amplitude = amp; int lambda = (newx*360)/(wave[i].phase+90); lambda = AdjustLambda(lambda); wave[i].wavelength = lambda; updateBars(); update_mode = (index==1) ? 0 : 1; values_mode = (index==1) ? 0 : 2; break; default: return super.mouseDrag(evt, x, y); } repaint(); return true; } private int AdjustLambda(int lambda) { if(lambda > 200) return 200; else if(lambda <5) return 5; else return lambda; } private int AdjustAmp(int amp) { if(amp > 45) return 45; else if(amp <0) return 0; else return amp; } private int AdjustPhase(int phase) { if(phase >360) return 360; else if(phase <0) return 0; else return phase; } private int insideHandle(int x, int y) { int newx, newy; for(int i=0; i