AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Umrechnung Kosinuswert/Winkel

Ein Thema von JulianT · begonnen am 8. Mär 2015 · letzter Beitrag vom 9. Mär 2015
Antwort Antwort
JulianT
(Gast)

n/a Beiträge
 
#1

Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 20:56
Schönen guten Abend,
ich bin neu im Bereich der Delphi Programmierung und es ist auch meine erste Programmiersprache. Ich habe nun folgendes Problem in Bezug auf Vektorenrechnung, an die ich mich herangetraut habe. Ich berechne Skalarprodukt, sowie Vektorbeträge von A und B. Später dann den cos_alpha Wert und lasse diesen ausgeben. Bei der folgenden Sache hapere ich nun. Ich möchte den cos Wert umrechnen in einen Winkel, aber da kommt dann immer nur ein Wert wie -0,99 oder 0,99 keine Ahnung, ich hab das Projekt leider nicht am Manne, nur den Quellcode dazu.

Kann mir jemand vlt bei meinem Problem helfen? Danke sehr!

Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    ButtonBerechne: TButton;
    ButtonAbbruch: TButton;
    Label1: TLabel;
    EditAx: TEdit;
    Label2: TLabel;
    EditAy: TEdit;
    Label3: TLabel;
    EditAz: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    EditBx: TEdit;
    Label6: TLabel;
    EditBy: TEdit;
    Label7: TLabel;
    EditBz: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    EditBetragA: TEdit;
    Label10: TLabel;
    EditBetragB: TEdit;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    EditCx: TEdit;
    Label14: TLabel;
    EditCy: TEdit;
    Label15: TLabel;
    EditCz: TEdit;
    Label16: TLabel;
    EditSkalarprodukt: TEdit;
    EditWinkel: TEdit;
    Label17: TLabel;
    EditCoswinkel: TEdit;
    procedure ButtonAbbruchClick(Sender: TObject);
    procedure ButtonBerechneClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonAbbruchClick(Sender: TObject);
begin
Close;
end;

function ArcCos(x:real):real;
begin
    if x=0
      then Result:= Pi/2
      else Result:= ArcTan(sqrt(1-sqr(x))/x);
    if Result<0 then Result:= Result+Pi;
end;

function BogenZuGrad(AlphaBog:real):real;
begin
    result:=((2*Pi)/(360))*alphaBog;
{  result:=180*alphaBog/Pi;     }
end;


procedure TForm1.ButtonBerechneClick(Sender: TObject);

var VektorA, VektorB, Vektor0 : array[1..3] of integer;
    skalarprodukt : integer;
    betragA, betragB, cos_alpha, alphaBog, alphaGrad : real;

begin
//Jetzt werden die Werte eingelesen
VektorA[1]:=StrToInt(EditAx.Text);
VektorA[2]:=StrToInt(EditAy.Text);
VektorA[3]:=StrToInt(EditAz.Text);
VektorB[1]:=StrToInt(EditBx.Text);
VektorB[2]:=StrToInt(EditBy.Text);
VektorB[3]:=StrToInt(EditBz.Text);

//Berechnen und Ausgeben des Skalarproduktes
skalarprodukt:= vektorA[1]*vektorB[1]+VektorA[2]*VektorB[2]+VektorA[3]*VektorB[3];
EditSkalarprodukt.Text:=IntToStr(skalarprodukt);

//Ausgeben des Vektorbetrages A
BetragA:= sqrt(sqr(VektorA[1])+sqr(VektorA[2])+sqr(VektorA[3]));
EditBetragA.Text:=FloatToStr(BetragA);

//Ausgeben des Vektorbetrages B
BetragB:= sqrt(sqr(VektorB[1])+sqr(VektorB[2])+sqr(VektorB[3]));
EditBetragB.Text:=FloatToStr(BetragB);

//Berechnen des Vektorenwinkels
cos_alpha:=skalarprodukt/(BetragA*BetragB);
EditCoswinkel.Text:=FloatToStr(cos_alpha);
EditWinkel.Text:=FloatToStr(BogenZuGrad(alphaGrad));
end;

end.

Geändert von JulianT ( 8. Mär 2015 um 21:05 Uhr)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#2

AW: Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 21:06
Hallo!
Ohne deinen Code erst mal genauer zu analysieren: warum benutzt du nicht die Standard-Unit System.Math? Wahrscheinlich weil du nichts von ihr wusstest.
Einfach in die "uses" Liste aufnehmen. In System.Math sind Funktion für Umwandlung Bogenmaß<->Grad vorhanden (DegToRad, RadToDeg), sowie ArcCos und mehr.
Wenn du ein neueres Delphi hast, gibt es auch System.Math.Vectors, wo 3x3 und 4x4 Matrizen definiert sind sowie die passenden Vektoren, inklusive Skalarprodukt.


Edit: In der letzten Zeile benutzt du die lokale Variable "alphaGrad", aber die wurde vorher gar nicht initialisiert!
Statt des alten "Real" Datentyps solltest du auch besser "Single" (32 Bit) oder "Double" (64 Bit) benutzen. "Real" war mal 48 Bit, entspricht aber in neueren Delphi-Versionen "Double".

Geändert von SMO ( 8. Mär 2015 um 21:14 Uhr)
  Mit Zitat antworten Zitat
JulianT
(Gast)

n/a Beiträge
 
#3

AW: Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 21:29
Hallo!
Ohne deinen Code erst mal genauer zu analysieren: warum benutzt du nicht die Standard-Unit System.Math? Wahrscheinlich weil du nichts von ihr wusstest.
Einfach in die "uses" Liste aufnehmen. In System.Math sind Funktion für Umwandlung Bogenmaß<->Grad vorhanden (DegToRad, RadToDeg), sowie ArcCos und mehr.
Wenn du ein neueres Delphi hast, gibt es auch System.Math.Vectors, wo 3x3 und 4x4 Matrizen definiert sind sowie die passenden Vektoren, inklusive Skalarprodukt.


Edit: In der letzten Zeile benutzt du die lokale Variable "alphaGrad", aber die wurde vorher gar nicht initialisiert!
Statt des alten "Real" Datentyps solltest du auch besser "Single" (32 Bit) oder "Double" (64 Bit) benutzen. "Real" war mal 48 Bit, entspricht aber in neueren Delphi-Versionen "Double".
Hi! Da alle immer sagen wir kriegen aktuelles Wissen in der Schule vermittelt, kann ich nun sagen, dem ist nicht so.^^

Wir kriegen mit Büchern, die 1999 verfasst wurden unser Wissen darüber und arbeiten eben dadurch mit Angaben wie Real, Integer usw.

Zum Ersten von dir Erwähnten.. Ich habe die Funktionen RadToDeg und umgekehrt schon gefunden gehabt im Inet, jedoch fand ich keine Unit, die das umfasst, wieder einen Schritt schlauer. Und zum anderen Erwähnten: Dieses mit den vordefinierten Matrizen kann ich nicht nutzen, da unser Informatiklehrer es so haben will, dass man eben Edits hat und über selbst erstellte Funktionen bzw Anweisungen das so ausgibt. Selbst wenn ich das machen würde, müsste er wahrscheinlich ein Wochenende darüber studieren, was ich ihm da hingeklatscht habe
Außerdem hatte ich Vektorenrechnung im Mathematikunterricht noch nicht.. Es dient nur der Einarbeitung mit Arrays halber. Wir arbeiten also quasi nur mit Formeln ohne den genauen mathematischen Hintergrund zu kennen.


Nun zum Code...
Unser Lehrer gab uns schon die zu deklarierenden Werte vor, ebenfalls verstehe ich auch inhaltlich nicht, wieso da eine ArcTan Funktion drinne ist (Arcus Tangens hatte ich bis dato auch noch nicht in Mathe) Und alphabog war schon vorgegeben, ich hatte eine halbe Stunde lang rumprobiert um den richtigen Winkel zu errechnen, im Endeffekt steht zu gut Deutsch 'Kacke' da, blendet es einfach aus^^ Würde mich nun freuen, wenn man mir zeigen könnte, wie ein valider Code für entsprechende Stelle aussieht.

Gruß Julian
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 21:50
Aha, also eine Hausaufgabe?

Wie bereits gesagt, du benutzt am Ende die Variable alphaGrad, ohne sie vorher initialisiert zu haben. Da muss also Müll in "EditWinkel" rauskommen.
Der Cosinus des Winkels zwischen zwei Vektoren entspricht dem Skalarprodukt beider Vektoren geteilt durch das Produkt ihrer Beträge.
Wenn du also den Winkel selbst haben willst, nicht seinen Cosinus, musst du die Umkehrfunktion des Cosinus anwenden. Das ist ArcCos. Ist hier eben basierend auf ArcTan implementiert.

Ich könnte dir natürlich eine fertige Lösung hinschreiben, aber denke lieber selbst noch mal nach. Wie kommst du von cos_alpha (Cosinus des gesuchten Winkels im Bogenmaß) auf alphaGrad (gesuchter Winkel in Grad)? Du hast alles gegeben, was du brauchst.
  Mit Zitat antworten Zitat
Frank Ranis

Registriert seit: 15. Okt 2008
17 Beiträge
 
#5

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 05:57
Hallo Julian,

schau dir diese beiden Seiten mal an.
Vor allem die erste.

http://wiki.delphigl.com/index.php/T...ineare_Algebra
http://wiki.delphigl.com/index.php/Tutorial_Nachsitzen

Gruß

Frank
  Mit Zitat antworten Zitat
JulianT
(Gast)

n/a Beiträge
 
#6

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 06:59
Dankesehr, der Ansatz mit dem ArcCos hat mir sehr geholfen!

Delphi-Quellcode:
//Berechnen des Vektorenwinkels
cos_alpha:=skalarprodukt/(BetragA*BetragB);
EditCoswinkel.Text:=FloatToStr(cos_alpha);
alphabog:=ArcCos(cos_alpha);
alphagrad:= BogenZuGrad(alphabog);
EditWinkel.Text:=FloatToStr(alphagrad);

Sollte jetzt alles richtig sein

6o3l7.png

Ich würde die Ergebnisse nun noch gerne runden, die anderen 3 Edits programmiere ich später. Runden ging glaube ich mit FloatToStrF und ffFixed irgendwie, oder? Wie würde eine Codezeile aussehen, wenn ich auf 3 Nachkommastellen runden möchte?
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz