using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Numerics;
using System.Windows.Forms;
namespace _2DTest
{
public partial class Form1 : Form
{
private Transformable2D transformable = new Transformable2D();
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Wende die Transformation auf die Grafik an
e.Graphics.Transform = transformable.GetTransformationMatrix();
// Beispielcode für die Verwendung von Vector2 und Punkten
Vector2 point1 = new Vector2(50, 50);
Vector2 point2 = new Vector2(100, 100);
// Zeichne eine Linie zwischen den transformierten Punkten
e.Graphics.DrawLine(Pens.Black, point1.X, point1.Y, point2.X, point2.Y);
}
// Ereignishandler für Tastendrücke zum Testen der Transformationen
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
switch (e.KeyCode)
{
case Keys.W:
transformable.Translate(0, -10); // Bewegung nach oben
break;
case Keys.S:
transformable.Translate(0, 10); // Bewegung nach unten
break;
case Keys.A:
transformable.Translate(-10, 0); // Bewegung nach links
break;
case Keys.D:
transformable.Translate(10, 0); // Bewegung nach rechts
break;
case Keys.R:
transformable.Rotate(15); // Rotation im Uhrzeigersinn um 15 Grad
break;
case Keys.E:
transformable.Rotate(-15); // Rotation gegen den Uhrzeigersinn um 15 Grad
break;
case Keys.Q:
transformable.Scale(1.1f, 1.1f); // Skalierung um 10%
break;
case Keys.Z:
transformable.Scale(0.9f, 0.9f); // Skalierung um 10% verkleinern
break;
}
// Erzwinge ein Neuzeichnen des Formulars
Invalidate();
}
}
public class Transformable2D
{
private PointF position;
private float rotation;
private SizeF scale;
public Transformable2D()
{
position = Point.Empty;
rotation = 0f;
scale = new SizeF(1, 1);
}
public void Translate(float dx, float dy)
{
position.X += dx;
position.Y += dy;
}
public void Rotate(float angleInDegrees)
{
rotation += angleInDegrees;
}
public void Scale(float scaleX, float scaleY)
{
scale.Width *= scaleX;
scale.Height *= scaleY;
}
public Matrix GetTransformationMatrix()
{
Matrix matrix = new Matrix();
matrix.Translate(position.X, position.Y);
matrix.Rotate(rotation);
matrix.Scale(scale.Width, scale.Height);
return matrix;
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Numerics;
using System.Windows.Forms;
namespace _3DTest
{
public partial class Form1 : Form
{
private Timer timer1;
private Transformable3D cubeTransform;
private float TranslationSpeed = 5f;
private float RotationSpeed = 0.05f;
private float ScaleSpeed = 0.1f;
public Form1()
{
InitializeComponent();
this.KeyDown += Form1_KeyDown;
cubeTransform = new Transformable3D();
InitializeCube();
// Initialisiere den Timer
timer1 = new Timer();
timer1.Interval = 16; // ungefähr 60 fps
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void InitializeCube()
{
// Definiere die Eckpunkte des Würfels
List cubePoints = new List
{
new Vector3(-1, -1, -1),
new Vector3(1, -1, -1),
new Vector3(1, 1, -1),
new Vector3(-1, 1, -1),
new Vector3(-1, -1, 1),
new Vector3(1, -1, 1),
new Vector3(1, 1, 1),
new Vector3(-1, 1, 1),
};
// Setze die Punkte für den Würfel in der Transformable3D-Instanz
cubeTransform.SetPoints(cubePoints);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// Verarbeite Tastendrücke für Bewegung, Rotation und Skalierung
switch (e.KeyCode)
{
// Bewegung
case Keys.Left:
cubeTransform.Translate(new Vector3(-TranslationSpeed, 0, 0));
break;
case Keys.Right:
cubeTransform.Translate(new Vector3(TranslationSpeed, 0, 0));
break;
case Keys.Up:
cubeTransform.Translate(new Vector3(0, -TranslationSpeed, 0));
break;
case Keys.Down:
cubeTransform.Translate(new Vector3(0, TranslationSpeed, 0));
break;
// Rotation
case Keys.A:
cubeTransform.Rotate(new Vector3(0, 0, RotationSpeed));
break;
case Keys.D:
cubeTransform.Rotate(new Vector3(0, 0, -RotationSpeed));
break;
case Keys.W:
cubeTransform.Rotate(new Vector3(RotationSpeed, 0, 0));
break;
case Keys.S:
cubeTransform.Rotate(new Vector3(-RotationSpeed, 0, 0));
break;
// Skalierung
case Keys.Add:
cubeTransform.Scale(new Vector3(1 + ScaleSpeed, 1 + ScaleSpeed, 1 + ScaleSpeed));
break;
case Keys.Subtract:
cubeTransform.Scale(new Vector3(1 - ScaleSpeed, 1 - ScaleSpeed, 1 - ScaleSpeed));
break;
}
// Aktualisiere die Zeichenfläche nach jeder Änderung
Refresh();
}
private void timer1_Tick(object sender, EventArgs e)
{
Refresh();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Rufe die Transformationsmatrix des Würfels ab
Matrix4x4 transformationMatrix = cubeTransform.GetTransformationMatrix();
// Wende die Transformation auf jeden Punkt des Würfels an
List transformedPoints = cubeTransform.TransformPoints(transformationMatrix);
// Zeichne die Linien des Würfels
using (var pen = new Pen(Color.Black))
{
// Zeichne die Kanten des Würfels
for (int i = 0; i < 4; i++)
{
PointF point1 = new PointF(transformedPoints[i].X, transformedPoints[i].Y);
PointF point2 = new PointF(transformedPoints[(i + 1) % 4].X, transformedPoints[(i + 1) % 4].Y);
e.Graphics.DrawLine(pen, point1, point2);
point1 = new PointF(transformedPoints[i + 4].X, transformedPoints[i + 4].Y);
point2 = new PointF(transformedPoints[((i + 1) % 4) + 4].X, transformedPoints[((i + 1) % 4) + 4].Y);
e.Graphics.DrawLine(pen, point1, point2);
point1 = new PointF(transformedPoints[i].X, transformedPoints[i].Y);
point2 = new PointF(transformedPoints[i + 4].X, transformedPoints[i + 4].Y);
e.Graphics.DrawLine(pen, point1, point2);
}
// Zeichne die Kanten zwischen den Ecken
for (int i = 0; i < 4; i++)
{
PointF point1 = new PointF(transformedPoints[i].X, transformedPoints[i].Y);
PointF point2 = new PointF(transformedPoints[(i + 4) % 8].X, transformedPoints[(i + 4) % 8].Y);
e.Graphics.DrawLine(pen, point1, point2);
}
}
}
}
public class Transformable3D
{
private List points;
public Transformable3D()
{
points = new List();
}
public void SetPoints(List newPoints)
{
points = newPoints;
}
public void Translate(Vector3 translation)
{
for (int i = 0; i < points.Count; i++)
{
points[i] += translation;
}
}
public void Rotate(Vector3 rotation)
{
Matrix4x4 rotationMatrixX = Matrix4x4.CreateRotationX(rotation.X);
Matrix4x4 rotationMatrixY = Matrix4x4.CreateRotationY(rotation.Y);
Matrix4x4 rotationMatrixZ = Matrix4x4.CreateRotationZ(rotation.Z);
Matrix4x4 combinedRotation = rotationMatrixX * rotationMatrixY * rotationMatrixZ;
for (int i = 0; i < points.Count; i++)
{
points[i] = Vector3.Transform(points[i], combinedRotation);
}
}
public void Scale(Vector3 scale)
{
for (int i = 0; i < points.Count; i++)
{
points[i] *= scale;
}
}
public Matrix4x4 GetTransformationMatrix()
{
return Matrix4x4.Identity;
}
public List TransformPoints(Matrix4x4 transformationMatrix)
{
List transformedPoints = new List();
foreach (var point in points)
{
transformedPoints.Add(Vector3.Transform(point, transformationMatrix));
}
return transformedPoints;
}
}
}