/**
   * this method is called by the 'Create' function, and it fills in the buoys into the correct
   * pattern
   */
  protected final void addBuoys(Debrief.Wrappers.BuoyPatternWrapper pattern) {
    WorldLocation origin = getKingpin();
    // note that as we calculate the LH angle
    double lh_orient_rads = MWC.Algorithms.Conversions.Degs2Rads(_orientation2);
    double rh_orient_rads = MWC.Algorithms.Conversions.Degs2Rads(_orientation1);
    double spacing_degs = MWC.Algorithms.Conversions.Nm2Degs(_spacing);

    // how many bouys in each leg?
    // an even number means we don't have one at the tip, which becomes a special case
    int num_buoys = getNumberOfBuoys().intValue();
    boolean even_num = false;
    if ((num_buoys % 2) == 0) {
      even_num = true;
    }

    // sort out how many there are in each leg
    int num_in_leg = num_buoys / 2;

    // sort out the direction
    double this_orient = rh_orient_rads;

    int buoy_counter = 0;

    // remember that we are looking at the first buoy
    boolean first_buoy = true;

    // do the first leg
    for (int i = 0; i < num_in_leg; i++) {
      // create the new symbol
      Debrief.Wrappers.LabelWrapper lw =
          new Debrief.Wrappers.LabelWrapper("W" + (buoy_counter + 1), origin, java.awt.Color.red);

      buoy_counter++;

      // get the parent to do the formatting
      this.formatSymbol(lw, pattern);

      // if this is the first buoy, mark it as the kingping
      if (first_buoy) {
        lw.setSymbolType("Kingpin");
        first_buoy = false;
      }

      // create the step to use to get to the next buoy
      WorldVector thisStep = new MWC.GenericData.WorldVector(this_orient, spacing_degs, 0.0);

      // place buoy
      origin = origin.add(thisStep);
    }

    // if we have an even number, we need to move forward 1/2 distance for one more step before we
    // change direction
    if (even_num) {
      // calculate the size of this small step
      double reverse_rh_rads = MWC.Algorithms.Conversions.Degs2Rads(_orientation1 + 180.0);
      WorldVector short_hop = new WorldVector(reverse_rh_rads, spacing_degs / 2, 0.0);

      // move the origin forward
      origin = origin.add(short_hop);

      // calculate the size of this small step
      short_hop = new WorldVector(lh_orient_rads, spacing_degs / 2, 0.0);

      // move the origin forward
      origin = origin.add(short_hop);
    } else {

      // drop a buoy at the current point
      Debrief.Wrappers.LabelWrapper lw =
          new Debrief.Wrappers.LabelWrapper("W" + (buoy_counter + 1), origin, java.awt.Color.red);
      buoy_counter++;

      // move to the correct location for the next point
      WorldVector short_hop = new WorldVector(lh_orient_rads, spacing_degs, 0.0);

      // move the origin forward
      origin = origin.add(short_hop);

      // get the parent to do the formatting
      this.formatSymbol(lw, pattern);
    }

    // now travel back down the reverse side
    // sort out the direction
    this_orient = lh_orient_rads;

    // do the first leg
    for (int i = 0; i < num_in_leg; i++) {

      // create the new symbol
      Debrief.Wrappers.LabelWrapper lw =
          new Debrief.Wrappers.LabelWrapper("W" + (buoy_counter + 1), origin, java.awt.Color.red);

      buoy_counter++;

      // get the parent to do the formatting
      this.formatSymbol(lw, pattern);

      // create the step to use to get to the next buoy
      WorldVector thisStep = new MWC.GenericData.WorldVector(this_orient, spacing_degs, 0.0);

      // start moving down the return leg
      // move buoy
      origin = origin.add(thisStep);
    }
  }