Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mathematikproblem: Dreieck (https://www.delphipraxis.net/103720-mathematikproblem-dreieck.html)

Axxus 20. Nov 2007 20:07


Mathematikproblem: Dreieck
 
Hi Delphianer:hi:

Ich hab momentan ein Problem beim Programmieren. Zwar nicht bei der Implenierung, sondern bei der logik.

Also folgendes:

Ich habe ein spitzwinkliges Dreieck (alle innenwinkel sind kleiner als 91°)
Davon sind alle 3 Seitenlängen und alle drei Winkel gegeben
Wie kann ich nun Anhand dieser Größen Den Flächeninhalt berechnen?

(ist kein bestimmtes Dreieck, sondern brächte eine Formel, fall eine solche existiert)

Danke im Vorraus

Axxus

Apollonius 20. Nov 2007 20:09

Re: Mathematikproblem: Dreieck
 
Dir stehen alle Wege offen... Recht einfach ist hier die Heron-Formel, du kannst dir aber auch trigonometrisch eine Höhe holen und dann mit der "normalen" Flächenformel rechnen.

Die Muhkuh 20. Nov 2007 20:11

Re: Mathematikproblem: Dreieck
 
Mit Sinus kannst doch auch ausrechnen.

Amateurprofi 20. Nov 2007 20:19

Re: Mathematikproblem: Dreieck
 
schau mal hier.
Dreiecke

Axxus 20. Nov 2007 20:29

Re: Mathematikproblem: Dreieck
 
Ok erst mal danke für eure schnellen Antworten

Die Ergebnisse were ich mir morgen in aller ruhe durchlesen und fals ich noch Fragen habe werde ich sie hier noch posten^^

Vll als kleine Info: Ich bin noch Kalsse 10 und wie hatten leider noch kein sinus werden wir aber wahrscheilnich im laufe des Jahres machen. Kann aber nie schaden wenn man vorher schon das weiß was behandelt wird :thumb:

Gruß

Axxus

mkinzler 20. Nov 2007 20:33

Re: Mathematikproblem: Dreieck
 
Hat man Trigonometrie nicht schon in der Mittelstufe?

inherited 20. Nov 2007 20:41

Re: Mathematikproblem: Dreieck
 
10. Klasse = Mittelstufe ;)

Klaus01 21. Nov 2007 08:00

Re: Mathematikproblem: Dreieck
 
Das Problem sollte doch auch mit einer Winkelhalbierenden und dem Satz des Herrn Pythagoras
zu erschlagen sein.

Durch die Winkelhalbierende bekomme ich ein rechwinkliges Dreieck, dessen Fläche ist halb so groß
wie das ursprüngliche.

Grüße
Klaus

Amateurprofi 21. Nov 2007 09:20

Re: Mathematikproblem: Dreieck
 
Zitat:

Zitat von Klaus01
Das Problem sollte doch auch mit einer Winkelhalbierenden und dem Satz des Herrn Pythagoras
zu erschlagen sein.

Durch die Winkelhalbierende bekomme ich ein rechwinkliges Dreieck, dessen Fläche ist halb so groß
wie das ursprüngliche.

Grüße
Klaus

Wie, bitte, bekommst du (in einem allgemeinen Dreieck) durch eine Winkelhalbierende ein rechtwinkliges Dreieck ?

3_of_8 21. Nov 2007 09:29

Re: Mathematikproblem: Dreieck
 
Ich glaube, er meint die Höhe.

Amateurprofi 21. Nov 2007 10:25

Re: Mathematikproblem: Dreieck
 
Zitat:

Zitat von 3_of_8
Ich glaube, er meint die Höhe.

Ich glaube, daß er, wenn er "Höhe" gemeint hätte, auch "Höhe" geschrieben hätte.

Klaus01 21. Nov 2007 11:19

Re: Mathematikproblem: Dreieck
 
Zitat:

Zitat von Amateurprofi
Zitat:

Zitat von 3_of_8
Ich glaube, er meint die Höhe.

Ich glaube, daß er, wenn er "Höhe" gemeint hätte, auch "Höhe" geschrieben hätte.

Da war es wohl noch etwas früh heute morgen, und die Anmerkungen sind richtig.
Was ich beschrieben habe funktioniert so nur bei einem gleichschenkligen Dreieck.

Grüße
Klaus

Axxus 21. Nov 2007 14:21

Re: Mathematikproblem: Dreieck
 
Die Höhe ist ja leider in meinem Programm nicht gegeben :(
Sonst wärs ja ganz einfach

A = 1/2 * g * h

inherited 21. Nov 2007 14:31

Re: Mathematikproblem: Dreieck
 
Ich würde es, wie Appolonius schon gesagt hat, mit der Heronschen Formel machen. Nach der ist
A = sqrt( x(x-a)(x-b)(x-c) ), wobei x die Hälfte des Umfangs ist.

P.S.: Ich wünsch mir LaTeX-Tags

Blackheart 21. Nov 2007 14:38

Re: Mathematikproblem: Dreieck
 
Du hast doch geschrieben das die länge aller drei Seiten bekannt sind.
Dann rechne sie zusammen teile sie durch zwei und dann kannst Du es wie ein Oquadrat ausrechnen.
Oder bin Ich jetzt falsch. :gruebel:

Jelly 21. Nov 2007 14:57

Re: Mathematikproblem: Dreieck
 
Zitat:

Zitat von inherited
P.S.: Ich wünsch mir LaTeX-Tags

Ich auch :mrgreen:

3_of_8 21. Nov 2007 22:21

Re: Mathematikproblem: Dreieck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Abgesehen von der Heron-Formel gäbe es noch diese nicht ganz so rechenintensive Möglichkeit:
(sqrt ist IIRC langsamer als sin)

Amateurprofi 22. Nov 2007 01:22

Re: Mathematikproblem: Dreieck
 
Zitat:

Zitat von 3_of_8
Abgesehen von der Heron-Formel gäbe es noch diese nicht ganz so rechenintensive Möglichkeit:
(sqrt ist IIRC langsamer als sin)

@3_of_8 :
Da ist Intel aber ganz anderer Meinung.
FSIN benötigt 160-200 Takte
FSQRT benötigt 23 Takte (Single), 38 Takte (Double), 43 Takte (Extended)

Ich hab das mal getestet
Deine Version : f1:=Sin(alpha)*b*c/2;
Eine andere Version : f2:=Sqrt(4*Sqr(a)*Sqr(b) - Sqr((Sqr(a) + Sqr(b) - Sqr(c)))) / 4;

Deine Version = 344 Takte
Andere Version = 292 Takte

Und beides durch ASM-Funktionen optimiert

Deine Version = 296 Takte
Andere Version = 200 Takte

Zu beachten ist noch, daß beim Test der Winkel bereits in Rad vorliegt und nicht, wie bei Aufgabenstellungen üblich, in Grad.
Das bringt dann auch noch ein paar Takte auf die Waage.

Und zum Nachprüfen hier die komplette Test-Prozedur :

Delphi-Quellcode:
PROCEDURE TMain.Test;
var a,b,c,alpha,f1,f2,f3,f4:extended; t0,t1,t2,t3,t4:int64; i:integer;

FUNCTION TimeStamp:int64;
asm
   rdtsc
end;

FUNCTION Surface1(var alpha,b,c:extended):extended; // Sinus-Version
const two:integer=2;
asm
   fld  tbyte [edx] // b
   fld  tbyte [ecx] // c
   fld  tbyte [eax] // alpha
   fsin
   fmulp
   fmulp
   fidiv two
end;

FUNCTION Surface2(var a,b,c:extended):extended; // andere Version
const four:integer=4;
asm
   fld  tbyte [eax] // a
   fmul st,st      // st0=Sqr(a)
   fld  tbyte [edx] // b
   fmul st,st      // st0=Sqr(b), st1=Sqr(a)
   fld  tbyte [ecx] // c
   fmul st,st      // st0=Sqr(c), st1=Sqr(b), st2=Sqr(a)
   fchs             // st0=-Sqr(c), st1=Sqr(b), st2=Sqr(a)
   fadd st,st(1)   // st0=Sqr(b)-Sqr(c), st1=Sqr(b), st2=Sqr(a)
   fadd st,st(2)   // st0=Sqr(a)+Sqr(b)-Sqr(c), st1=Sqr(b), st2=Sqr(a)
   fmul st,st      // st0=Sqr(Sqr(a)+Sqr(b)-Sqr(c)), st1=Sqr(b), st2=Sqr(a)
   fxch st(2)      // st0=Sqr(a), st1=Sqr(b), st2=Sqr(Sqr(a)+Sqr(b)-Sqr(c))
   fimul four       // st0=4*Sqr(a), st1=Sqr(b), st2=Sqr(Sqr(a)+Sqr(b)-Sqr(c))
   fmulp            // st0=4*Sqr(a)*Sqr(b), st1=Sqr(Sqr(a)+Sqr(b)-Sqr(c))
   fsubrp           // st0=4*Sqr(a)*Sqr(b)-Sqr(Sqr(a)+Sqr(b)-Sqr(c))
   fsqrt            // st0=Sqrt(4*Sqr(a)*Sqr(b)-Sqr(Sqr(a)+Sqr(b)-Sqr(c)))
   fidiv four       // st0=Sqrt((4*Sqr(a)*Sqr(b)-Sqr(Sqr(a)+Sqr(b)-Sqr(c))))/4
end;

begin
   a:=3;
   b:=4;
   c:=4.5;
   alpha:=0.71217178712617798; // Rad
   t1:=High(int64);
   t2:=High(int64);
   t3:=High(int64);
   t4:=High(int64);
   for i:=1 to 10 do begin
      // Sinus-Version
      t0:=Timestamp;
      f1:=Sin(alpha)*b*c/2;
      t0:=Timestamp-t0;
      if t0<t1 then t1:=t0;
      // andere Version
      t0:=Timestamp;
      f2:=Sqrt(4*Sqr(a)*Sqr(b) - Sqr((Sqr(a) + Sqr(b) - Sqr(c)))) / 4;
      t0:=Timestamp-t0;
      if t0<t2 then t2:=t0;
      // Sinus-Version in ASM
      t0:=Timestamp;
      f3:=Surface1(alpha,b,c);
      t0:=Timestamp-t0;
      if t0<t3 then t3:=t0;
      // andere Version in ASM
      t0:=Timestamp;
      f4:=Surface2(a,b,c);
      t0:=Timestamp-t0;
      if t0<t4 then t4:=t0;
   end;

   ShowMessage('F1='+FloatToStr(f1)+' Ticks='+IntToStr(t1)+' (Sinus)'#13+
               'F2='+FloatToStr(f2)+' Ticks='+IntToStr(t2)+' (andere)'#13+
               'F3='+FloatToStr(f3)+' Ticks='+IntToStr(t3)+' (Sinus ASM)'#13+
               'F4='+FloatToStr(f4)+' Ticks='+IntToStr(t4)+' (andere ASM)');
end;

3_of_8 22. Nov 2007 15:48

Re: Mathematikproblem: Dreieck
 
IIRC heißt ja auch "If I remember correctly". ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz