Entwickler-Ecke

Sonstiges (Delphi) - Winkelberechnung vom Dreieck


masterchris_99 - So 21.03.04 19:28
Titel: Winkelberechnung vom Dreieck
Moin Moin
Also ich habe einpaar Probleme mit der Aufgabe.
Also zur AUfgabe ich soll bei gegebener Seite a, b und c die Winkel ausrechnen nur kommt nie das richtige oder annähernd das richtige raus.

Hier mal die Procedure

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure winkel (a,b,c:real;
                var wa,wb,wg:real);
        begin
        wa:=cos(((b*b)+(c*c)-(a*a))/(2*(b+c)));
        wb:=cos(((a*a)+(c*c)-(b*b))/(2*(a+c)));
        wg:=cos(((a*a)+(b*b)-(c*c))/(2*(a+b)));
        end;


Und hier der Link zum kompletten Programm
http://mitglied.lycos.de/derquakecommander/03.17.04_eigene_Unit.rar

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


ähM_Key - So 21.03.04 19:53

Das Problem ist sicherlich, dass du die Winkel in Gradmaß angibst!

Delphi rechnet aber mit Bogenmaß!

Also den Gradwert (0-360°) mit (PI/180) multiplizieren und du kommst auf Bogenmaß (0-2Pi)!

Grüße; ähM_Key


masterchris_99 - So 21.03.04 20:01

Programm läuft jetzt mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure winkel (a,b,c:real;
                var wa,wb,wg:real);
        begin
        wa:=RadToDeg(arccos(((b*b)+(c*c)-(a*a))/(2*(b+c))));
        wb:=RadToDeg(arccos(((a*a)+(c*c)-(b*b))/(2*(a+c))));
        wg:=RadToDeg(arccos(((a*a)+(b*b)-(c*c))/(2*(a+b))));
        end;


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


ähM_Key - So 21.03.04 20:47

Na wunderbar! :D

Super Idee die Funktion einzubauen!

Grüße; ähM_Key


masterchris_99 - So 21.03.04 21:18

ähm das programm verursacht aber leider noch Fehler kann sich das vielleicht mal einer angucken

http://mitglied.lycos.de/derquakecommander/03.17.04_eigene_Unit.rar
hab mal die veränderte version hochgeschoben.


Christian S. - So 21.03.04 21:51

Hallo!

(1) Bitte poste den Codeteil, der den Fehler produziert. Ich denke nicht, dass sich jeder erst die Datei herunterladen will.
(2) Du solltest uns auch verraten, was das für ein Fehler ist.

MfG
Peter


masterchris_99 - So 21.03.04 21:56

masterchris_99 hat folgendes geschrieben:
Programm läuft jetzt mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure winkel (a,b,c:real;
                var wa,wb,wg:real);
        begin
        wa:=RadToDeg(arccos(((b*b)+(c*c)-(a*a))/(2*(b+c))));
        wb:=RadToDeg(arccos(((a*a)+(c*c)-(b*b))/(2*(a+c))));
        wg:=RadToDeg(arccos(((a*a)+(b*b)-(c*c))/(2*(a+b))));
        end;


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Verursacht bei der Winkelberechnung einen Fehler
Wenn ich wüsste wieso würde ich den Fehler schon besser beschreiben und beheben Sorry :D
Also ich denke mal die berechnung haut net hin.


ähM_Key - So 21.03.04 23:01

Zitat:
Verursacht bei der Winkelberechnung einen Fehler

Was denn für einen? Nur falsche Werte?

Hast du die RadToDeg sebst geschrieben, oder ist die in ner Unit implementiert? (kenn mich da ni so aus :oops:)
Wenn ersteres der Fall ist solltest du auch vo dieser den Quelltext posten!

Grüße; ähM_Key


masterchris_99 - So 21.03.04 23:17

Also das is in "Math" mitdrin
Hab den Fehler jetzt einbisschen eingegrenzt

Wenn ich nur
wa:=RadToDeg(cos(((b*b)+(c*c)-(a*a))/(2*(b+c))));
schreibe kommt kein fehler aber sind auch die falschen Werte
aber sobald ich wieder
wa:=RadToDeg(arccos(((b*b)+(c*c)-(a*a))/(2*(b+c))));
schreibe verursacht er einen Fehler


Christian S. - So 21.03.04 23:54

Wie heißt der Fehler denn? Die Exception hat doch einen Namen!


raziel - Mo 22.03.04 17:34

ich könnt mir denken worans liegt. gib mal über

Delphi-Quelltext
1:
showmessage(FloatToStr(((b*b)+(c*c)-(a*a))/(2*(b+c))));                    

den wert aus, der an die Funktion ArcCos übergeben werden soll. Wenn der Wert größer als 1 oder kleiner als -1 is, geht des net, weil (wenn ich mich nach fast einem Jahr Mathe-Abstinenz recht erinnere) der Definitionsbereich von ArcCos -1 <= x <= 1 is. Abs(x) muss also <= 1 sein!


raziel

// EDIT: source-fehler ausgebessert... ;-)
btw: nimm statt "real" lieber "single", "double" oder "extended"!


Segelflieger - Mo 22.03.04 18:59

Hallo!

Also, ohne es jetzt ausprobiert zu haben, denke ich dass der fehler in deiner Formel steckt. Das soll doch der Cosinussatz sein, oder? Dann müsste es (glaub ich) eigentlich so aussehen:


Quelltext
1:
2:
3:
wa := RadToDeg(ArcCos((a*a - b*b - c*c)/(2*b*c));
wb := RadToDeg(ArcCos((b*b - a*a - c*c)/(2*a*c));  
wg := RadToDeg(ArcCos((c*c - a*a - b*b)/(2*a*b));


Ich denke, damit sollte es funktionieren. Probiers mal aus.


masterchris_99 - Mo 22.03.04 20:06

Segelflieger hat folgendes geschrieben:
Hallo!

Also, ohne es jetzt ausprobiert zu haben, denke ich dass der fehler in deiner Formel steckt. Das soll doch der Cosinussatz sein, oder? Dann müsste es (glaub ich) eigentlich so aussehen:


Quelltext
1:
2:
3:
wa := RadToDeg(ArcCos((a*a - b*b - c*c)/(2*b*c));
wb := RadToDeg(ArcCos((b*b - a*a - c*c)/(2*a*c));  
wg := RadToDeg(ArcCos((c*c - a*a - b*b)/(2*a*b));


Ich denke, damit sollte es funktionieren. Probiers mal aus.


Also du hast nur eine Klammer vergessen.
wa := RadToDeg(ArcCos((a*a - b*b - c*c)/(2*b*c)));
wb := RadToDeg(ArcCos((b*b - a*a - c*c)/(2*a*c)));
wg := RadToDeg(ArcCos((c*c - a*a - b*b)/(2*a*b)));
so geht das schon nur kommen nich die richtigen Winkel raus.
hab mal meinen alten Mathe Hefter rausgesucht und die werte stimmen nich mit denen aus den erfolgreichen tests überein


Christian S. - Mo 22.03.04 20:17

Hallo!

IMHO habt Ihr da einen Vorzeichenfehler drin. In meiner Formelsammlung steht:

a² = b² + c² - 2bc * cos(alpha)

MfG
Peter


Segelflieger - Mo 22.03.04 20:20

ist winkel wa auch der, der seite a gegenübeliegt?


Christian S. - Mo 22.03.04 20:20

ja


raziel - Mo 22.03.04 20:21

ich komm zwar grad von ner mathenachhilfe mit gleichem thema aber na gut:

wir gehen davon aus: c² = a²+b²-2ab*cos(wc)
=> 2ab*cos(wc) = a²+b²-c²
=> cos(wc) = (a²+b²-c²)/2ab
=> wc = arccos((a²+b²-c²)/2ab)

> Die ursprüngliche Formel war _fast_ korrekt, nur am ende isn produkt und keine summe!
die formel lautet also für wc korrekt:


Delphi-Quelltext
1:
wc := RadToDeg(ArcCos((a*a+b*b-c*c)/2*a*b));                    


analog wa und wb


raziel


raziel - Mo 22.03.04 20:22

da war ich wohl zu langsam...


masterchris_99 - Mo 22.03.04 21:24

Wieder Fehler vom Anfang

Invalid floating point operation


raziel - Di 23.03.04 17:54
Titel: w.delphi
dann prüf doch mal bitte den wert, den du an ArcCos übergibst (siehe oben!)
wie bereits gesagt darf der nur zwischen -1 und 1 sein!
Falls Abs(x) > 1 ist, dann ist das wahrscheinlich kein Dreieck!
(Man kann ja nich einfach "beliebige" Werte eingeben, sie müssen schon ein paar wenigen Regeln folgen)


raziel


adrian4321 - Sa 27.03.04 20:26

Bei dem Thema muss ich noch eins draufsetzen: Das Prog wofür ich in der 9. in Mathe eine 1 bekommen hab....

Leider hab ich den Quellcode nicht mehr bzw. ich hab ihn 128Bit verschlüsselt und den Schlüssel verloren (na ja, dumme Sache.... :autsch:) echt zum :puke:

sondern nur die exe von einer CD aber ich kann Euch jedoch garantieren dass sie keine Würmer etc. enthält (wenn doch bekommt Ihr alle .... moment.... z.B. ein Auto.)

War ein harter Brocken Arbeit!! (kann man da evtl wieder die Sourcen rausbekommen?)

[url]http://www.hdegwert.de/Umfang21.exe[/url]

freue mich über feedback.

adrian


raziel - So 28.03.04 11:23

an den source direkt rankommen wird wohl nich gehen. afaik gibts keinen delphi-decompiler (ein standard disassembler würde gehen, aber dann hast du asm-code -> bringt nich wirklich viel...)
für die graphiken würde ein normaler resource-hacker genügen (sofern nicht dynamisch erzeugt), die forms aus delphi-applications kriegt man mit nem speziellen tool wieder (dessen name mir grad entfallen ist).
ansonsten würde dir noch ein brute-force angriff auf den verschlüsselten source bleiben. würde je nach algorithmus und PC so zwischen einem und fünf Mrd. Jahren dauern...:roll:


raziel


adrian4321 - So 28.03.04 13:51

Hab mich mal bei Profi Hackern umgehört die meinten die 128Bit RSA Verschlüsselung von W2k ist mit normalen PCs hoffnungslos :wink:

adrian


ähM_Key - So 28.03.04 14:29

Am Ende ist es eigentlich egal, was du für nen Rechner hast!
Ob nun 3GHz oder 3THZ...das macht dann statt 5Mrd. Jahre nur noch 5Millonen! :D

Das ist woh neu schreiben das beste...ein ganzes OS ist es ja nicht ;-)

Grüße; ähM_Key


raziel - So 28.03.04 14:47

da hab ich wohl die ironie tags vergessen... :roll:

ähM_Key hat folgendes geschrieben:
Das ist woh neu schreiben das beste...ein ganzes OS ist es ja nicht

soll das ein wink mit diesem berüchtigten zaunpfahl sein?

Win2k hat ne 128-bit RSA Verschlüsselung?? imho is RSA erst im Bereich 1024, 2048 und 4096 Bit sicher...


raziel


ähM_Key - So 28.03.04 15:02

raziel hat folgendes geschrieben:

soll das ein wink mit diesem berüchtigten zaunpfahl sein?


Kenne den Spruch jetzt nicht, aber es sollte auf keinen Fall ein perönlicher Angriff sein ;)

Grüße; ähM_Key