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.");
}
}