AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Umrechnung Kosinuswert/Winkel

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

n/a Beiträge
 
#1

Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 21: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 22: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, 22: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 22:14 Uhr)
  Mit Zitat antworten Zitat
JulianT
(Gast)

n/a Beiträge
 
#3

AW: Umrechnung Kosinuswert/Winkel

  Alt 8. Mär 2015, 22: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, 22: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, 06: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, 07: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 08:06
Runden ging glaube ich mit FloatToStrF und ffFixed irgendwie, oder?
Ähhh, nein?

Runden = Delphi-Referenz durchsuchenRound, Delphi-Referenz durchsuchenRoundTo, Delphi-Referenz durchsuchenTrunc usw.,
aber die Ausgabe in einem "bestimmten Format" ginge natürlich auch mit Delphi-Referenz durchsuchenFormat oder Delphi-Referenz durchsuchenFloatToStrF (F wie Format).

Aber wenn man mal in die Hilfe (F1) schauen würde, dann stünde dort alles Wichtige drin, wie man etwas benutzt, bzw. was man den Parametern übergeben müsste, vorallem wenn man den gewünschten Befehl schon kennt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
JulianT
(Gast)

n/a Beiträge
 
#8

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 08:23
Runden ging glaube ich mit FloatToStrF und ffFixed irgendwie, oder?
Ähhh, nein?

Runden = Delphi-Referenz durchsuchenRound, Delphi-Referenz durchsuchenRoundTo, Delphi-Referenz durchsuchenTrunc usw.,
aber die Ausgabe in einem "bestimmten Format" ginge natürlich auch mit Delphi-Referenz durchsuchenFormat oder Delphi-Referenz durchsuchenFloatToStrF (F wie Format).

Aber wenn man mal in die Hilfe (F1) schauen würde, dann stünde dort alles Wichtige drin, wie man etwas benutzt, bzw. was man den Parametern übergeben müsste, vorallem wenn man den gewünschten Befehl schon kennt.
Ich sagte ja bereits, dass das ein Nachteil ist, wenn man Wissen aus den 2000ern vermittelt bekommt und der Lehrer so wirkt, als hätte er das irgendwann mal auswendig gelernt.^^

Ich hab jetzt noch ein Problem mit den Datentypen Extended und Integer. Das Skalarprodukt ist als Integerwert deklariert, die Function RoundTo arbeitet ja laut Wiki mit Extended, was natürlich eine Inkompatibilität zur Folge hat. Ich weiß, dass ich mich jetzt ein bisschen dämlich anstelle, aber ich möchte wirklich gerne wissen, wie ich mit RoundTo arbeite, denn ich würde lieber neues kennenlernen, als mich nur auf dem alten dann auszuruhen. Und keine Sorge ich arbeite das noch nach, aber aktuell stockt es etwas, deswegen schon einmal Entschuldigung für meine Fragen.


EDIT:

Habe es nun über das Format mit FloatToStrF gemacht, klappt auch ganz gut, jedoch wäre ich wirklich mal an einer Umsetzung mit dem Typen RoundTo interessiert.

Code:
//Ausgeben des Vektorbetrages A
BetragA:= sqrt(sqr(VektorA[1])+sqr(VektorA[2])+sqr(VektorA[3]));
EditBetragA.Text:=FloatToStrF(BetragA,ffFixed,5,2);

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

//Berechnen des Vektorenwinkels
cos_alpha:=skalarprodukt/(BetragA*BetragB);
EditCoswinkel.Text:=FloatToStr(cos_alpha);
alphabog:=ArcCos(cos_alpha);
alphagrad:= BogenZuGrad(alphabog);
EditWinkel.Text:=FloatToStrF(alphagrad,ffFixed,5,2);

Geändert von JulianT ( 9. Mär 2015 um 08:40 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 09:22
Habe es nun über das Format mit FloatToStrF gemacht, klappt auch ganz gut, jedoch wäre ich wirklich mal an einer Umsetzung mit dem Typen RoundTo interessiert.
Dann schau dir doch die Online-Hilfe zu RoundTo an, die gibt's sogar in deutscher Sprache. Bei RoundTo gibst du zwei Parameter an:

function RoundTo(const AValue: Extended; const ADigit: TRoundToEXRangeExtended): Extended; Der erste ist der Wert, der gerundet werden soll, der zweite gibt die Potenz von 10 an, auf die AValue gerundet werden soll. Mit anderen Worten: ein positiver ADigit beschreibt die Stellen vor dem Komma, die gerundet werden sollen, ein negativer ADigit beschreibt die Stellen hinter dem Komma, die gerundet werden sollen.

Die Delphipraxis bietet übrigens eine Delphi-Referenz als Suchmaschine an.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Umrechnung Kosinuswert/Winkel

  Alt 9. Mär 2015, 09:25
Du musst unterscheiden zwischen dem Wert und der Anzeige. Bei der Anzeige wird die Interpretation des Werts als ein String angezeigt, den Wert selber kann ich nicht anzeigen.

Du willst hier aber nur die Werte anzeigen - brauchst also die String-Interpretationen der Werte - und dafür ist FloatToStr doch genau richtig.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:02 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