Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 17.05.2008, 00:10 Titel: Winkelberechnungen im Dreieck |
|
|
Hallo,
Ich möchte ein Programm schreiben womit man Dreiecke berechnen kann.
Gegeben ist Punkt1(X, Y), Punkt2(X, Y) und Punkt3(X, Y). Ich möchte jetzt den Winkel zwischen Punkt1 - Punkt2, Punkt1 - Punkt3 und Punkt2 - Punkt3. Wie kann man das berechnen? Hab schon gegoogelt, hab aber auch nichts brauchbares(für mich) gefunden. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 17.05.2008, 00:42 Titel: |
|
|
winkel = ACOS (((x2-x1)*(x3-x1) + (y2-y1)*(y3-y1)) / SQR(((x2-x1)^2 + (y2-y1)^2)*((x3-x1)^2 + (y3-y1)^2)))
berechnet den Winkel mit Scheitelpunkt P1, wobei x1|y1 die Koordinaten des Punktes P1 sind usw. Achte aber darauf, dass das Ergebnis in Bogenmaß geliefert wird (also noch umrechen).
edit: mir fällt gerade ein, dass es auch mit dem Kosinussatz geht:
cos alpha = (b^2 + c^2 - a^2) / (2*b*c)
wobei a, b und c die Seitenlängen des Dreiecks sind. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 17.05.2008, 09:09 Titel: |
|
|
Nanu- Trigonometrie oder Geometrie ist eigentlich kein Fach, was nur im Abitur gelehrt wird. Wie man ein Dreieck berechnet, ist eigentlich Allgemeinbildung. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 17.05.2008, 13:12 Titel: |
|
|
Das klappt bei mir irgentwie nich... er sagt immer "Division by Zero". |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 17.05.2008, 13:43 Titel: |
|
|
Bei ACos(x) darf doch x nicht > 1 und nicht < -1 sein oder? |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 17.05.2008, 20:01 Titel: |
|
|
Elektronix: Ich weiss nicht wie es in Deutschland ist, aber in der Schweiz ist die Trigonometrie kein Schulstoff für alle, sondern kommt eben erst später (Matura/Technische Lehre) oder gar nicht.
Nitroxis:
Zitat: | Ich möchte jetzt den Winkel zwischen Punkt1 - Punkt2, Punkt1 - Punkt3 und Punkt2 - Punkt3. |
Zwischen Punkten kannst du keine Winkel berechnen, weil es zwischen Punkten keine Winkel gibt.
Winkel existieren nur zwischen zwei oder mehr Strecken, Strahlen oder Linie.
Kannst du vielleicht eine Zeichnung machen damit wir es uns besser vorstellen können? _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Zuletzt bearbeitet von Michael Frey am 18.05.2008, 13:34, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 18.05.2008, 02:01 Titel: |
|
|
Nitroxis hat Folgendes geschrieben: | Bei ACos(x) darf doch x nicht > 1 und nicht < -1 sein oder? |
Ist richtig, sollte bei der Formel auch nie rauskommen können (wenn ich mich nicht vertippt habe ...)
Division by zero kann bei Seitenlängen>0 eigentlich auch nicht passieren ... welche Werte hast du denn verwendet? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 18.05.2008, 10:48 Titel: |
|
|
Bei gegebenen Eckpunkten bietet es sich sonst an, die Winkel als Differenz zu deren Polarkoordinaten-Winkel zu berechnen. Beispielcode zum Ganzen, gleich als lauffähiges Beispielprogramm zum etwas Herumspielen können:
http://beilagen.dreael.ch/QB/3ECKWINK.BAS
Wichtig: Punkte A-B-C müssen ein Dreieck im Gegenuhrzeigersinn bilden, sonst werden die äusseren (überstumpfen) Winkel berechnet.
Ansonsten gilt der Ansatz mittels Skalarprodukt aus der linearen Algebra für 2D genauso wie unter
http://beilagen.dreael.ch/QB/3DWINKEL.BAS
gezeigt, d.h. für beispielsweise Winkel alpha nimm AB und AC als Vektoren und berechne
Code: | cos(alpha)=Skalar(AB, AC)/(Betrag(AB)*Betrag(AC)) |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 18.05.2008, 20:26 Titel: |
|
|
Also ich habe nur die drei punkte a, b, c und möchte dann allle drei innenwinkel berechnen...
@nemored Oups, kann sein das Seitenlänge = 0 rauskommt |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 18.05.2008, 22:43 Titel: |
|
|
Wenn du drei Punkte hast, dann hast du auch die drei Strecken zwischen den Punkten, und diese legen die Winkel fest. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.05.2008, 16:24 Titel: |
|
|
Ok, jetzt habe ich nochmal ein bissl gegoogelt und habs soweit kapiert. Aber was ist wenn ein Winkel mal größer als 90° ist? Dann kann man ihn ja nicht mit Arcsin oder Arccos berechnen. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 22.05.2008, 16:52 Titel: |
|
|
Warum nicht? cos(100°) = -0,173648178, acos(-0,173648178) = 100° _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.05.2008, 18:51 Titel: |
|
|
Jaja, ich mache das so: sin(alpha) = Gegenkathete / Hypothenuse. Da kommt manchmal was größeres raus... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 22.05.2008, 20:12 Titel: |
|
|
Bei Gegenkathete / Hypotenuse können nur Zahlen zwischen 0 und 1 rauskommen, weil die Hypotenuse die längste Seite ist. Allerdings gibt es da auch keine Winkel > 90°, ist schließlich eine Definition im rechtwinkligen Dreieck.
Für Winkel > 90° kannst du z. B. sin/cos am Einheitskreis anschauen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.05.2008, 20:17 Titel: |
|
|
@Nitroxis: Mein Beispiel ist übrigens soweit vollständig getestet. Noch zur PolarWinkel()-FUNCTION in diesem Beispiel: Beruht ebenfalls auf dem rechtwinkligen Dreieck, welches das Deltax und Deltay im Koordinatensystem zwischen zwei Punkten bilden. Dabei wende ich
Code: | TAN(phi) = Gegenkathete(DeltaY) / Ankathete(DeltaX) |
an, wobei die Sache mit dem korrekten Quadranten durch die IF-THENs innerhalb dieser FUNCTION richtig gehandhabt wird.
Ansonsten empfehle ich Dir den bisherigen Code hier ins Forum zu posten (CODE-Tag nicht vergessen), dann können wir Dir konkret weiterhelfen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.05.2008, 20:43 Titel: |
|
|
Code: | DIM A AS DOUBLE, B AS DOUBLE, C AS DOUBLE
DIM Alpha AS DOUBLE, Beta AS DOUBLE, Gamma AS DOUBLE
SCREEN 12
INPUT „Punkt 1“, X1, Y1
INPUT „Punkt 2“, X2, Y2
INPUT „Punkt 3“, X3, Y3
LINE (X1, Y1)-(X2, Y2), 15
LINE (X2, Y2)-(X3, Y3), 15
LINE (X3, Y3)-(X1, Y1), 15
IF X2 >= X1 AND Y2 >= Y1 THEN
C = SQR((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)
ELSE IF X1 >= X2 AND Y1 >= Y2 THEN
C = SQR((X1 - X2) ^ 2 + (Y1 - Y2) ^ 2)
ELSE IF X1 >= X2 AND Y2 >= Y1 THEN
C = SQR((X1 - X2) ^ 2 + (Y2 - Y1) ^ 2)
ELSE IF X2 >= X1 AND Y1 >= Y2 THEN
C = SQR((X2 - X1) ^ 2 + (Y1 - Y2) ^ 2)
ENDIF
IF X3 >= X1 AND Y3 >= Y1 THEN
B = SQR((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2)
ELSE IF X1 >= X3 AND Y1 >= Y3 THEN
B = SQR((X1 - X3) ^ 2 + (Y1 - Y3) ^ 2)
ELSE IF X1 >= X3 AND Y3 >= Y1 THEN
B = SQR((X1 - X3) ^ 2 + (Y3 - Y1) ^ 2)
ELSE IF X3 >= X1 AND Y1 >= Y3 THEN
B = SQR((X3 - X1) ^ 2 + (Y1 - Y3) ^ 2)
ENDIF
IF X3 >= X2 AND Y3 >= Y2 THEN
A = SQR((X3 - X2) ^ 2 + (Y3 - Y2) ^ 2)
ELSE IF X2 >= X3 AND Y2 >= Y3 THEN
A = SQR((X2 - X3) ^ 2 + (Y2 - Y3) ^ 2)
ELSE IF X2 >= X3 AND Y3 >= Y2 THEN
A = SQR((X2 - X3) ^ 2 + (Y3 - Y2) ^ 2)
ELSE IF X3 >= X2 AND Y2 >= Y3 THEN
A = SQR((X3 - X2) ^ 2 + (Y2 - Y3) ^ 2)
ENDIF
Alpha = A / C
PRINT ASIN(Alpha)
|
Ich hab im moment nur Alpha. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 22.05.2008, 21:46 Titel: |
|
|
Code: | IF X2 >= X1 AND Y2 >= Y1 THEN
C = SQR((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)
ELSE IF X1 >= X2 AND Y1 >= Y2 THEN
C = SQR((X1 - X2) ^ 2 + (Y1 - Y2) ^ 2)
ELSE IF X1 >= X2 AND Y2 >= Y1 THEN
C = SQR((X1 - X2) ^ 2 + (Y2 - Y1) ^ 2)
ELSE IF X2 >= X1 AND Y1 >= Y2 THEN
C = SQR((X2 - X1) ^ 2 + (Y1 - Y2) ^ 2)
ENDIF |
ist unnötig - du quadrierst ja, da werden die Zwischenergebnisse sowieso positiv. Besser wäre eine Überprüfung, ob zwei Punkte gleich sind.
Code: | Alpha = A / C
PRINT ASIN(Alpha) |
funktioniert wie gesagt nur, wenn das Dreieck zufällig rechtwinklig ist!! _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.05.2008, 21:55 Titel: |
|
|
Ja, aber was macheich wenn das malnicht der fall ist, das ist ja meine Frage... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 22.05.2008, 22:07 Titel: |
|
|
Du könntest zum Beispiel einen der vielen Hinweise verwenden, die schon in diesem Thread stehen.
Code: | DIM A AS DOUBLE, B AS DOUBLE, C AS DOUBLE
DIM Alpha AS DOUBLE, Beta AS DOUBLE, Gamma AS DOUBLE
SCREEN 12
DO
INPUT "Punkt 1", X1, Y1
INPUT "Punkt 2", X2, Y2
INPUT "Punkt 3", X3, Y3
' Eingabe pruefen
IF (X1<>X2 OR Y1<>Y2) AND (X1<>X3 OR Y1<>Y3) AND (X2<>X3 OR Y2<>Y3) THEN EXIT DO
PRINT "FEHLER: Du musst drei verschiedene Punkte eingeben!"
LOOP
' Berechnung der Strecken
A = SQR((X3 - X2) ^ 2 + (Y3 - Y2) ^ 2)
B = SQR((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2)
C = SQR((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)
' Berechnung des Winkels Alpha mit dem Kosinussatz
Alpha = ACOS((B^2 + C^2 - A^2) / (2*B*C)) |
edit: das Programm prüft nur, ob die eingegebenen Punkte verschieden sind, und nicht, ob sie auf einer Geraden liegen (auch dann erhält man kein Dreieck). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 23.05.2008, 13:50 Titel: |
|
|
Ok, aber wie finde ich heraus ob es ein Rehtwinkeliges Dreieck ist? Denn wie du sagst, hehts ja nur mit solchen... |
|
Nach oben |
|
|
|