sineRule method

void sineRule()

Uses the sine rule to calculate a missing side or angle. Requires one unknown side or angle.

Implementation

void sineRule() {
  int knownSides = [a, b, c].where((element) => element == null).length;
  int knownAngles =
      [angleA, angleB, angleC].where((element) => element == null).length;

  if (knownSides + knownAngles != 1) {
    throw Exception(
        "The sine rule requires exactly one unknown side or angle.");
  }

  if (a != null && angleA != null) {
    double ratio = a! / angleA!.sin();
    if (b == null && angleB != null) {
      b = ratio * angleB!.sin();
    } else if (c == null && angleC != null) {
      c = ratio * angleC!.sin();
    } else if (angleB == null && b != null) {
      angleB = Angle(rad: asin(b! / ratio));
      angleC = Angle(deg: 180 - angleA!.deg - angleB!.deg);
    }
  } else if (b != null && angleB != null) {
    double ratio = b! / angleB!.sin();
    if (a == null && angleA != null) {
      a = ratio * angleA!.sin();
    } else if (c == null && angleC != null) {
      c = ratio * angleC!.sin();
    } else if (angleA == null && a != null) {
      angleA = Angle(rad: asin(a! / ratio));
      angleC = Angle(deg: 180 - angleA!.deg - angleB!.deg);
    }
  } else if (c != null && angleC != null) {
    double ratio = c! / angleC!.sin();
    if (a == null && angleA != null) {
      a = ratio * angleA!.sin();
    } else if (b == null && angleB != null) {
      b = ratio * angleB!.sin();
    } else if (angleA == null && a != null) {
      angleA = Angle(rad: asin(a! / ratio));
      angleB = Angle(deg: 180 - angleA!.deg - angleC!.deg);
    }
  } else {
    throw Exception("Not enough information provided for the sine rule.");
  }
}