AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Drehung eines Körpers um eine beliebige Achse
Thema durchsuchen
Ansicht
Themen-Optionen

Drehung eines Körpers um eine beliebige Achse

Ein Thema von Ben19 · begonnen am 5. Mai 2009 · letzter Beitrag vom 2. Jun 2009
Antwort Antwort
Seite 2 von 3     12 3      
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#11

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 5. Mai 2009, 17:37
Ja ok
Nochmals vielen Dank für die schnellen Antworten.
Ich werde das alles einmal ausprobieren und falls dann noch etwas unklar ist bzw Fehler auftreten,
mich hier im Forum melden. Für eine Antwort wäre ich dir sehr dankbar.
Vielen Dank Ben19
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 5. Mai 2009, 20:36
Ich hab mir doch noch ein paar Gedanken gemacht und kurzerhand mal was programmiert

Man kann den Würfel um die verschiedenen Achsten drehen, mittels der Trackbars unten.

Man kann die Projektion auswählen

Man kann dem lustigen Farbenspiel zusehen, weil ich nicht die Muße hatte, die Flächen einzeln zu färben.

Hier ist der Code:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Test_1
{
    public partial class Form1 : Form
    {
        PointF offset;

        Vector3D[] Punkte;

        Matrix3x3 RotX;
        Matrix3x3 RotY;
        Matrix3x3 RotZ;

        Pen pen;
        Brush brush;

        Projektion p;

        public Form1()
        {
            InitializeComponent();

            offset = new PointF(300, 200);

            Punkte = new Vector3D[8];

            Punkte[0] = new Vector3D(-100, -100, 100);
            Punkte[1] = new Vector3D(100, -100, 100);
            Punkte[2] = new Vector3D(100, 100, 100);
            Punkte[3] = new Vector3D(-100, 100, 100);
            Punkte[4] = new Vector3D(-100, 100, -100);
            Punkte[5] = new Vector3D(100, 100, -100);
            Punkte[6] = new Vector3D(100, -100, -100);
            Punkte[7] = new Vector3D(-100, -100, -100);

            RotX = new Matrix3x3();
            RotY = new Matrix3x3();
            RotZ = new Matrix3x3();

            pen = new Pen(Color.Blue);
            pen.Width = 3;
            brush = new SolidBrush(Color.Red);

            p = Projektion.Zentral;
        }

        public void Draw()
        {
            pictureBox1.Invalidate();
        }

        public Vector3D Multiply(Matrix3x3 A, Vector3D b)
        {
            Vector3D Result;
            Result.X = A[0, 0] * b.X + A[0, 1] * b.Y + A[0, 2] * b.Z;
            Result.Y = A[1, 0] * b.X + A[1, 1] * b.Y + A[1, 2] * b.Z;
            Result.Z = A[2, 0] * b.X + A[2, 1] * b.Y + A[2, 2] * b.Z;
            return Result;
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Vector3D[] Points = (Vector3D[])Punkte.Clone();

            // Rotation
            for (int i = 0; i < Points.Length; i++)
            {
                Points[i] = Multiply(RotX, Points[i]);
            }

            // Rotation
            for (int i = 0; i < Points.Length; i++)
            {
                Points[i] = Multiply(RotY, Points[i]);
            }

            // Rotation
            for (int i = 0; i < Points.Length; i++)
            {
                Points[i] = Multiply(RotZ, Points[i]);
            }


            PointF[] dp = new PointF[Points.Length];

            for (int i = 0; i < Points.Length; i++)
            {
                dp[i] = Points[i].ToPoint(p);
                dp[i].X += offset.X;
                dp[i].Y += offset.Y;

            }

            e.Graphics.FillPolygon(brush, dp);
            e.Graphics.DrawPolygon(pen, dp);
            e.Graphics.DrawLine(pen, dp[0], dp[3]);
            e.Graphics.DrawLine(pen, dp[4], dp[7]);
            e.Graphics.DrawLine(pen, dp[1], dp[6]);
            e.Graphics.DrawLine(pen, dp[2], dp[5]);
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            double alpha = trackBar1.Value * Math.PI / 180;
            RotX[1, 1] = (float)Math.Cos(alpha);
            RotX[1, 2] = -1 * (float)Math.Sin(alpha);
            RotX[2, 1] = (float)Math.Sin(alpha);
            RotX[2, 2] = (float)Math.Cos(alpha);
            Draw();
        }

        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            double alpha = trackBar2.Value * Math.PI / 180;
            RotY[0, 0] = (float)Math.Cos(alpha);
            RotY[0, 2] = -1 * (float)Math.Sin(alpha);
            RotY[2, 0] = (float)Math.Sin(alpha);
            RotY[2, 2] = (float)Math.Cos(alpha);
            Draw();
        }

        private void trackBar3_Scroll(object sender, EventArgs e)
        {
            double alpha = trackBar3.Value * Math.PI / 180;
            RotZ[0, 0] = (float)Math.Cos(alpha);
            RotZ[0, 1] = -1 * (float)Math.Sin(alpha);
            RotZ[1, 0] = (float)Math.Sin(alpha);
            RotZ[1, 1] = (float)Math.Cos(alpha);
            Draw();
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            Vector3D.effect = (float)numericUpDown1.Value / 10000f;
            Draw();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            p = radioButton1.Checked ? Projektion.Parallel : Projektion.Zentral;
            Draw();
        }
    }

    public enum Projektion {Parallel, Zentral};

    public struct Vector3D
    {
        public float X, Y, Z;

        public static float effect = 0.002f;

        public Vector3D(float x, float y, float z)
        {
            X = x;
            Y = y;
            Z = z;
        }

        public PointF ToPoint(Projektion art)
        {
            switch (art)
            {
                case Projektion.Parallel:
                    return new PointF(X, Y);
                case Projektion.Zentral:
                    return new PointF(X * (1 - effect * Z), Y * (1 - effect * Z));
                default:
                    throw new Exception();
            }
        }

        public void Add(Vector3D b)
        {
            X += b.X;
            Y += b.Y;
            Z += b.Z;
        }
    }

    public class Matrix3x3
    {
        private float[,] values;

        public Matrix3x3()
        {
            values = new float[3, 3];
            values[0, 0] = 1;
            values[1, 1] = 1;
            values[2, 2] = 1;
        }

        public float this[byte row, byte col]
        {
            get { return values[row, col]; }
            set { values[row, col] = value; }
        }

        public override String ToString()
        {
            String result = "";
            for (int i = 0; i < 3; i++)
            {
                result += "|  ";
                for (int j = 0; j < 3; i++)
                {
                    result += String.Format("%0.00" + Convert.ToChar(8), values[i, j]);
                }
                result += " |\r\n";
            }
            return result;
        }
    }
}
Programm im Anahng
Angehängte Dateien
Dateityp: exe test_1_445.exe (14,0 KB, 45x aufgerufen)
  Mit Zitat antworten Zitat
Namenloser

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

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 5. Mai 2009, 22:37
Zitat von jfheins:
Ich hab dir da mal ein Beispiel vorgerechnet ...
Danke auch noch mal von mir! Endlich mal eine verständliche Erklärung
  Mit Zitat antworten Zitat
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#14

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 6. Mai 2009, 23:09
Hey ich bins nochmal
Habe dein Beispiel mir noch einmal angeguckt und da sind mir noch zwei Fragen gekommen.
Zunächst gibt es für die Drehmatrizen eine Herleitung? und kann man auch um einen Punkt oder Gerade im Raum drehen? Denn muss man doch von dem jeweiligen Punkt bzw der Gerade die Vektoren zu den Eckpunkten bestimmen und die mit den Drehmatrizen multiplizieren oder?

Vielen Dank im vorraus
Ben19
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#15

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 6. Mai 2009, 23:38
Zitat von Ben19:
Hey ich bins nochmal
Habe dein Beispiel mir noch einmal angeguckt und da sind mir noch zwei Fragen gekommen.
Zunächst gibt es für die Drehmatrizen eine Herleitung?
Eine Herleitung der Drehmatrizen? naja man kann sie sich herleiten indem man schaut, wohin die Einheitsvektoren gedreht werden sollen (welche neuen Koordinaten die kriegen)
Ansonsten gibts ja auch noch die englische Wikiepdia: http://en.wikipedia.org/wiki/Rotation_matrix Da steht ne ganze Menge (nein, habs mir nicht durchgelesen)
Zitat:
und kann man auch um einen Punkt oder Gerade im Raum drehen? Denn muss man doch von dem jeweiligen Punkt bzw der Gerade die Vektoren zu den Eckpunkten bestimmen und die mit den Drehmatrizen multiplizieren oder?
Also man dreht immer um eine Gerade. Die "Drehgerade" ist genau die, die sich nicht ändert.

In dem Beispiel drehe ich quasi um einen Punkt (weil die Dreh-gerade senkrecht zur Bildebene steht) und zwart um den Mittelpunkt/Ursprung (mit O bezeichnet)

Wenn du das Quadrat nicht um den Ursprung legenb würdest, sondern z.B. die eine Ecke in den Ursprung, würde sich das ganze immernoch um den Ursprung drehen. D.h. der Mittelpunkt des Quadrats bewegt sich ebenfalls. (Ist dann eher ein Mix aus Rotation und Translation)

Aber im Normalfall möchtest du die Rotation von der Translation trennen, also um den Mittelpunkt des Objekts rotieren.
  Mit Zitat antworten Zitat
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#16

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 12. Mai 2009, 14:25
Hallo,
ich hätte noch ein Frage. Kann mir jemand bitte erklären wie ich z.B. ein Quadrat in einem 3D-Raum um eine beliebige Gerade(nicht um die Achsen) rotiere?
Hatte mich auch schon informiert, habe aber noch Probleme beim Verständnis.
Würde mich sehr über eine Antwort sehr freuen
Danke im voraus
Ben19
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#17

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 12. Mai 2009, 18:11
Die passende Drehmatrix bekommst du aus Wikiepdia:
http://upload.wikimedia.org/math/e/d...4f396333ac.png

Aus http://de.wikipedia.org/wiki/Drehmat...Raumes_R.C2.B3 unterster Punkt
  Mit Zitat antworten Zitat
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#18

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 12. Mai 2009, 22:04
Danke für die schnelle Antwort
Die hatte ich auch schon gefunden. Kann mir aber nicht erklären wie die zustande kommt oder wie ich so etwas berechne:S
Wäre echt nett, wenn du mir das noch einmal erklären könntest
vielen Dank im vorraus
Ben19
  Mit Zitat antworten Zitat
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#19

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 30. Mai 2009, 01:15
Hey Leute
ich bin es wieder . Beim programieren bin ich auf einen weiteres Problem gestoßen
Habe ein Probleme die Rotationsachse um eine beliebige Achse in Delphi einzubinden.
Rotationsachse
http://upload.wikimedia.org/math/e/d...4f396333ac.png
Wie muss ich die Gleichung in Delphi schreiben?
Muss ich wirklich immer den selben Winkel (hier alpha) drehen?
Wäre echt nett wenn ich mir das erklären könntet.
Vielen Dank im voraus
Ben19
  Mit Zitat antworten Zitat
Ben19

Registriert seit: 25. Feb 2009
17 Beiträge
 
#20

Re: Drehung eines Körpers um eine beliebige Achse

  Alt 30. Mai 2009, 12:51
sry ich meine oben natürlich nicht Rotationsachse sondern Rotationsmatrix
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 21:39 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