Site hosted by Angelfire.com: Build your free website today!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.URL;
import javax.swing.*;
import java.awt.Point;
import java.awt.geom.*;
import java.lang.Boolean;
import java.lang.Math.*;
import java.util.*;
import java.lang.Integer;

public class Tile extends JApplet implements ActionListener {
  protected static int [][] sides = new int [2000][8];
  protected static int [][] oldSides = new int [2000][8];
  protected static int [][] change = new int [4000][8];
  protected static int [][] match = new int [4000][2];
  protected static int [] used = new int [4000];
  protected static int [] howMany = new int [4000];
  protected static int translatemx;
  protected static int translatemy;
  protected static int translatenx;
  protected static int translateny;
  protected static int minm;
  protected static int maxm;
  protected static int minn;
  protected static int maxn;
  protected static int numberSides;
  protected static int oldNumberSides;
  protected static int zoomFactor=100;
  protected static String commandList;
  protected static int inBoxDivisor;
  protected static int numberSummed;
  protected static int vertsumx;
  protected static int vertsumy;
  protected static int numberChanges;
  protected static int xadd;
  protected static int yadd;
  protected static int undid;
  protected static int minPoly=3;
  protected static int maxPoly=99;
  protected JButton b1, b2, b3, b4, b5, b6, b7, b8;
  protected static final String DUAL = "dual";
  protected static final String TRI = "tri";
  protected static final String QUAD = "quad";
  protected static final String PENTA = "penta";
  protected static final String INSET = "inset";
  protected static final String SQUARE = "square";
  protected static final String HEXAGON = "hexagon";
  protected String dualButtonFilename = "images/dual.gif";
  protected String triButtonFilename = "images/tri.gif";
  protected String quadButtonFilename = "images/quad.gif";
  protected String pentaButtonFilename = "images/penta.gif";
  protected String insetButtonFilename = "images/inset.gif";
  protected String squareButtonFilename = "images/square.gif";
  protected String hexagonButtonFilename = "images/hexagon.gif";
  protected JTextField minTextField, maxTextField, zoomTextField;
  URL codeBase;
  DPanel drawPane;
  JPanel mainPane, buttonPane;

  //Hack to avoid ugly message about system event access check. (java 1)
  public Tile() {
    getRootPane().putClientProperty("defeatSystemEventQueueCheck",
                                     Boolean.TRUE);
  }

  public void actionPerformed(ActionEvent e) {
    minPoly = Integer.parseInt(minTextField.getText());
    maxPoly = Integer.parseInt(maxTextField.getText());
    zoomFactor = Integer.parseInt(zoomTextField.getText());
    if (e.getActionCommand().equals(DUAL)) { dual(); } else {
     if (e.getActionCommand().equals(TRI)) {
      tri();
      minPoly = 3;
      maxPoly = 99;
      minTextField.setText("3");
      maxTextField.setText("99");
       } else {
      if (e.getActionCommand().equals(QUAD)) {
       quad();
       minPoly = 3;
       maxPoly = 99;
       minTextField.setText("3");
       maxTextField.setText("99");
        } else {
       if (e.getActionCommand().equals(PENTA)) {
        penta();
        minPoly = 3;
        maxPoly = 99;
        minTextField.setText("3");
        maxTextField.setText("99");
        } else {
        if (e.getActionCommand().equals(INSET)) {
         inset();
         minPoly = 3;
         maxPoly = 99;
         minTextField.setText("3");
         maxTextField.setText("99");
         } else {
         if (e.getActionCommand().equals(SQUARE)) {
           square();
           minPoly = 3;
           maxPoly = 99;
           minTextField.setText("3");
           maxTextField.setText("99");
           zoomTextField.setText("100");
           } else {
           if (e.getActionCommand().equals(HEXAGON)) {
             hexagon();
             minPoly = 3;
             maxPoly = 99;
             minTextField.setText("3");
             maxTextField.setText("99");
             zoomTextField.setText("100");            
             } else {
             if (e.getActionCommand().equals("undo")) {
               restoreOldSides();
               minPoly = 3;
               maxPoly = 99;
               minTextField.setText("3");
               maxTextField.setText("99");
           }
          }
         }
        }
       }
      }
     }
    }
    repaint();

/*
for (int i = 0; i<numberSides; i++) {
System.out.print(""+sides[i][0]+" ");
System.out.print(""+sides[i][1]+" ");
System.out.print(""+sides[i][2]+" ");
System.out.print(""+sides[i][3]+" ");
System.out.print(""+sides[i][4]+" ");
System.out.print(""+sides[i][5]+" ");
System.out.print(""+sides[i][6]+" ");
System.out.print(""+sides[i][7]+"*");
}
System.out.println();
*/

  } // end actionPerformed

  private void sideToChange() {
// this loop splits sides array and puts in change array
    for (int i = 0;i<numberSides;i++) {
      change [2*i][0] = sides [i][0];
      change [2*i][1] = sides [i][1];
      change [2*i][2] = sides [i][2];
      change [2*i][3] = sides [i][3];
      change [2*i][6] = sides [i][6];
      change [2*i][7] = sides [i][7];
      change [2*i+1][0] = sides [i][4];
      change [2*i+1][1] = sides [i][5];
      change [2*i+1][2] = sides [i][6];
      change [2*i+1][3] = sides [i][7];
      change [2*i+1][6] = sides [i][2];
      change [2*i+1][7] = sides [i][3];
      change [2*i][4] = (int) Math.floor(
                           (change [2*i][2]+change[2*i][6])/2.0);
      change [2*i][5] = (int) Math.floor(
                           (change [2*i][3]+change[2*i][7])/2.0);
      change [2*i+1][4] = (int) Math.floor(
                           (change [2*i+1][2]+change[2*i+1][6])/2.0);
      change [2*i+1][5] = (int) Math.floor(
                           (change [2*i+1][3]+change[2*i+1][7])/2.0);
    } 
    numberChanges = 2 * numberSides;
  } // end sideToChange()

  private void storeOldSides() {
// this loop stores sides array in oldSides array
    oldNumberSides = numberSides;
    for (int i = 0;i<numberSides;i++) {
      oldSides [i][0] = sides [i][0];
      oldSides [i][1] = sides [i][1];
      oldSides [i][2] = sides [i][2];
      oldSides [i][3] = sides [i][3];
      oldSides [i][4] = sides [i][4];
      oldSides [i][5] = sides [i][5];
      oldSides [i][6] = sides [i][6];
      oldSides [i][7] = sides [i][7];
    } // end for loop
    undid = 0;
  } // end storeOldSides()

  private void recenter() {
    // this loop moves the halves to have their center in the box
    for (int i = 0;i<numberChanges;i++) {
      used [i] = 0;
      latticePlace(change [i][0], change[i][1]);
      change[i][0] += xadd;
      change[i][1] += yadd;
      change[i][2] += xadd;
      change[i][3] += yadd;
      change[i][4] += xadd;
      change[i][5] += yadd;
      change[i][6] += xadd;
      change[i][7] += yadd;      
    } // end half moving to box loop
    // this loop moves the centers only
    for (int i = 0; i< numberChanges; i++) {
      if (used [i] == 0) {
        int currentx = change [i][0];
        int currenty = change [i][1];
        vertsumx = change [i][2] + change [i][6];
        vertsumy = change [i][3] + change [i][7];
        numberSummed = 1;
        for (int j = i+1;j <numberChanges;j++) {
          if ((currentx == change [j][0]) && (currenty == change [j][1])) {
            vertsumx += change[j][2] + change[j][6];
            vertsumy += change[j][3] + change[j][7];
            used [j] = 1;
            numberSummed++;
          } // end if
        } // end for j loop
        int newCurrentx = (int) Math.floor(vertsumx / 2.0/ numberSummed);
        int newCurrenty = (int) Math.floor(vertsumy / 2.0/ numberSummed);
        change [i][0] = newCurrentx;
        change [i][1] = newCurrenty;

        for (int j = i;j<numberChanges;j++) {
          if ((currentx == change [j][0]) && (currenty == change [j][1])) {
            change [j][0] = newCurrentx;
            change [j][1] = newCurrenty;
          } // end if
        } // end for j loop
      } // end if
    } // end center moving loop

    // this loop moves the midpoints back to the box if needed.
    for (int k = 0; k<numberChanges;k++) {
      latticePlace(change [k][4], change[k][5]);
      change[k][0] += xadd;
      change[k][1] += yadd;
      change[k][2] += xadd;
      change[k][3] += yadd;
      change[k][4] += xadd;
      change[k][5] += yadd;      
      change[k][6] += xadd;
      change[k][7] += yadd;      
    } // end move midpoints back loop
  } // recenter()

  private void matchCenter() {
    // this loop copies centers to match after translating to the box
    for (int i = 0;i < numberChanges;i++) {
      used [i] = 0;
      latticePlace(change [i][0], change[i][1]);
      match[i][0] = change [i][0] + xadd;
      match[i][1] = change [i][1] + yadd;
    } // end copy centers to match
    // this loop counts how many of each center
    for (int i = 0; i <  numberChanges; i++) {
      if (used [i] == 0) {
        int currentx = match [i][0];
        int currenty = match [i][1];
        numberSummed = 1;
        for (int j = i+1;j  < numberChanges;j++) {
          if ((currentx == match [j][0]) && (currenty == match [j][1])) 
          {
            used [j] = 1;
            numberSummed++;
          } // end if
        } // end for j loop
        howMany [i] = numberSummed;
        for (int j = i;j < numberChanges;j++) {
          if ((currentx == match [j][0]) && (currenty == match [j][1])) 
          {
            howMany [j] = numberSummed;
          } // end if
        } // end for j loop
      } // end if
    } // end center counting loop
  } // matchCenter()

  private void changeToSide() {
    // this loop puts the change array values back in the sides array.
    numberSides = 0;
    appendChangeToSide();
  }

  private void appendChangeToSide() {
    for (int i = 0; i< numberChanges;i++){
      used [i] = 0;
    }
    for (int i = 0; i<numberChanges;i++) {
      if (used [i] != 1) {
        for (int j = i+1; j<numberChanges; j++) {
          if ((change [i][4] == change [j][4]) && 
              (change [i][5] == change [j][5])) {
            sides [numberSides][0] = change [i][0];
            sides [numberSides][1] = change [i][1];
            sides [numberSides][2] = change [i][2];
            sides [numberSides][3] = change [i][3];
            sides [numberSides][4] = change [j][0];
            sides [numberSides][5] = change [j][1];
            sides [numberSides][6] = change [i][6];
            sides [numberSides][7] = change [i][7];
            numberSides++;
            used [j] = 1;
            j = numberChanges+1; // to stop the loop
          } // end if
        } // end for j loop
      } // end if
    } // end loop to put change [][] into sides [][]
  } // end appendChangeToSide()
  
  private void restoreOldSides() {
    if (commandList.endsWith("d")) {
     dual();
    } else {
      if (undid == 0) {
      numberSides = oldNumberSides;
      for (int i = 0;i<numberSides;i++) {
       sides [i][0] = oldSides [i][0];
       sides [i][1] = oldSides [i][1];
       sides [i][2] = oldSides [i][2];
       sides [i][3] = oldSides [i][3];
       sides [i][4] = oldSides [i][4];
       sides [i][5] = oldSides [i][5];
       sides [i][6] = oldSides [i][6];
       sides [i][7] = oldSides [i][7];
      } // end loop
     if (commandList.length() >1) {
      commandList = commandList.substring(0,commandList.length()-1);
      if (commandList.endsWith(")")) {
       while (! (commandList.endsWith("("))) {
        commandList = commandList.substring(0,commandList.length()-1);
        }
       commandList = commandList.substring(0,commandList.length()-1);
       }
      }
     undid = 1;
     } // end undid loop
    } // end not end in "d"
  } // end restoreOldSides()
   
  private void dual() {
    sideToChange();
    recenter();
    changeToSide();

    // this actually does the dual
    for (int i = 0; i<numberSides;i++) {
      int first = sides [i][0];
      int second = sides [i][1];
      for (int j = 0;j<6;j++) {
        sides [i][j] = sides [i][j+2];
      } 
      sides [i][6] = first;
      sides [i][7] = second;
      latticePlace(((sides[i][2] + sides [i][6])/2.0),
                   ((sides[i][3] + sides [i][7])/2.0));
      for (int j = 0; j <4; j++) {
        sides [i][2*j] += xadd;
        sides [i][2*j+1] += yadd;
      } 
    } // end actual dual loop
    if (commandList.endsWith("d")) {
     commandList = commandList.substring(0,commandList.length()-1);
    } else {
     commandList = commandList + "d";
    }
  } // end dual()

  private void tri() {
    storeOldSides();
    sideToChange();

    // like recenter but with tri thrown in.
    // this loop moves the halves to have their center in the box
    for (int i = 0;i<numberChanges;i++) {
      used [i] = 0;
      latticePlace(change [i][0], change[i][1]);
      change[i][0] += xadd;
      change[i][1] += yadd;
      change[i][2] += xadd;
      change[i][3] += yadd;
      change[i][4] += xadd;
      change[i][5] += yadd;
      change[i][6] += xadd;
      change[i][7] += yadd;      
    } // end half moving to box loop
    int addedNumberChanges = numberChanges;
    // this loop moves the centers only
    for (int i = 0; i< numberChanges; i++) {
      if (used [i] == 0) {
        int currentx = change [i][0];
        int currenty = change [i][1];
        vertsumx = change [i][2] + change [i][6];
        vertsumy = change [i][3] + change [i][7];
        numberSummed = 1;
        for (int j = i+1;j <numberChanges;j++) {
          if ((currentx == change [j][0]) && (currenty == change [j][1])) {
            vertsumx += change[j][2] + change[j][6];
            vertsumy += change[j][3] + change[j][7];
            used [j] = 1;
            numberSummed++;
          } // end if
        } // end for j loop
        int newCurrentx = (int) Math.floor(vertsumx / 2.0/ numberSummed);
        int newCurrenty = (int) Math.floor(vertsumy / 2.0/ numberSummed);
        change [i][0] = newCurrentx;
        change [i][1] = newCurrenty;
        for (int j = i+1;j<numberChanges;j++) {
          if ((currentx == change [j][0]) && (currenty == change [j][1])) {
            change [j][0] = newCurrentx;
            change [j][1] = newCurrenty;
          } // end if
        } // end for j loop (this was the recentering...)

        // this will triangulate only the ones we should.
        if ((numberSummed >= minPoly) && (numberSummed <= maxPoly)) {
          for (int j = i;j<numberChanges;j++) {
            if ((newCurrentx == change [j][0]) &&
                (newCurrenty == change [j][1])) {
              int topcenterx = (int)
                  Math.floor((change[j][0]+change[j][2]+change[j][6])/3.0);
              int topcentery = (int)
                  Math.floor((change[j][1]+change[j][3]+change[j][7])/3.0);

              // first
              int oldx = (int) Math.floor((change[j][0]+change[j][2])/2.0);
              int oldy = (int) Math.floor((change[j][1]+change[j][3])/2.0);
              latticePlace((double) oldx, (double) oldy);
              change [addedNumberChanges][0] = topcenterx + xadd;
              change [addedNumberChanges][1] = topcentery + yadd;
              change [addedNumberChanges][2] = change [j][0] + xadd;
              change [addedNumberChanges][3] = change [j][1] + yadd;
              change [addedNumberChanges][4] = oldx + xadd;
              change [addedNumberChanges][5] = oldy + yadd;
              change [addedNumberChanges][6] = change[j][2] + xadd;
              change [addedNumberChanges][7] = change[j][3] + yadd;
              addedNumberChanges++;

              //second
              oldx = (int) Math.floor((change[j][0] + change [j][6])/2.0);
              oldy = (int) Math.floor((change[j][1] + change [j][7])/2.0);
              latticePlace((double) oldx, (double) oldy);
              change [addedNumberChanges][0] = topcenterx + xadd;
              change [addedNumberChanges][1] = topcentery + yadd;
              change [addedNumberChanges][2] = change [j][6] + xadd;
              change [addedNumberChanges][3] = change [j][7] + yadd;
              change [addedNumberChanges][4] = oldx + xadd;
              change [addedNumberChanges][5] = oldy + yadd;
              change [addedNumberChanges][6] = change[j][0] + xadd;
              change [addedNumberChanges][7] = change[j][1] + yadd;
              addedNumberChanges++;

              //third
              change [j][0]=topcenterx;
              change [j][1]=topcentery;
            } // end if (only change the right ones
          } // end for j loop
        } // end if to triangulate
      } // end if not used
    } // end center moving loop
    numberChanges = addedNumberChanges;
    // this loop moves the midpoints back to the box if needed.
    for (int k = 0; k<numberChanges;k++) {
      latticePlace(change [k][4], change[k][5]);
      change[k][0] += xadd;
      change[k][1] += yadd;
      change[k][2] += xadd;
      change[k][3] += yadd;
      change[k][4] += xadd;
      change[k][5] += yadd;      
      change[k][6] += xadd;
      change[k][7] += yadd;      
    } // end move midpoints back loop
    changeToSide();
    if ((minPoly !=3) || (maxPoly != 99)) {
      commandList = commandList + "("+minPoly+"-"+maxPoly+")t";
    } else {
      commandList = commandList + "t";
    }
  } // end tri()

  private void quad() {
    storeOldSides();
    sideToChange();
    recenter();
    matchCenter();
    int addedNumberChanges = numberChanges;
    for (int i = 0; i < numberChanges; i +=2) {
      if ((howMany[i] >= minPoly) && (howMany[i]  <= maxPoly)) {
         // this is if the first vertex is right.
         if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
           { // this is if both vertices are right..
           change[i][6] = change[i][2];
           change[i][7] = change[i][3];
           change[i][2] = change[i][0];
           change[i][3] = change[i][1];
           change[i][0] = change[i][4];
           change[i][1] = change[i][5];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);
           change[i+1][6] = change[i+1][2];
           change[i+1][7] = change[i+1][3];
           change[i+1][2] = change[i+1][0];
           change[i+1][3] = change[i+1][1];
           change[i+1][0] = change[i+1][4];
           change[i+1][1] = change[i+1][5];
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           change[addedNumberChanges][0] = change[i][0];
           change[addedNumberChanges][1] = change[i][1];
           change[addedNumberChanges][2] = change[i+1][6];
           change[addedNumberChanges][3] = change[i+1][7];
           change[addedNumberChanges][6] = change[i][2];
           change[addedNumberChanges][7] = change[i][3];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;
           change[addedNumberChanges][0] = change[i][0];
           change[addedNumberChanges][1] = change[i][1];
           change[addedNumberChanges][2] = change[i][6];
           change[addedNumberChanges][3] = change[i][7];
           change[addedNumberChanges][6] = change[i+1][2];
           change[addedNumberChanges][7] = change[i+1][3];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;
           } // end both vertices right
         else
           { // this is if only the first vertex is right..
           change[i][6] = change[i][2];
           change[i][7] = change[i][3];
           change[i][2] = change[i][0];
           change[i][3] = change[i][1];
           change[i][0] = change[i+1][0];
           change[i][1] = change[i+1][1];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);
           // change[i+1][0 - 3] don't change;
           change[i+1][6] = change[i][2];
           change[i+1][7] = change[i][3];
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           } // end first vertex only right
         } // end first vertex right
       else
         { // this is if the first vertex is wrong
         if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
           { // this is if only second vertex is right..
           change[i+1][6] = change[i+1][2];
           change[i+1][7] = change[i+1][3];
           change[i+1][2] = change[i+1][0];
           change[i+1][3] = change[i+1][1];
           change[i+1][0] = change[i][0];
           change[i+1][1] = change[i][1];
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           // change[i][0 - 3] don't change;
           change[i][6] = change[i+1][2];
           change[i][7] = change[i+1][3];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);
           } // end second vertex only right
          // if both wrong - do nothing
         } // end first vertex wrong
       } // end i loop through numberChanges  
    numberChanges = addedNumberChanges;
    // this loop moves the midpoints back to the box if needed.
    for (int k = 0; k < numberChanges;k++) {
      latticePlace(change [k][4], change[k][5]);
      change[k][0] += xadd;
      change[k][1] += yadd;
      change[k][2] += xadd;
      change[k][3] += yadd;
      change[k][4] += xadd;
      change[k][5] += yadd;      
      change[k][6] += xadd;
      change[k][7] += yadd;      
    } // end move midpoints back loop
    changeToSide();
    if ((minPoly !=3) || (maxPoly != 99)) {
      commandList = commandList + "("+minPoly+"-"+maxPoly+")q";
    } else {
      commandList = commandList + "q";
    }
  } // end quad()

  private void penta() {
    storeOldSides();
    sideToChange();
    recenter();
    matchCenter();

    numberSides = 0;
    for (int i = 0; i < numberChanges;i += 2) {
      if ((howMany[i] >= minPoly) && (howMany[i]  <= maxPoly))
      { // this is if the first vertex is right.
        if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
        { // this is if both vertices are right..
          int topvertexx = (int) Math.floor((change[i][0]+
              2*change[i][2]+change[i][6])/4.0);
          int topvertexy = (int) Math.floor((change[i][1]+
              2*change[i][3]+change[i][7])/4.0);
          int botvertexx = (int) Math.floor((change[i+1][0]+
              change[i][2]+2*change[i][6])/4.0);
          int botvertexy = (int) Math.floor((change[i+1][1]+
              change[i][3]+2*change[i][7])/4.0);
          int acenterx = (int) Math.floor((change[i][0]+change[i][2])/2.0);
          int acentery = (int) Math.floor((change[i][1]+change[i][3])/2.0);
          int bcenterx = (int) Math.floor((change[i+1][0]+change[i][2])/2.0);
          int bcentery = (int) Math.floor((change[i+1][1]+change[i][3])/2.0);
          int ccenterx = (int) Math.floor((change[i+1][0]+change[i][6])/2.0);
          int ccentery = (int) Math.floor((change[i+1][1]+change[i][7])/2.0);
          int dcenterx = (int) Math.floor((change[i][0]+change[i][6])/2.0);
          int dcentery = (int) Math.floor((change[i][1]+change[i][7])/2.0);

          // first
          latticePlace(((change[i][0] + topvertexx)/2.0),
                ((change[i][1] + topvertexy)/2.0));
          sides [numberSides][0] = dcenterx + xadd;
          sides [numberSides][1] = dcentery + yadd;
          sides [numberSides][2] = change [i][0] + xadd;
          sides [numberSides][3] = change [i][1] + yadd;
          sides [numberSides][4] = acenterx + xadd;
          sides [numberSides][5] = acentery + yadd;
          sides [numberSides][6] = topvertexx + xadd;
          sides [numberSides][7] = topvertexy + yadd;
          numberSides++;

          // second
          latticePlace(((change[i][2] + topvertexx)/2.0),
                ((change[i][3] + topvertexy)/2.0));
          sides [numberSides][0] = acenterx + xadd;
          sides [numberSides][1] = acentery + yadd;
          sides [numberSides][2] = change [i][2] + xadd;
          sides [numberSides][3] = change [i][3] + yadd;
          sides [numberSides][4] = bcenterx + xadd;
          sides [numberSides][5] = bcentery + yadd;
          sides [numberSides][6] = topvertexx + xadd;
          sides [numberSides][7] = topvertexy + yadd;
          numberSides++;

          // third
          latticePlace(((botvertexx + topvertexx)/2.0),
                ((botvertexy + topvertexy)/2.0));
          sides [numberSides][0] = dcenterx + xadd;
          sides [numberSides][1] = dcentery + yadd;
          sides [numberSides][2] = topvertexx + xadd;
          sides [numberSides][3] = topvertexy + yadd;
          sides [numberSides][4] = bcenterx + xadd;
          sides [numberSides][5] = bcentery + yadd;
          sides [numberSides][6] = botvertexx + xadd;
          sides [numberSides][7] = botvertexy + yadd;
          numberSides++;

          // fourth
          latticePlace(((change[i+1][0] + botvertexx)/2.0),
                ((change[i+1][1] + botvertexy)/2.0));
          sides [numberSides][0] = bcenterx + xadd;
          sides [numberSides][1] = bcentery + yadd;
          sides [numberSides][2] = change [i+1][0] + xadd;
          sides [numberSides][3] = change [i+1][1] + yadd;
          sides [numberSides][4] = ccenterx + xadd;
          sides [numberSides][5] = ccentery + yadd;
          sides [numberSides][6] = botvertexx + xadd;
          sides [numberSides][7] = botvertexy + yadd;
          numberSides++;

          // fifth
          latticePlace(((change[i][6] + botvertexx)/2.0),
                ((change[i][7] + botvertexy)/2.0));
          sides [numberSides][0] = ccenterx + xadd;
          sides [numberSides][1] = ccentery + yadd;
          sides [numberSides][2] = change [i][6] + xadd;
          sides [numberSides][3] = change [i][7] + yadd;
          sides [numberSides][4] = dcenterx + xadd;
          sides [numberSides][5] = dcentery + yadd;
          sides [numberSides][6] = botvertexx + xadd;
          sides [numberSides][7] = botvertexy + yadd;
          numberSides++;
        } // end both vertices right
        else
        { // this is if only the first vertex is right..
          int midvertexx = (int) Math.floor((change[i][2]+
              change[i][6])/2.0);
          int midvertexy = (int) Math.floor((change[i][3]+
              change[i][7])/2.0);
          int acenterx = (int) Math.floor((change[i][0]+change[i][2])/2.0);
          int acentery = (int) Math.floor((change[i][1]+change[i][3])/2.0);
          int dcenterx = (int) Math.floor((change[i][0]+change[i][6])/2.0);
          int dcentery = (int) Math.floor((change[i][1]+change[i][7])/2.0);

          // first
          latticePlace(((change[i][0] + midvertexx)/2.0),
                ((change[i][1] + midvertexy)/2.0));
          sides [numberSides][0] = dcenterx + xadd;
          sides [numberSides][1] = dcentery + yadd;
          sides [numberSides][2] = change [i][0] + xadd;
          sides [numberSides][3] = change [i][1] + yadd;
          sides [numberSides][4] = acenterx + xadd;
          sides [numberSides][5] = acentery + yadd;
          sides [numberSides][6] = midvertexx + xadd;
          sides [numberSides][7] = midvertexy + yadd;
          numberSides++;

          // second
          latticePlace(((change[i][2] + midvertexx)/2.0),
                ((change[i][3] + midvertexy)/2.0));
          sides [numberSides][0] = acenterx + xadd;
          sides [numberSides][1] = acentery + yadd;
          sides [numberSides][2] = change [i][2] + xadd;
          sides [numberSides][3] = change [i][3] + yadd;
          sides [numberSides][4] = change [i+1][0] + xadd;
          sides [numberSides][5] = change [i+1][1] + yadd;
          sides [numberSides][6] = midvertexx + xadd;
          sides [numberSides][7] = midvertexy + yadd;
          numberSides++;

          // third
          latticePlace(((change[i][6] + midvertexx)/2.0),
                ((change[i][7] + midvertexy)/2.0));
          sides [numberSides][0] = dcenterx + xadd;
          sides [numberSides][1] = dcentery + yadd;
          sides [numberSides][2] = midvertexx + xadd;
          sides [numberSides][3] = midvertexy + yadd;
          sides [numberSides][4] = change [i+1][0] + xadd;
          sides [numberSides][5] = change [i+1][1] + yadd;
          sides [numberSides][6] = change [i][6] + xadd;
          sides [numberSides][7] = change [i][7] + yadd;

          numberSides++;
        } // end first vertex only right
      } // end first vertex right
      else
      { // this is if the first vertex is wrong
        if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
        { // this is if only second vertex is right..
          int midvertexx = (int) Math.floor((change[i][2]+
              change[i][6])/2.0);
          int midvertexy = (int) Math.floor((change[i][3]+
              change[i][7])/2.0);
          int bcenterx = (int) Math.floor((change[i+1][0]+change[i][2])/2.0);
          int bcentery = (int) Math.floor((change[i+1][1]+change[i][3])/2.0);
          int ccenterx = (int) Math.floor((change[i+1][0]+change[i][6])/2.0);
          int ccentery = (int) Math.floor((change[i+1][1]+change[i][7])/2.0);

          // first
          latticePlace(((change[i+1][0] + midvertexx)/2.0),
                ((change[i+1][1] + midvertexy)/2.0));
          sides [numberSides][0] = bcenterx + xadd;
          sides [numberSides][1] = bcentery + yadd;
          sides [numberSides][2] = change [i+1][0] + xadd;
          sides [numberSides][3] = change [i+1][1] + yadd;
          sides [numberSides][4] = ccenterx + xadd;
          sides [numberSides][5] = ccentery + yadd;
          sides [numberSides][6] = midvertexx + xadd;
          sides [numberSides][7] = midvertexy + yadd;
          numberSides++;

          // second
          latticePlace(((change[i][6] + midvertexx)/2.0),
                ((change[i][7] + midvertexy)/2.0));
          sides [numberSides][0] = ccenterx + xadd;
          sides [numberSides][1] = ccentery + yadd;
          sides [numberSides][2] = change [i][6] + xadd;
          sides [numberSides][3] = change [i][7] + yadd;
          sides [numberSides][4] = change [i][0] + xadd;
          sides [numberSides][5] = change [i][1] + yadd;
          sides [numberSides][6] = midvertexx + xadd;
          sides [numberSides][7] = midvertexy + yadd;
          numberSides++;

          // third
          latticePlace(((change[i][2] + midvertexx)/2.0),
                ((change[i][3] + midvertexy)/2.0));
          sides [numberSides][0] = bcenterx + xadd;
          sides [numberSides][1] = bcentery + yadd;
          sides [numberSides][2] = midvertexx + xadd;
          sides [numberSides][3] = midvertexy + yadd;
          sides [numberSides][4] = change [i][0] + xadd;
          sides [numberSides][5] = change [i][1] + yadd;
          sides [numberSides][6] = change [i][2] + xadd;
          sides [numberSides][7] = change [i][3] + yadd;
          numberSides++;
        } // end second vertex only right
        else
        { // this is if both are wrong
          latticePlace(((change[i][6] + change[i][2])/2.0),
                       ((change[i][7] + change[i][3])/2.0));
          sides [numberSides][0] = change[i][0] + xadd;
          sides [numberSides][1] = change[i][1] + yadd;
          sides [numberSides][2] = change[i][2] + xadd;
          sides [numberSides][3] = change[i][3] + yadd;
          sides [numberSides][4] = change [i+1][0] + xadd;
          sides [numberSides][5] = change [i+1][1] + yadd;
          sides [numberSides][6] = change [i][6] + xadd;
          sides [numberSides][7] = change [i][7] + yadd;
          numberSides++;
        } // end both wrong
      } // end first vertex wrong
    } // end i loop through numberChanges  
    if ((minPoly !=3) || (maxPoly != 99)) {
      commandList = commandList + "("+minPoly+"-"+maxPoly+")p";
    } else {
      commandList = commandList + "p";
    }
  } // end penta

  private void inset() {
    storeOldSides();
    sideToChange();
    recenter();
    matchCenter();
    int addedNumberChanges = numberChanges;
    for (int i = 0; i < numberChanges; i +=2) {
      if ((howMany[i] >= minPoly) && (howMany[i]  <= maxPoly)) {
         // this is if the first vertex is right.
         if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
           { // this is if both vertices are right..
           int acenterx = (int) Math.floor((change[i][0]+change[i][2])/2.0);
           int acentery = (int) Math.floor((change[i][1]+change[i][3])/2.0);
           int bcenterx = (int) Math.floor((change[i+1][0]+change[i][2])/2.0);
           int bcentery = (int) Math.floor((change[i+1][1]+change[i][3])/2.0);
           int ccenterx = (int) Math.floor((change[i+1][0]+change[i][6])/2.0);
           int ccentery = (int) Math.floor((change[i+1][1]+change[i][7])/2.0);
           int dcenterx = (int) Math.floor((change[i][0]+change[i][6])/2.0);
           int dcentery = (int) Math.floor((change[i][1]+change[i][7])/2.0);

           // first
           change[addedNumberChanges][0] = change[i][2];
           change[addedNumberChanges][1] = change[i][3];
           change[addedNumberChanges][2] = bcenterx;
           change[addedNumberChanges][3] = bcentery;
           change[addedNumberChanges][6] = acenterx;
           change[addedNumberChanges][7] = acentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // second
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = acenterx;
           change[addedNumberChanges][3] = acentery;
           change[addedNumberChanges][6] = bcenterx;
           change[addedNumberChanges][7] = bcentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // third
           change[addedNumberChanges][0] = change[i][6];
           change[addedNumberChanges][1] = change[i][7];
           change[addedNumberChanges][2] = dcenterx;
           change[addedNumberChanges][3] = dcentery;
           change[addedNumberChanges][6] = ccenterx;
           change[addedNumberChanges][7] = ccentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fourth
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = ccenterx;
           change[addedNumberChanges][3] = ccentery;
           change[addedNumberChanges][6] = dcenterx;
           change[addedNumberChanges][7] = dcentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fifth
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = dcenterx;
           change[addedNumberChanges][3] = dcentery;
           change[addedNumberChanges][6] = change[i][0];
           change[addedNumberChanges][7] = change[i][1];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // sixth
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = change[i+1][0];
           change[addedNumberChanges][3] = change[i+1][1];
           change[addedNumberChanges][6] = ccenterx;
           change[addedNumberChanges][7] = ccentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // seventh
           change[i][6] = acenterx;
           change[i][7] = acentery;
           change[i][2] = change[i][0];
           change[i][3] = change[i][1];
           change[i][0] = change[i][4];
           change[i][1] = change[i][5];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);

           // eighth
           change[i+1][6] = change[i+1][0];
           change[i+1][7] = change[i+1][1];
           change[i+1][2] = bcenterx;
           change[i+1][3] = bcentery;
           change[i+1][0] = change[i+1][4];
           change[i+1][1] = change[i+1][5];
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           } // end both vertices right
         else
           { // this is if only the first vertex is right..
           int acenterx = (int) Math.floor((change[i][0]+change[i][2])/2.0);
           int acentery = (int) Math.floor((change[i][1]+change[i][3])/2.0);
           int dcenterx = (int) Math.floor((change[i][0]+change[i][6])/2.0);
           int dcentery = (int) Math.floor((change[i][1]+change[i][7])/2.0);

           // first
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = change[i][0];
           change[addedNumberChanges][3] = change[i][1];
           change[addedNumberChanges][6] = acenterx;
           change[addedNumberChanges][7] = acentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // second
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = dcenterx;
           change[addedNumberChanges][3] = dcentery;
           change[addedNumberChanges][6] = change[i][0];
           change[addedNumberChanges][7] = change[i][1];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // third
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = acenterx;
           change[addedNumberChanges][3] = acentery;
           change[addedNumberChanges][6] = change[i+1][0];
           change[addedNumberChanges][7] = change[i+1][1];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fourth
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = change[i+1][0];
           change[addedNumberChanges][3] = change[i+1][1];
           change[addedNumberChanges][6] = dcenterx;
           change[addedNumberChanges][7] = dcentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fifth
           change[i][0] = change[i][6];
           change[i][1] = change[i][7];
           change[i][2] = dcenterx;
           change[i][3] = dcentery;
           change[i][6] = change[i+1][0];
           change[i][7] = change[i+1][1];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);

           // sixth
           change[i+1][2] = change[i+1][0];
           change[i+1][3] = change[i+1][1];
           change[i+1][0] = change[i+1][6];
           change[i+1][1] = change[i+1][7];
           change[i+1][6] = acenterx;
           change[i+1][7] = acentery;
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           } // end first vertex only right
         } // end first vertex right
       else
         { // this is if the first vertex is wrong
         if ((howMany[i+1]>= minPoly) && (howMany[i+1] <= maxPoly)) 
           { // this is if only second vertex is right..
           int bcenterx = (int) Math.floor((change[i+1][0]+change[i][2])/2.0);
           int bcentery = (int) Math.floor((change[i+1][1]+change[i][3])/2.0);
           int ccenterx = (int) Math.floor((change[i+1][0]+change[i][6])/2.0);
           int ccentery = (int) Math.floor((change[i+1][1]+change[i][7])/2.0);

           // first
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = change[i][0];
           change[addedNumberChanges][3] = change[i][1];
           change[addedNumberChanges][6] = bcenterx;
           change[addedNumberChanges][7] = bcentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // second
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = ccenterx;
           change[addedNumberChanges][3] = ccentery;
           change[addedNumberChanges][6] = change[i][0];
           change[addedNumberChanges][7] = change[i][1];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // third
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = bcenterx;
           change[addedNumberChanges][3] = bcentery;
           change[addedNumberChanges][6] = change[i+1][0];
           change[addedNumberChanges][7] = change[i+1][1];
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fourth
           change[addedNumberChanges][0] = change[i][4];
           change[addedNumberChanges][1] = change[i][5];
           change[addedNumberChanges][2] = change[i+1][0];
           change[addedNumberChanges][3] = change[i+1][1];
           change[addedNumberChanges][6] = ccenterx;
           change[addedNumberChanges][7] = ccentery;
           change[addedNumberChanges][4] = (int) Math.floor(
                           (change [addedNumberChanges][2]+
			    change[addedNumberChanges][6])/2.0);
           change[addedNumberChanges][5] = (int) Math.floor(
                           (change [addedNumberChanges][3]+
                            change[addedNumberChanges][7])/2.0);
           addedNumberChanges++;

           // fifth
           change[i+1][0] = change[i][6];
           change[i+1][1] = change[i][7];
           change[i+1][2] = change[i][0];
           change[i+1][3] = change[i][1];
           change[i+1][6] = ccenterx;
           change[i+1][7] = ccentery;
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);

           // sixth
           change[i][6] = change[i][0];
           change[i][7] = change[i][1];
           change[i][0] = change[i][2];
           change[i][1] = change[i][3];
           change[i][2] = bcenterx;
           change[i][3] = bcentery;
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);

           } // end second vertex only right
         else
           { // if both wrong - make dual
           change[i][6] = change[i][0];
           change[i][7] = change[i][1];
           change[i][0] = change[i][2];
           change[i][1] = change[i][3];
           change[i][2] = change[i+1][0];
           change[i][3] = change[i+1][1];
           change[i][4] = (int) Math.floor(
                           (change [i][2]+change[i][6])/2.0);
           change[i][5] = (int) Math.floor(
                           (change [i][3]+change[i][7])/2.0);

           change[i+1][6] = change[i+1][0];
           change[i+1][7] = change[i+1][1];
           change[i+1][0] = change[i+1][2];
           change[i+1][1] = change[i+1][3];
           change[i+1][2] = change[i][6];
           change[i+1][3] = change[i][7];
           change[i+1][4] = (int) Math.floor(
                           (change [i+1][2]+change[i+1][6])/2.0);
           change[i+1][5] = (int) Math.floor(
                           (change [i+1][3]+change[i+1][7])/2.0);
           } // end both wrong
         } // end first vertex wrong
       } // end i loop through numberChanges  
    numberChanges = addedNumberChanges;
    // this loop moves the midpoints back to the box if needed.
    for (int k = 0; k < numberChanges;k++) {
      latticePlace(change [k][4], change[k][5]);
      change[k][0] += xadd;
      change[k][1] += yadd;
      change[k][2] += xadd;
      change[k][3] += yadd;
      change[k][4] += xadd;
      change[k][5] += yadd;      
      change[k][6] += xadd;
      change[k][7] += yadd;      
    } // end move midpoints back loop

    recenter();
    changeToSide();
    // dual loop
    for (int i = 0; i<numberSides;i++) {
      int first = sides [i][0];
      int second = sides [i][1];
      for (int j = 0;j<6;j++) {
        sides [i][j] = sides [i][j+2];
      } 
      sides [i][6] = first;
      sides [i][7] = second;
      latticePlace(((sides[i][2] + sides [i][6])/2.0),
                   ((sides[i][3] + sides [i][7])/2.0));
      for (int j = 0; j <4; j++) {
        sides [i][2*j] += xadd;
        sides [i][2*j+1] += yadd;
      } 
    } // end dual loop

    sideToChange();
    recenter();
    changeToSide();




    if ((minPoly !=3) || (maxPoly != 99)) {
      commandList = commandList + "("+minPoly+"-"+maxPoly+")i";
    } else {
      commandList = commandList + "i";
    }
  } // end inset

    public void square() {
      translatemx = 200;
      translatemy = 0;
      translatenx = 0;
      translateny = 200;
      minm = -2;
      maxm = 3;
      minn = -1;
      maxn = 4;
      numberSides = 2;
      zoomFactor = 100;
      commandList = new String("s");
      inBoxDivisor = (translatenx * translatemy) - (translatemx * translateny);
  
      sides [0][0] = 101;
      sides [0][1] = 121;
      sides [0][2] = 1;
      sides [0][3] = 221;
      sides [0][4] = -99;
      sides [0][5] = 121;
      sides [0][6] = 1;
      sides [0][7] = 21;
      sides [1][0] = 101;
      sides [1][1] = 121;
      sides [1][2] = 1;
      sides [1][3] = 21;
      sides [1][4] = 101;
      sides [1][5] = -79;
      sides [1][6] = 201;
      sides [1][7] = 21;
      storeOldSides();
    } // end square

    public void hexagon() {
      translatemx = 200;
      translatemy = 0;
      translatenx = 100;
      translateny = 174;
      minm = -3;
      maxm = 4;
      minn = -1;
      maxn = 3;
      numberSides = 3;
      zoomFactor = 100;
      commandList = new String("h");
      inBoxDivisor = (translatenx * translatemy) - (translatemx * translateny);
  
      sides [0][0] = 101;
      sides [0][1] = 195;
      sides [0][2] = 1;
      sides [0][3] = 135;
      sides [0][4] = 1;
      sides [0][5] = 21;
      sides [0][6] = 101;
      sides [0][7] = 79;
      sides [1][0] = 1;
      sides [1][1] = 21;
      sides [1][2] = 101;
      sides [1][3] = -39;
      sides [1][4] = 201;
      sides [1][5] = 21;
      sides [1][6] = 101;
      sides [1][7] = 79;
      sides [2][0] = 201;
      sides [2][1] = 21;
      sides [2][2] = 201;
      sides [2][3] = 135;
      sides [2][4] = 101;
      sides [2][5] = 195;
      sides [2][6] = 101;
      sides [2][7] = 79;
      storeOldSides();
    } // end hexagon

    public void init() {
      square();
      setContentPane(makeContentPane());
    }

    public Container makeContentPane() {

        ImageIcon dualButtonIcon;
        ImageIcon triButtonIcon;
        ImageIcon quadButtonIcon;
        ImageIcon pentaButtonIcon;
        ImageIcon insetButtonIcon;
        ImageIcon squareButtonIcon;
        ImageIcon hexagonButtonIcon;

        URL dualButtonURL = getURL(dualButtonFilename);
        URL triButtonURL = getURL(triButtonFilename);
        URL quadButtonURL = getURL(quadButtonFilename);
        URL pentaButtonURL = getURL(pentaButtonFilename);
        URL insetButtonURL = getURL(insetButtonFilename);
        URL squareButtonURL = getURL(squareButtonFilename);
        URL hexagonButtonURL = getURL(hexagonButtonFilename);

        dualButtonIcon = new ImageIcon(dualButtonURL);
        triButtonIcon = new ImageIcon(triButtonURL);
        quadButtonIcon = new ImageIcon(quadButtonURL);     
        pentaButtonIcon = new ImageIcon(pentaButtonURL);     
        insetButtonIcon = new ImageIcon(insetButtonURL);     
        squareButtonIcon = new ImageIcon(squareButtonURL);     
        hexagonButtonIcon = new ImageIcon(hexagonButtonURL);     

        b1 = new JButton("Dual", dualButtonIcon);
        b1.setPreferredSize(new Dimension(120,40));
        b1.setVerticalTextPosition(AbstractButton.CENTER);
        b1.setHorizontalTextPosition(AbstractButton.LEFT);
        b1.setHorizontalAlignment(AbstractButton.RIGHT);
        b1.setMnemonic(KeyEvent.VK_D);
        b1.setActionCommand(DUAL);
        b1.addActionListener(this);
        b1.setToolTipText("This will make the dual of the tiling.");

        b2 = new JButton("Tri", triButtonIcon);
        b2.setPreferredSize(new Dimension(120,40));
        b2.setVerticalTextPosition(AbstractButton.CENTER);
        b2.setHorizontalTextPosition(AbstractButton.LEFT);
        b2.setHorizontalAlignment(AbstractButton.RIGHT);
        b2.setMnemonic(KeyEvent.VK_T);
        b2.setActionCommand(TRI);
        b2.addActionListener(this);
        b2.setToolTipText("This will triangulate the tiling.");

        minTextField = new JTextField(Integer.toString(minPoly),3);
        maxTextField = new JTextField(Integer.toString(maxPoly),3);
        minTextField.addActionListener(this);
        maxTextField.addActionListener(this);

        b3 = new JButton("Quad", quadButtonIcon);
        b3.setPreferredSize(new Dimension(120,40));
        b3.setVerticalTextPosition(AbstractButton.CENTER);
        b3.setHorizontalTextPosition(AbstractButton.LEFT);
        b3.setHorizontalAlignment(AbstractButton.RIGHT);
        b3.setMnemonic(KeyEvent.VK_Q);
        b3.setActionCommand(QUAD);
        b3.addActionListener(this);
        b3.setToolTipText("This will make quadrilaterals of the tiling.");

        b4 = new JButton("Penta", pentaButtonIcon);
        b4.setPreferredSize(new Dimension(120,40));
        b4.setVerticalTextPosition(AbstractButton.CENTER);
        b4.setHorizontalTextPosition(AbstractButton.LEFT);
        b4.setHorizontalAlignment(AbstractButton.RIGHT);
        b4.setMnemonic(KeyEvent.VK_P);
        b4.setActionCommand(PENTA);
        b4.addActionListener(this);
        b4.setToolTipText("This will make pentagons of the tiling.");

        JLabel restartLabel = new JLabel("Restart");

        b5 = new JButton("Square", squareButtonIcon);
        b5.setPreferredSize(new Dimension(120,40));
        b5.setVerticalTextPosition(AbstractButton.CENTER);
        b5.setHorizontalTextPosition(AbstractButton.LEFT);
        b5.setHorizontalAlignment(AbstractButton.RIGHT);
        b5.setMnemonic(KeyEvent.VK_S);
        b5.setActionCommand(SQUARE);
        b5.addActionListener(this);
        b5.setToolTipText("Start over with squares.");

        b6 = new JButton("Hexagon", hexagonButtonIcon);
        b6.setPreferredSize(new Dimension(120,40));
        b6.setVerticalTextPosition(AbstractButton.CENTER);
        b6.setHorizontalTextPosition(AbstractButton.LEFT);
        b6.setHorizontalAlignment(AbstractButton.RIGHT);
        b6.setMnemonic(KeyEvent.VK_H);
        b6.setActionCommand(HEXAGON);
        b6.addActionListener(this);
        b6.setToolTipText("Start over with hexagons.");

        b7 = new JButton("Inset", insetButtonIcon);
        b7.setPreferredSize(new Dimension(120,40));
        b7.setVerticalTextPosition(AbstractButton.CENTER);
        b7.setHorizontalTextPosition(AbstractButton.LEFT);
        b7.setHorizontalAlignment(AbstractButton.RIGHT);
        b7.setMnemonic(KeyEvent.VK_I);
        b7.setActionCommand(INSET);
        b7.addActionListener(this);
        b7.setToolTipText("This will make insets in the tiling.");

        b8 = new JButton("Undo");
        b8.setMnemonic(KeyEvent.VK_U);
        b8.setActionCommand("undo");
        b8.addActionListener(this);
        b8.setToolTipText("This will undo one step.");

        JLabel zoomLabel = new JLabel("Zoom %");

        zoomTextField = new JTextField(Integer.toString(zoomFactor),3);
        zoomTextField.addActionListener(this);

        //Add Components to a JPanel, using the default FlowLayout. 
        buttonPane = new JPanel();
        buttonPane.setPreferredSize(new Dimension(130,470));
        buttonPane.add(zoomLabel); 
        buttonPane.add(zoomTextField); 
        buttonPane.add(b1);
        buttonPane.add(minTextField);
        buttonPane.add(maxTextField);
        buttonPane.add(b2);
        buttonPane.add(b3);
        buttonPane.add(b4); 
        buttonPane.add(b7); 
        buttonPane.add(b8); 
        buttonPane.add(restartLabel); 
        buttonPane.add(b5); 
        buttonPane.add(b6); 
        buttonPane.setBackground(new Color(230,220,180));
        buttonPane.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));

        drawPane = new DPanel();
        drawPane.setPreferredSize(new Dimension(500, 470));
        drawPane.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));

        mainPane = new JPanel();
        mainPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        mainPane.add(buttonPane, BorderLayout.LINE_START);
        mainPane.add(drawPane, BorderLayout.CENTER);
        mainPane.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));

        return mainPane;
    }

    protected URL getURL(String filename) {
        URL url = null;
        if (codeBase == null) {
            codeBase = getCodeBase();
        }

        try {
            url = new URL(codeBase, filename);
        } catch (java.net.MalformedURLException e) {
            System.out.println("Couldn't create image: badly specified URL");
            return null;
        }

        return url;
    } // end getURL


    // this sets xadd and yadd to move whatever into the first lattice place
    protected void latticePlace(double px, double py) {
      px = Math.floor(px);
      py = Math.floor(py);
      int n = (int) Math.floor((px * translatemy - py * translatemx) /
              (double) inBoxDivisor);
      int m;
      if (translatemx == 0)
        {m = (int) Math.floor((py - (n * translateny)) / (double) translatemy);}
      else
        {m = (int) Math.floor((px - (n * translatenx)) / (double) translatemx);}
      xadd = -m * translatemx - n * translatenx;
      yadd = -m * translatemy - n * translateny;
    } // end latticePlace

} // end Tile


class DPanel extends JPanel {
                        
    public DPanel(){
        setBackground(Color.red);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
//        Graphics2D g2 = (Graphics2D)g;
//        g2.setStroke(new BasicStroke(8.0f));
//        Dimension dim = getSize();
//        int w = (int)dim.getWidth();
//        int h = (int)dim.getHeight();

      // draw a black border and a white background
      g.setColor(Color.white);
      g.fillRect(0,0,getSize().width-1, getSize().height - 1);
      g.setColor(Color.black);
      g.drawRect(0,0,getSize().width-1, getSize().height - 1);
   
      // draw the sides
      for (int i = 0; i < Tile.numberSides; i++) {
        int point1x = Tile.sides [i][2];
        int point1y = Tile.sides [i][3];
        int point2x = Tile.sides [i][6];
        int point2y = Tile.sides [i][7];
        for (int j = (int) Math.floor(Tile.minm*100/Tile.zoomFactor);
             j <= (int) Math.floor(Tile.maxm*100/Tile.zoomFactor);j++) {
          int move1x = j * Tile.translatemx;
          int move1y = j * Tile.translatemy;
          for (int k = (int) Math.floor(Tile.minn*100/Tile.zoomFactor);
               k <= (int) Math.floor(Tile.maxn*100/Tile.zoomFactor);k++) {
            int move2x = move1x + k*Tile.translatenx;
            int move2y = move1y + k*Tile.translateny;
            int firstx = (int) ((point1x + move2x)*Tile.zoomFactor/100);
            int firsty = (int) ((point1y + move2y)*Tile.zoomFactor/100);
            int secondx = (int) ((point2x + move2x)*Tile.zoomFactor/100);
            int secondy = (int) ((point2y + move2y)*Tile.zoomFactor/100);
            g.drawLine(firstx, firsty, secondx, secondy);
          } // end k loop
        } // end j loop
      } // end i loop

      g.setColor(Color.white);
      g.fillRect(1,1,getSize().width-2, 19);
      g.setColor(Color.black);
      g.drawLine(1,19,getSize().width-1, 19);
      g.drawString(Tile.commandList,10,15);
 
    } // end paint component
} // end Dpanel