import java.awt.*;
public class PlanetCanvas extends Canvas {
 int position = 0;
 Image imageBuffer;                             
 public void IncrementPosition() {
  if (position < 360) {++position;}
  else {position = 0;}
  repaint();
 }
 // Override Java's update method; no display clearing:
 public void update(Graphics g) {
  paint(g);
 } 
 // paint works with buffer now:
 public void paint(Graphics g) {
  // Prepare image:
  prepareImageBuffer();
  // Then draw:
  g.drawImage(imageBuffer, 0, 0, this);        
 }
 public void prepareImageBuffer() {
  Dimension d = getSize();
  // Creat image buffer only if not already created:
  if (imageBuffer == null) { 
   imageBuffer = createImage(d.width, d.height);
  }
  // Get graphics context of image buffer:
  Graphics g = imageBuffer.getGraphics();
  // Clear previous image:
  g.setColor(Color.white);                      
  g.fillRect(0,0,d.width,d.height);             
  // Write new image:
  int x0 = d.width / 2;
  int y0 = d.height / 2;
  int pR = x0 / 5, pD = 2 * pR;
  int sR = x0 / 15, sD = 2 * sR;
  int orbitX = x0 / 2, orbitY = y0 / 6;
  double angle = Math.PI * position / 180;
  double sinAngle = Math.sin(angle);
  double cosAngle = Math.cos(angle);
  int dX = (int)(sinAngle * orbitX);
  int dY = (int)(cosAngle * orbitY);
  g.setColor(Color.blue);
  if (cosAngle <= 0) {
   g.fillOval(x0 + dX - sR, y0 + dY - sR, sD, sD);
  }
  g.setColor(Color.red);
  g.fillOval(x0 - pR, y0 - pR, pD, pD);
  g.setColor(Color.blue);
  if (cosAngle > 0) {
   g.fillOval(x0 + dX - sR, y0 + dY - sR, sD, sD);
}}}
