Download source: motion.zip
The robot starts at the center and heads off to explore, only to be stopped at the window edge.
Also see Robot.java
RobotTest2.javaimport java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.Timer;
import javax.swing.*;
class TestPanel extends JPanel
{
Timer myTimer;
int wait, wd, ht;
Robot robot;
double simtime = 0.0;
JLabel status = new JLabel(" ");
TestPanel()
{
robot = new Robot(210,210,24,22,new Color(180,180,255));
status.setBackground(Color.WHITE);
status.setOpaque(true);
status.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
}
public void showVelocity() {
status.setText(" " + robot.showVelocity());
}
public void update()
{
wd = getWidth();
ht = getHeight();
double tstep = 0.05;
double tmin = 1.0;
robot.updateVelocity();
double t = robot.intersect_window(wd,ht);
if (t<tmin) tmin = t;
if (tmin<=tstep) {
robot.move(tmin);
robot.setVelocity(0,0);
showVelocity();
}
else robot.move(tstep);
simtime += tstep;
repaint();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// draw grid
g.setColor(Color.RED);
int n;
for (n=0; n<9; n++) {
g.drawLine(10,10+n*50,410,10+n*50);
g.drawLine(10+n*50,10,10+n*50,410);
}
robot.draw(g);
}
public void startAnimation()
{
if (myTimer == null)
{
myTimer = new Timer(50,new TimerHandler() );
myTimer.start();
}
else if (!myTimer.isRunning()) myTimer.restart();
}
public void stopAnimation()
{
myTimer.stop();
}
private class TimerHandler implements ActionListener
{
public void actionPerformed(ActionEvent actionevent)
{
update();
}
}
}
public class RobotTest2
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
TestPanel panel = new TestPanel();
JFrame frame = new JFrame("Robot Motion");
frame.add(panel);
frame.add(panel.status,BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(440,480);
frame.setVisible(true);
panel.startAnimation();
}
});
}
}
Maintained by John Loomis, updated Sat Feb 23 18:46:03 2019