AGB  ·  Datenschutz  ·  Impressum  







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

Matrix 90 Grad um Z-Achse drehen

Ein Thema von Bjoerk · begonnen am 14. Jan 2016 · letzter Beitrag vom 18. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 12:45
Ich hab eine Matrix, die sieht so aus. Diese Matrix ist bezüglich dieses KOO definiert.
Code:
 Z
 |     Y
 |   .
 | .
-|------ X
Delphi-Quellcode:
function TZzBeamTools.BeamSmLc(const E, G, Iy, It, x1, y1, x2, y2: double): TZzFloatMat1212;
var
  I, J: integer;
  S, SS, SSS, EIy, GIt : double;
begin
  GIt := G * It;
  EIy := E * Iy;

  S := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1)); // z1 = z2 = 0;
  SS := S * S;
  SSS := SS * S;

  for I := 1 to 12 do
    for J := 1 to 12 do
      Result[I, J] := 0;

  // Result[I, J] = Schnittkraft Si infolge Vj;
  // Si: Q = Querkraft, M = Moment;
  // Vj: V = Verschiebung, Phi = Verdrehung;

  Result[3, 3] := 12 * EIy / SSS; // S3(= Q.Z.L) infolge V3(= V.Z.L) = 1;
  Result[3, 5] := -6 * EIy / SS; // S3(= Q.Z.L) infolge V5(= Phi.Y.L) = 1;
  Result[3, 9] := -12 * EIy / SSS; // S3(= Q.Z.L) infolge V9(= V.Z.R) = 1;
  Result[3, 11] := -6 * EIy / SS; // S3(= Q.Z.L) infolge V11(= Phi.Y.R) = 1;

  Result[4, 4] := GIt / S; // S4(= M.X.L) infolge V4(= Phi.X.L) = 1;
  Result[4, 10] := -GIt / S; // S4(= M.X.L) infolge V10(= Phi.X.R) = 1;

  Result[5, 5] := 4 * EIy / S; // S5(= M.Y.L) infolge V5(= Phi.Y.L) = 1;
  Result[5, 9] := 6 * EIy / SS; // S5(= M.Y.L) infolge V9(= V.Z.R) = 1;
  Result[5, 11] := 2 * EIy / S; // S5(= M.Y.L) infolge V11(= Phi.Y.R) = 1;

  Result[9, 9] := 12 * EIy / SSS; // S9(= Q.Z.R) infolge V9(= V.Z.R) = 1;
  Result[9, 11] := 6 * EIy / SS; // S9(= Q.Z.R) infolge V11(= Phi.Y.R) = 1;

  Result[10, 10] := GIt / S; // S10(= M.X.R) infolge V10(= Phi.X.R) = 1;

  Result[11, 11] := 4 * EIy / S; // S11(= M.Y.R) infolge V11(= Phi.Y.R) = 1;

  for I := 1 to 11 do
    for J := I + 1 to 12 do
      Result[J, I] := Result[I, J]; // Symmetrisch ergänzen;
end;
Damit ich diese Matrix weiterverarbeiten kann, brauche ich sie bezüglich dieses KOO-Systems.
Code:
       Z
       |     X
       |   .
       | .
Y -----|-
Nun wollte ich die Matrix 90 Grad um die Z-Achse drehen. Weiß jemand wie das geht?
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#2

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 13:44
Ewig her, deswegen bekomm ich nicht mehr alles auf die Kette. Aber für meinen SoftwareRenderer habe ich mir seinerzeit ne Unit mit entsprechenden Klassen geschrieben.
https://github.com/Memnarch/Software...ter/Math3D.pas

Dort kannst du eine Matrix als Rotationsmatrix initialisieren (X, Y oder Z). Diese ließe sich dann mit deiner Matrix multiplizieren.

Vielleicht kann es dir (etwas helfen). Meine Z-Achse müsste ebenfalls UP-Orientiert gewesen sein.

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 13:46
Nun wollte ich die Matrix 90 Grad um die Z-Achse drehen. Weiß jemand wie das geht?
Drehmatrix?

Bin etwas verwirrt von deiner Frage. Die Skizze von deinem Koordinatensystem hat drei Dimensionen, aber die Matrix in deinem Code ist offenbar 12-dimensional. Bei mehr als drei Dimensionen kann man nicht um eine "Achse" rotieren, sondern muss in einer Ebene rotieren. Wie das geht, steht aber auch in dem Wikipedia-Artikel im Abschnitt Drehmatrizen des Raumes R^n.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 14:01
[...] aber die Matrix in deinem Code ist offenbar 12-dimensional[...]
Da war ich mal wieder nicht aufmerksam. Wie passt den dass mit dem 3D-Bild o.O
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 14:07
Ist seine Matrix nicht 2-dimensional, mit je 12 Einheiten pro Achse?

Aber zum Glück weiß ja keiner wie TZzFloatMat1212 definiert ist.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 14:16
Sieht für mich eher nach 12x12 aus .. wobei da unten wird irgendwie noch symmetrisch ergänzt
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (14. Jan 2016 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 14:34
Ist 3-dimenional und ein array 12 x 12. Zz ist meine persönliche Abkürzung für Zienkiewicz. Die 12 kommen aus drei Verschiebungen und drei Verdrehungen links und rechts am Element.

Code:
v.x.left
v.y.left
v.z.left
p.x.left
p.y.left
p.z.left
v.x.right
v.y.right
v.z.right
p.x.right
p.y.right
p.z.right
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 14. Jan 2016, 16:10
Habs jetzt. Man kann hier einfach die Koordinaten X und Y vertauschen (X = -Y, Y = X). Die Matrix muß eh später in ein globales Bezugssystem transformiert werden, damit kann man es erledigen.
Delphi-Quellcode:
function TZzBeamTools.SmGc(const E, G, Iy, It, x1, y1, x2, y2: double): TZzFloatMat66; // Unterzüge: z1 = z2 = 0;
var
  I, J: integer;
  ASmLc, ASmGc, T: TZzFloatMat1212; // SmLc = StiffnessMatrixLocalCoordinates, SmGc = .. Global Coo.
begin
  for I := 1 to 6 do
    for J := 1 to 6 do
      Result[I, J] := 0;
  if (Iy > 1E-8) and (It > 1E-8) and (Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1)) > 1E-8) then
  begin
    ASmLc := BeamSmLc(E, G, Iy, It, x1, y1, x2, y2); // 12x12 XYZ;
    T := TransformationMatrix(-y1, x1, -y2, x2); // *** T bezügl. YXZ ***
    ASmGc := SmLcToSmGc(ASmLc, T); // SmLc * T,trans * T; 12x12 XYZ to 12x12 YXZ
    Result := BeamSmGcToPlateSmGc(ASmGc); // 12x12 YXZ to 6x6 YXZ;
  end;
end;
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 15. Jan 2016, 23:40
Der Vollständigkeit halbar ein Mal kurz Klughscheißmodus:
Du wolltest gar nicht eine Matrix drehen. Du wolltest 4 Vektoren drehen, die du bloß ziemlich ungewöhnlich in ein Array geschrieben hast. (Edit: Ich vermute diese Matrixform brauchst du später für etwas anderes, aber eine 3D-Matrix die man in einer Operation drehen könnte ist es nicht. Du willst viel mehr die einzelnen Vektoren, aus denen deine Matirx gebildet wird drehen.) Und bei 3D-Vektoren kann man in der Tat sehr einfach (90° um eine Achse*) drehen, in dem man die beiden Koordinaten die nicht zur Drehachse gehören vertauscht und einen davon negiert. (Geht auch in 2D, da einfach beide Koords tauschen und einen negieren.) Dasselbe passiert in diesen Fällen auch bei Anwendung einer Drehmatrix.

*) Will man um einen beliebigen Vektor und/oder beliebigen Winkel drehen, kommt o.g. Drehmatrix zwangsläufig ins Spiel. Mit der muss dann der zu drehende Vektor multipliziert werden.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (15. Jan 2016 um 23:44 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Matrix 90 Grad um Z-Achse drehen

  Alt 17. Jan 2016, 11:21
Ok. Dank dir für die Info. Diese Schreibweise ist für solche Probleme jedoch üblich. Man passt lieber die Transformationsmatrix an.
Code:
E11 E12 E13
E21 E22 E23                      Null
E31 E32 E33
           E11 E12 E13
           E21 E22 E23
           E31 E32 E33
                      E11 E12 E13
                      E21 E22 E23
                      E31 E32 E33
                                 E11 E12 E13
Null                            E21 E22 E23
                                 E31 E32 E33
  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 00:51 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