note
dragonchild
A few suggestions:
<ul>
<li>Break the Law_Of_Sines() function up a bit more. For example, you have a (rather hefty) section of code cut'n'pasted three times. Make it a subroutine.
<li>Instead of running $A, $a, $B, $b, $C, and $c, why not do a list of hashes called angles? So, you could do something like <code>$angles->[0]{B}</code> to reference the second angle in the first triangle. The real benefit of that is to allow you to do for loops, reducing the number of lines while improving readability.
</ul>
An example of the second suggestion would be:
<p><code>
unless ( $A > 0 && $B > 0 && $C > 0 ) {
if ( $A > 0 && $B > 0 ) { $var = "C" }
if ( $A > 0 && $C > 0 ) { $var = "B" }
if ( $B > 0 && $C > 0 ) { $var = "A" }
if ( $var eq "C" ) {
$sum = $angles{B} + $angles{A};
$other = 180 - $sum;
$angles{$var} = $other;
$C = sprintf( "%.10f", Math::NumberCruncher::deg2rad( $other ) );
} elsif ( $var eq "B" ) {
$sum = $angles{A} + $angles{C};
$other = 180 - $sum;
$angles{$var} = $other;
$B = sprintf( "%.10f", Math::NumberCruncher::deg2rad( $other ) );
} elsif ( $var eq "A" ) {
$sum = $angles{B} + $angles{C};
print ("Sum: $sum\n");
$other = 180 - $sum;
$angles{$var} = $other;
$A = sprintf( "%.10f", Math::NumberCruncher::deg2rad( $other ) );
</code>
instead could be written as:
<p><code>
if (grep $_ <= 0, @{$angles->[0]}{('A' .. 'C')}) {
my $zero_angle = 'A';
if ($angles->[0]{C} <= 0) { $zero_angle = 'C' }
elsif ($angles->[0]{B} <= 0) { $zero_angle = 'B' }
my @sides = ('A' .. 'C');
@sides = grep $_ ne $zero_angle, @sides;
$sum = 0;
$sum += $_ for @{$angles->[0]}{@sides};
$other = 180 - $sum;
$angles{$var} = $other;
$angles->[0]{$zero_angle} =
sprintf( "%.10f", Math::NumberCruncher::deg2rad( $other ) );
}
</code>
The primary difference between your version and mine is that I chose a data structure that allows me to have the interpreter associate pieces of data that should be associated together. Your version requires that you continually associate them yourself.
<p>The second difference is that I'm taking advantage of the easy conversions between hashes and arrays through hash-slices. Read up on them. They're SOOOO powerful. :)
<p>Now, you don't have to use my data structure. I chose it because it was the closest to what you were doing. However, it can easily make sense to have the angles in an array and not a hash. So, triangle 1, angle 2 would be <code>$angles->[0][1]</code>. Simple enough.
<p>Keep with it. It's a neat idea!
<p><b>Update:</b> Fixed a few square brackets. Thanx [Albannach] and [ChemBoy]!
101484
101484