CS Challenge 7, Triangle Tool

Mange elever på STX og HTX har allerede stiftet bekendskab med Ligningsløseren, der laver perfekte besvarelser til opgaver om polynomielle ligninger. Nu findes også Trekantsløseren, der laver perfekte besvarelser til alle opgaver med 3 antagelser om en trekant.

I denne Challenge kigger vi på centrale dele af dette værktøj.


Vinkler og sider i trekanten benævnes på denne måde:

Endvidere benævnes omkredsen O og arealet X. Trekantsløseren får antagleser om 3 af disse elementer og udleder de resterende i en besvarelse, der med garanti vil give karakteren 12.

Ved første øjekast er der 8*7*6=336 forskellige trekantsopgaver. En del af disse, fx tre vinkler (ABC) eller areal, vinkel og modstående side (XAa), er dog underspecificerede, da de tillader uendeligt mange løsninger. Sådanne tillades ikke af Trekantsløseren, men de kan alle erstattes med mere specifikke antagelser, fx to vinkler og en side (ABc) eller areal, vinkel og hosliggende side (XAb).

Når disse er elimineret, er der 258 trekantsopgaver tilbage. Man kan dog udnytte en hel del symmetri, i form af ombytninger og omnavngivning. Med denne observation ender vi med 11 essentielt forskellige trekantsopgaver, der hver skal løses med trigonometriske teknikker. De har hver 0, 1 eller 2 løsninger - i tilældet med 2 undgås videst muligt stumpe vinkler.

Trekantsløseren har fire hovedopgaver:


De væsentligste dele af Trekantsløeren kan ses i programmet Triangle.java, der dog i denne version tager sit input fra kommandolinjen:
java Triangle X=72,a=30,b=29
der som output giver:
Vi ved, at X=72, a=30 og b=29.
Da arealet også er X = (a*b*sin(C))/2, kan vi finde sin(C) = 2*X/(a*b) = 2*72/(30*29) = 0.17.
Den inverse sinus giver os C = 9.53.
Vi benytter cosinusrelationen til at finde
c^2 = a^2+b^2-2*a*b*cos(C) = 30^2+29^2-2*30*29*cos(9.53) = 25, og dermed c = 5.
Vi benytter cosinusrelationen til at finde
cos(A) = (c^2+b^2-a^2)/(2*c*b) = (5^2+29^2-30^2)/(2*5*29) = -0.12.
Den inverse cosinus giver A = 96.73.
Vi benytter vinkelsummen til at beregne B = 180-C-A = 180-9.53-96.73 = 73.74.
Omkredsen findes som O = a+b+c = 30+29+5 = 64.

Spørgsmål A

Metoden checkAndFixInput laver en masse checks af de givne antagelser. Forklar et par stykker af dem.
Den udleverede kode (Triangle.java) mangler at implementere metoden renameChar, der renavngiver sit char argument efter værdien af den globale variabel permutation. Følgende tabel viser effekten af permutationerne abc, cba og bca (hvor alle andre tegn returneres uændrede):

Førabccbabca
aacb
bbbc
ccaa
AACB
BBBC
CCAA

Dette er bare tre eksempler, metoden skal virke for alle seks permutationer.


Spørgsmål B

Skriv kroppen til metoden renameChar. Forklar kort, hvordan metoderne matchPermutation og match håndterer symmetrierne i trekantsopgaverne (reducerer fra 258 til 11 opgaver).
Matematiklærere er glade for, at man udnytter specialtilfælde til at give simplere løsninger. Fx er der ofte lettere løsninger, hvis trekanten er retvinklet, ligebenet eller ligesidet. Online udgaven af Trekantsløseren,, kender til rigtig mange sådanne tricks for at sikre 12-tallet for besvarelsen.

Spørgsmål C

Udvid Triangle.java, så den udnytter mindst et specialtilfælde til at give en simplere løsning til mindst en af de 11 essentielt forskellige opgaver. Forklar kort, hvad du har gjort. Hint: kig på de 11 solve_XYZ metoder og gæt, hvordan assign-, val- og out-metoderne virker.
BlueJ version: TriangleBlueJ.zip.
Du deltager i vores Challenge ved senest den 11. september at sende en e-mail til mis@cs.au.dk med subject Challenge 7 og svarene på spørgsmål A, B og C (i plain text), samt et attachment med en ny udgave af klassen Triangle.java til spørgsmål B og C.
Du bliver registreret som deltager gennem denne første e-mail. Du skal derfor angive dit studienummer, dit navn og din studielinje (dat/it/mat). Herefter er du identificeret af din e-mail adresse.