`
// 3/14/2013 Greenstein: changed applet to JFrame
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*; // for classes File, IOException
import javax.imageio.*; // for class ImageIO
public class Trig extends JApplet
{
private int choice;
private double xval;
private JFrame frame;
private DisplayPanel canvas;
private ButtonPanel buttonPanel;
public Trig ( )
{
choice = 0;
xval = 0.0;
}
public static void main(String[] args)
{
Trig t = new Trig();
t.run();
}
public void run()
{
// Create a frame to hold everything
frame = new JFrame ("Trig");
frame.setSize(780, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.setBackground(Color.black); // only needed if frame is larger than panel
// Define panel to draw on
canvas = new DisplayPanel(); // create a panel to draw on
canvas.setBackground(Color.black);
buttonPanel = new ButtonPanel ( );
// Put frame together
frame.getContentPane().add(canvas, BorderLayout.CENTER); // puts panel on frame
frame.getContentPane().add(buttonPanel, BorderLayout.NORTH );
frame.setVisible(true);
}
public Insets getInsets()
{
return new Insets ( 10, 10, 10, 10 );
}
class DisplayPanel extends JPanel
{
private Image numbers;
private int xcorner, ycorner;
private int width, height;
private double xleft, xright, xincrement;
private int ybottom, ytop;
private String name[] = { "sin", "cos", "tan", "csc", "sec", "cot" };
private String numerator[] = { "opposite","adjacent","opposite","hypotenuse","hypotenuse","adjacent" };
private String denominator[] = { "hypotenuse","hypotenuse","adjacent","opposite","adjacent","opposite" };
public DisplayPanel ( )
{
try
{
numbers = ImageIO.read(new File("Numbers.jpg"));
}
catch (IOException e)
{
e.printStackTrace();
}
//numbers = getImage ( getDocumentBase ( ), "Numbers.jpg" );
waitForImage ( this, numbers );
setBackground ( Color.white );
width = 760;
height = 300;
xleft = ( -Math.PI / 6.0 );
xright = ( 19.0 * Math.PI / 6.0 );
xincrement = ( Math.PI / 6.0 );
ybottom = -3;
ytop = 3;
xcorner = 10;
ycorner = 230;
}
public void paintComponent(Graphics g)
{
super.paintComponent ( g );
paintFunction ( g );
drawUnitCircle ( g );
displayTrigRatio ( g );
}
public void waitForImage ( JPanel component, Image image )
{
MediaTracker tracker = new MediaTracker ( component );
try
{
tracker.addImage ( image, 0 );
tracker.waitForID ( 0 );
}
catch ( InterruptedException e )
{
e.printStackTrace ( );
}
}
public void drawUnitCircle ( Graphics g )
{
int xpos = 50, ypos = 15, radius = 100;
int col = ((int)(xval * 180 / Math.PI + 0.1) % 360) / 30;
int oppmovefact = -25;
if ( Math.cos(xval) > 0.0 )
oppmovefact *= -1;
g.drawImage( numbers, (int)(xpos + radius + radius * Math.cos (xval)) - 15 + oppmovefact,
(int)(ypos + radius - radius * Math.sin (xval) / 2.0) - 20,
(int)(xpos + radius + radius * Math.cos (xval)) + 22 + oppmovefact,
(int)(ypos + radius - radius * Math.sin (xval) / 2.0) + 27, col * 38 + 1, 1,
( col + 1 ) * 38, 48, this );
int adjmovefact = 22;
if ( Math.sin(xval) - 0.01 > 0.0 )
adjmovefact *= -1;
g.drawImage( numbers, (int)(xpos + radius + radius * Math.cos (xval) / 2.0) - 15,
(int)(ypos + radius - adjmovefact - 25),
(int)(xpos + radius + radius * Math.cos (xval) / 2.0) + 22,
(int)(ypos + radius - adjmovefact + 22), col * 38 + 1, 51,
( col + 1 ) * 38, 98, this );
g.drawImage( numbers, (int)(xpos + radius + radius * Math.cos (xval) / 2.0) - 10,
(int)(ypos + radius - radius * Math.sin (xval)) - 10,
(int)(xpos + radius + radius * Math.cos (xval) / 2.0) + 27,
(int)(ypos + radius - radius * Math.sin (xval)) + 37, col * 38 + 1, 101,
( col + 1 ) * 38, 148, this );
g.setColor ( Color.gray );
g.drawOval ( xpos, ypos, 2 * radius, 2 * radius );
g.drawOval ( xpos + 1, ypos + 1, 2 * radius - 2, 2 * radius - 2 );
g.drawOval ( xpos + 2, ypos + 2, 2 * radius - 4, 2 * radius - 4 );
g.setColor ( Color.red );
for ( int i = -1; i <= 1; i++ )
{
if ( choice == 1 || choice == 4 )
g.setColor ( Color.lightGray );
else if ( choice == 3 || choice == 5 )
g.setColor ( Color.blue );
else
g.setColor ( Color.red );
g.drawLine ( xpos + radius + (int)(Math.cos(xval)*radius) + i, ypos + radius,
xpos + radius + (int)(Math.cos(xval)*radius) + i,
ypos + radius - (int)(Math.sin(xval)*radius) );
if ( choice == 0 || choice == 3 )
g.setColor ( Color.lightGray );
else if ( choice == 2 || choice == 4 )
g.setColor ( Color.blue );
else
g.setColor ( Color.red );
g.drawLine ( xpos + radius, ypos + radius + i,
xpos + radius + (int)(Math.cos(xval)*radius), ypos + radius + i );
if ( choice == 2 || choice == 5 )
g.setColor ( Color.lightGray );
else if ( choice == 0 || choice == 1 )
g.setColor ( Color.blue );
else
g.setColor ( Color.red );
g.drawLine ( xpos + radius, ypos + radius + i, xpos + radius + (int)(Math.cos(xval)*radius),
ypos + radius - (int)(Math.sin(xval)*radius) + i );
}
}
public void displayTrigRatio ( Graphics g )
{
g.setColor ( Color.black );
Font textFont = new Font ( "SansSerif", Font.BOLD, 28 );
g.setFont ( textFont );
g.drawString ( name[choice] + " " + (int)(xval * 180 / Math.PI + 0.1) + " =", 300, 65 );
int row1 = 0, row2 = 0;
switch (choice)
{
case 0:
row1 = 0;
row2 = 2;
break;
case 1:
row1 = 1;
row2 = 2;
break;
case 2:
row1 = 0;
row2 = 1;
break;
case 3:
row1 = 2;
row2 = 0;
break;
case 4:
row1 = 2;
row2 = 1;
break;
case 5:
row1 = 1;
row2 = 0;
break;
}
int col = ((int)(xval * 180 / Math.PI + 0.1) % 360) / 30;
g.drawImage( numbers, 450, 5, 487,
54, col * 38 + 1, row1 * 50 + 1,
( col + 1 ) * 38, ( row1 + 1 ) * 50, this );
g.drawImage( numbers, 450, 55, 487,
104, col * 38 + 1, row2 * 50 + 1,
( col + 1 ) * 38, ( row2 + 1 ) * 50, this );
g.fillRect ( 445, 55, 40, 4 );
if ( ((int)(xval * 180 / Math.PI + 0.1) % 360) % 90 != 0 )
{
g.drawString ( "=", 510, 65 );
row1 += 3;
row2 += 3;
g.drawImage( numbers, 540, 13, 577,
60, col * 38 + 1, row1 * 50 + 3,
( col + 1 ) * 38, ( row1 + 1 ) * 50, this );
g.drawImage( numbers, 540, 55, 577,
102, col * 38 + 1, row2 * 50 + 3,
( col + 1 ) * 38, ( row2 + 1 ) * 50, this );
g.fillRect ( 540, 55, 40, 4 );
}
g.drawString ( "y = " + name[choice] + " x =", 300, 180 );
g.fillRect ( 490, 170, 160, 4 );
g.setColor ( Color.red );
g.drawString ( numerator[choice], 490, 155 );
g.setColor ( Color.blue );
g.drawString ( denominator[choice], 490, 205 );
}
public void paintFunction ( Graphics g )
{
g.setColor ( Color.black );
g.fillRect ( xcorner - 2, ycorner - 2, width + 4, height + 4 );
g.setColor ( Color.white );
g.fillRect ( xcorner + 2, ycorner + 2, width - 4, height - 4 );
g.setColor ( Color.black );
g.fillRect ( xcorner + (int)(width / (xright - xleft) * (0.0 - xleft)) - 2, ycorner, 4, height );
g.fillRect ( xcorner, ycorner + (int)(height / (double)(ytop - ybottom) * ytop) - 2, width, 4 );
for ( double i = xleft; i <= xright; i += xincrement )
{
g.fillRect ( xcorner + (int)(width / (xright - xleft) * (i - xleft)) - 2,
ycorner + (int)(height / (double)(ytop - ybottom) * ytop) - 8, 4, 16 );
g.drawLine ( xcorner + (int)(width / (double)(xright - xleft) * (i - xleft)), ycorner,
xcorner + (int)(width / (double)(xright - xleft) * (i - xleft)), ycorner + height );
}
for ( int i = ybottom; i <= ytop; i++ )
{
g.fillRect ( xcorner + (int)(width / (xright - xleft) * (0.0 - xleft)) - 8,
ycorner + (int)(height /(double)(ytop - ybottom) * (i - ybottom)) - 2, 16, 4 );
g.drawLine ( xcorner, ycorner + (int)(height / (double)(ytop - ybottom) * (i - ybottom)),
xcorner + width, ycorner + (int)(height / (double)(ytop - ybottom) * (i - ybottom)) );
}
double y, prevy, prevx;
prevx = xleft;
prevy = getValue ( prevx );
g.setColor ( Color.blue );
for ( double x = xleft; x <= xval; x += 0.01 )
{
y = getValue ( x );
for ( int i = -3; i <= 0; i++ )
{
if ( y > -10 && y < 10 )
g.drawLine ( xcorner + (int)(width / (xright - xleft) * (x - xleft)),
ycorner + height - (int)(height / (double)(ytop - ybottom) * (y - ybottom)) + i,
xcorner + (int)(width / (xright - xleft) * (prevx - xleft)),
ycorner + height-(int)(height / (double)(ytop - ybottom) * (prevy - ybottom)) + i );
}
prevx = x;
prevy = y;
}
g.setColor ( Color.red );
if ( getValue ( xval ) < 10 && getValue ( xval ) > -10 )
g.fillOval ( xcorner + (int)(width / (xright - xleft) * (xval - xleft)) - 5,
ycorner + height -
(int)(height / (double)(ytop - ybottom) * (getValue(xval) - ybottom)) - 5,
10, 10 );
g.setColor ( Color.white );
g.fillRect ( 0, 0, xcorner - 2, height + ycorner );
g.fillRect ( 0, 0, width + xcorner, ycorner - 2 );
g.fillRect ( 0, ycorner + height + 2, width + xcorner, height + ycorner );
g.fillRect ( xcorner + width + 2, 0, width + xcorner, height + ycorner );
g.setColor ( Color.black );
}
public double getValue ( double x )
{
switch ( choice )
{
case 0:
return ( Math.sin ( x ) );
case 1:
return ( Math.cos ( x ) );
case 2:
return ( Math.tan ( x ) );
case 3:
return ( 1 / Math.sin ( x ) );
case 4:
return ( 1 / Math.cos ( x ) );
case 5:
return ( 1 / Math.tan ( x ) );
}
return -1.0;
}
}
class ButtonPanel extends JPanel implements ActionListener
{
public ButtonPanel ( )
{
setBackground ( Color.blue );
JButton increasex = new JButton ( "INCREASE x value" );
increasex.addActionListener ( this );
this.add ( increasex );
JButton decreasex = new JButton ( "DECREASE x value" );
decreasex.addActionListener ( this );
this.add ( decreasex );
JButton changetrig = new JButton ( "CHANGE trig function" );
changetrig.addActionListener ( this );
this.add ( changetrig );
}
public void actionPerformed ( ActionEvent evt )
{
String command = evt.getActionCommand();
if ( command.equals ( "INCREASE x value" ) )
xval += ( Math.PI / 6.0 );
else if ( command.equals ( "DECREASE x value" ) )
xval -= ( Math.PI / 6.0 );
else if ( command.equals ( "CHANGE trig function" ) )
{
choice++;
choice = choice % 6;
}
if ( xval < 0.0 )
xval = 0.0;
else if (xval > 19.0 * Math.PI / 6.0 )
xval = 19.0 * Math.PI / 6.0;
canvas.repaint ( );
}
}
}
Back to Lesson 27 Examples
Back to Java Main Page