eXorithm – Execute Algorithm: View / Run Algorithm triangulate

Logo Beta

function triangulate ($side1, $side2, $side3, $angle1, $angle2, $angle3, $radians

{

  $sides = array();

  $angles = array();

  

  // get sides

  if ($side1!='') $sides[1] = $side1+0;

  if ($side2!='') $sides[2] = $side2+0;

  if ($side3!='') $sides[3] = $side3+0;

  

  // get angles

  if ($angle1!='') $angles[1] = $angle1+0;

  if ($angle2!='') $angles[2] = $angle2+0;

  if ($angle3!='') $angles[3] = $angle3+0;

  

  // convert to radians if necessary

  if (!$radians) {

    foreach ($angles as $angle => $value) {

      $angles$angle] = deg2rad$value);

    }

  }

  

  // need 3 values and at least one side

  if (((count$sides)+count$angles))!=3) || (count$sides)==0)) {

    throw new Exception"You must only provide 3 values for the sides and angles. At least one value must be a side. Leave the other three values blank.");

  }

  

  // iterate three times to make sure that we get everything

  for ($count=0;$count<3;$count++) {

    // for the three sides/angles

    for ($i1=1;$i1<=3;$i1++) {

      $i2 = ($i1 % 3)+1; // the other side/angle

      $i3 = (($i1+1) % 3)+1; // the other other side/angle

      if (!isset$angles$i1])) {

        // try $angle1 = 180 - $angle2 - $angle3

        if ((isset$angles$i2])) && (isset$angles$i3]))) {

          $angles$i1] = pi() - $angles$i2] - $angles$i3];

        }

      }

      if (!isset$sides$i1])) {

        if (isset$angles$i1])) {

          // try $side1 = $side2 * (sin($angle1)/sin($angle2))

          if ((isset$sides$i2])) && (isset$angles$i2]))) {

            $sides$i1] = $sides$i2] * sin$angles$i1]) / sin$angles$i2]);

          }

          // try $side1 = $side3 * (sin($angle1)/sin($angle3))

          if ((isset$sides$i3])) && (isset$angles$i3]))) {

            $sides$i1] = $sides$i3] * sin$angles$i1]) / sin$angles$i3]);

          }

        }

      }

      if (!isset$angles$i1])) {

        if (isset$sides$i1])) {

          // try $angle1 = arcsin(sin($angle2) * $side1/$side2)

          if ((isset$sides$i2])) && (isset$angles$i2]))) {

            $angles$i1] = asinsin$angles$i2]) * $sides$i1] / $sides$i2]);

          }

          // try $angle1 = arcsin(sin($angle3) * $side1/$side3)

          if ((isset$sides$i3])) && (isset$angles$i3]))) {

            $angles$i1] = asinsin$angles$i3]) * $sides$i1] / $sides$i3]);

          }

        }

      }

      if (!isset$sides$i1])) {

        // try $side1 = sqrt($side2^2 + $side3^2 - 2*$side2*$side3*cos($angle1))

        if ((isset$sides$i2])) && (isset$sides$i3])) && (isset$angles$i1]))) {

          $sides$i1] = sqrt$sides$i2]*$sides$i2] + $sides$i3]*$sides$i3] - 2 * $sides$i2] * $sides$i3] * cos$angles$i1]));

        }

      }

      if (!isset$angles$i1])) {

        // try $angle1 = arccos($side2^2 + $side3^2 - $side1^2 / 2*$side2*$side3))

        if ((isset$sides$i2])) && (isset$sides$i3])) && (isset$sides$i1]))) {

          $angles$i1] = acos(($sides$i2]*$sides$i2] + $sides$i3]*$sides$i3] - $sides$i1]*$sides$i1]) / (2 * $sides$i2] * $sides$i3]));

        }

      }

    }

    // were we able to calculate everything?

    if ((count$sides)+count$angles))==6) break

  }

  

  // bad values?

  foreach ($angles as $value) {

    if (is_nan$value) || is_infinite$value) || ($value<=0)) {

      throw new Exception"A triangle cannot be constructed with those values.");

    }

  }

  

  ksort$sides);ksort$angles);

  

  // convert to degrees if necessary

  if (!$radians) {

    foreach ($angles as $angle => $value) {

      $angles$angle] = rad2deg$value);

    }

  }

  

  return (array'sides'=>$sides, 'angles'=>$angles));

}