KaPiTN
Boomer ♪♪♫♪♫♫♪
- Registriert
- 14 Juli 2013
- Beiträge
- 22.329
Ich habe gestern etwas absolut nutzloses gebaut, einfach weil ich das schon seit vielen Jahren mal machen wollte.
Zu nichts zu gebrauchen, aber ein Häkchen auf der bucketlist.
Bin-Datei
Anhang anzeigen Cube.zip
Code
Drehen um 3 Achsen:
1)A und D
2)W und S
3)Q und E
Space: Umschalten Ansichten Koordinatensystem und räumliche Verkürzung
Zu nichts zu gebrauchen, aber ein Häkchen auf der bucketlist.

You do not have permission to view link please Anmelden or Registrieren
Bin-Datei
Anhang anzeigen Cube.zip
Code
[src=csharp]using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace Cube
{
public partial class Form1 : Form
{
private const int LengthOfHalfEdge = 100;
private readonly CubeCorner _cC1;
private readonly CubeCorner _cC2;
private readonly CubeCorner _cC3;
private readonly CubeCorner _cC4;
private readonly CubeCorner _cC5;
private readonly CubeCorner _cC6;
private readonly CubeCorner _cC7;
private readonly CubeCorner _cC8;
private readonly List<CubeCorner> _cubeCorners = new List<CubeCorner>();
private bool _isCartesian = true;
private bool _keyPressed;
private Rotation _rotation = Rotation.None;
public Form1()
{
InitializeComponent();
KeyDown += (Form1_KeyDown);
KeyUp += (Form1_KeyUp);
timer1.Tick += (timer1_Tick);
Paint += (Form1_Paint);
_cC1 = new CubeCorner();
_cC2 = new CubeCorner();
_cC3 = new CubeCorner();
_cC4 = new CubeCorner();
_cC5 = new CubeCorner();
_cC6 = new CubeCorner();
_cC7 = new CubeCorner();
_cC8 = new CubeCorner();
_cubeCorners.Add(_cC1);
_cubeCorners.Add(_cC2);
_cubeCorners.Add(_cC3);
_cubeCorners.Add(_cC4);
_cubeCorners.Add(_cC5);
_cubeCorners.Add(_cC6);
_cubeCorners.Add(_cC7);
_cubeCorners.Add(_cC8);
}
private void timer1_Tick(object sender, EventArgs e)
{
if (_keyPressed) RotateCube();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
_keyPressed = true;
if (e.KeyCode == Keys.Space)
SwitchView();
switch (e.KeyCode)
{
case Keys.W:
_rotation = Rotation.YUp;
break;
case Keys.S:
_rotation = Rotation.YDown;
break;
case Keys.A:
_rotation = Rotation.XLeft;
break;
case Keys.D:
_rotation = Rotation.XRight;
break;
case Keys.Q:
_rotation = Rotation.ZLeft;
break;
case Keys.E:
_rotation = Rotation.ZRight;
break;
default:
return;
}
RotateCube();
}
private void SwitchView()
{
_isCartesian = !_isCartesian;
Convert();
Refresh();
Text = _isCartesian ? "Cube Cartesian" : "Cube Perspective";
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
var pen = new Pen(Color.Red);
e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC2.D2X, _cC2.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC3.D2X, _cC3.D2Y);
e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC4.D2X, _cC4.D2Y);
e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC1.D2X, _cC1.D2Y);
pen = new Pen(Color.Blue);
e.Graphics.DrawLine(pen, _cC5.D2X, _cC5.D2Y, _cC6.D2X, _cC6.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC6.D2X, _cC6.D2Y, _cC7.D2X, _cC7.D2Y);
e.Graphics.DrawLine(pen, _cC7.D2X, _cC7.D2Y, _cC8.D2X, _cC8.D2Y);
e.Graphics.DrawLine(pen, _cC8.D2X, _cC8.D2Y, _cC5.D2X, _cC5.D2Y);
e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC5.D2X, _cC5.D2Y);
pen = new Pen(Color.Yellow);
e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC6.D2X, _cC6.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC7.D2X, _cC7.D2Y);
e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC8.D2X, _cC8.D2Y);
}
private void RotateCube()
{
if (_keyPressed)
Set();
_rotation = Rotation.None;
Refresh();
Invalidate();
}
private void Calculate()
{
foreach (CubeCorner corner in _cubeCorners)
{
double x;
double y;
switch (_rotation)
{
case Rotation.XRight:
x = corner.D3X;
y = corner.D3Z;
Do(ref x, ref y, 1);
corner.D3X = x;
corner.D3Z = y;
break;
case Rotation.XLeft:
x = corner.D3X;
y = corner.D3Z;
Do(ref x, ref y, -1);
corner.D3X = x;
corner.D3Z = y;
break;
case Rotation.YUp:
x = corner.D3Z;
y = corner.D3Y;
Do(ref x, ref y, 1);
corner.D3Z = x;
corner.D3Y = y;
break;
case Rotation.YDown:
x = corner.D3Z;
y = corner.D3Y;
Do(ref x, ref y, -1);
corner.D3Z = x;
corner.D3Y = y;
break;
case Rotation.ZRight:
x = corner.D3X;
y = corner.D3Y;
Do(ref x, ref y, -1);
corner.D3X = x;
corner.D3Y = y;
break;
case Rotation.ZLeft:
x = corner.D3X;
y = corner.D3Y;
Do(ref x, ref y, 1);
corner.D3X = x;
corner.D3Y = y;
break;
}
}
}
private void Do(ref double x, ref double y, int direction)
{
double distance = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2.0)); //141.42;
double ang = Math.Atan2(y, x)*180.0/Math.PI;
if (ang < 360) ang += 360;
ang += direction;
double deg = ang/180.0*Math.PI;
x = (Math.Cos(deg)*distance);
y = (Math.Sin(deg)*distance);
}
private void Set()
{
Calculate();
Convert();
}
private void Convert()
{
foreach (CubeCorner corner in _cubeCorners)
{
if (_isCartesian)
{
corner.D2X = pictureBox1.Width/2 + (int) corner.D3X;
corner.D2Y = pictureBox1.Height/2 - (int) corner.D3Y;
}
else
{
double dist = Math.Abs(corner.D3Z - LengthOfHalfEdge);
double factor = 1 - 0.125*dist/100;
corner.D2X = pictureBox1.Width/2 + (int) Math.Round(corner.D3X*factor);
corner.D2Y = pictureBox1.Height/2 - (int) Math.Round(corner.D3Y*factor);
}
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_keyPressed = false;
}
private void Form1_Load(object sender, EventArgs e)
{
InitializeCube();
Text = "Cube Cartesian";
Set();
pictureBox1.Hide();
timer1.Start();
}
private void InitializeCube()
{
_cC1.D3X = -LengthOfHalfEdge;
_cC1.D3Y = -LengthOfHalfEdge;
_cC1.D3Z = LengthOfHalfEdge;
_cC1.Number = 1;
_cC2.D3X = LengthOfHalfEdge;
_cC2.D3Y = -LengthOfHalfEdge;
_cC2.D3Z = LengthOfHalfEdge;
_cC2.Number = 2;
_cC3.D3X = LengthOfHalfEdge;
_cC3.D3Y = -LengthOfHalfEdge;
_cC3.D3Z = -LengthOfHalfEdge;
_cC3.Number = 3;
_cC4.D3X = -LengthOfHalfEdge;
_cC4.D3Y = -LengthOfHalfEdge;
_cC4.D3Z = -LengthOfHalfEdge;
_cC4.Number = 4;
//
_cC5.D3X = -LengthOfHalfEdge;
_cC5.D3Y = LengthOfHalfEdge;
_cC5.D3Z = LengthOfHalfEdge;
_cC5.Number = 5;
_cC6.D3X = LengthOfHalfEdge;
_cC6.D3Y = LengthOfHalfEdge;
_cC6.D3Z = LengthOfHalfEdge;
_cC6.Number = 6;
_cC7.D3X = LengthOfHalfEdge;
_cC7.D3Y = LengthOfHalfEdge;
_cC7.D3Z = -LengthOfHalfEdge;
_cC7.Number = 7;
_cC8.D3X = -LengthOfHalfEdge;
_cC8.D3Y = LengthOfHalfEdge;
_cC8.D3Z = -LengthOfHalfEdge;
_cC8.Number = 8;
}
internal class CubeCorner
{
internal int D2X;
internal int D2Y;
internal double D3X;
internal double D3Y;
internal double D3Z;
internal int Number;
}
internal enum Rotation
{
YUp,
YDown,
XLeft,
XRight,
ZLeft,
ZRight,
None
}
}
}[/src]
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace Cube
{
public partial class Form1 : Form
{
private const int LengthOfHalfEdge = 100;
private readonly CubeCorner _cC1;
private readonly CubeCorner _cC2;
private readonly CubeCorner _cC3;
private readonly CubeCorner _cC4;
private readonly CubeCorner _cC5;
private readonly CubeCorner _cC6;
private readonly CubeCorner _cC7;
private readonly CubeCorner _cC8;
private readonly List<CubeCorner> _cubeCorners = new List<CubeCorner>();
private bool _isCartesian = true;
private bool _keyPressed;
private Rotation _rotation = Rotation.None;
public Form1()
{
InitializeComponent();
KeyDown += (Form1_KeyDown);
KeyUp += (Form1_KeyUp);
timer1.Tick += (timer1_Tick);
Paint += (Form1_Paint);
_cC1 = new CubeCorner();
_cC2 = new CubeCorner();
_cC3 = new CubeCorner();
_cC4 = new CubeCorner();
_cC5 = new CubeCorner();
_cC6 = new CubeCorner();
_cC7 = new CubeCorner();
_cC8 = new CubeCorner();
_cubeCorners.Add(_cC1);
_cubeCorners.Add(_cC2);
_cubeCorners.Add(_cC3);
_cubeCorners.Add(_cC4);
_cubeCorners.Add(_cC5);
_cubeCorners.Add(_cC6);
_cubeCorners.Add(_cC7);
_cubeCorners.Add(_cC8);
}
private void timer1_Tick(object sender, EventArgs e)
{
if (_keyPressed) RotateCube();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
_keyPressed = true;
if (e.KeyCode == Keys.Space)
SwitchView();
switch (e.KeyCode)
{
case Keys.W:
_rotation = Rotation.YUp;
break;
case Keys.S:
_rotation = Rotation.YDown;
break;
case Keys.A:
_rotation = Rotation.XLeft;
break;
case Keys.D:
_rotation = Rotation.XRight;
break;
case Keys.Q:
_rotation = Rotation.ZLeft;
break;
case Keys.E:
_rotation = Rotation.ZRight;
break;
default:
return;
}
RotateCube();
}
private void SwitchView()
{
_isCartesian = !_isCartesian;
Convert();
Refresh();
Text = _isCartesian ? "Cube Cartesian" : "Cube Perspective";
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
var pen = new Pen(Color.Red);
e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC2.D2X, _cC2.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC3.D2X, _cC3.D2Y);
e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC4.D2X, _cC4.D2Y);
e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC1.D2X, _cC1.D2Y);
pen = new Pen(Color.Blue);
e.Graphics.DrawLine(pen, _cC5.D2X, _cC5.D2Y, _cC6.D2X, _cC6.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC6.D2X, _cC6.D2Y, _cC7.D2X, _cC7.D2Y);
e.Graphics.DrawLine(pen, _cC7.D2X, _cC7.D2Y, _cC8.D2X, _cC8.D2Y);
e.Graphics.DrawLine(pen, _cC8.D2X, _cC8.D2Y, _cC5.D2X, _cC5.D2Y);
e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC5.D2X, _cC5.D2Y);
pen = new Pen(Color.Yellow);
e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC6.D2X, _cC6.D2Y);
pen = new Pen(Color.Green);
e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC7.D2X, _cC7.D2Y);
e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC8.D2X, _cC8.D2Y);
}
private void RotateCube()
{
if (_keyPressed)
Set();
_rotation = Rotation.None;
Refresh();
Invalidate();
}
private void Calculate()
{
foreach (CubeCorner corner in _cubeCorners)
{
double x;
double y;
switch (_rotation)
{
case Rotation.XRight:
x = corner.D3X;
y = corner.D3Z;
Do(ref x, ref y, 1);
corner.D3X = x;
corner.D3Z = y;
break;
case Rotation.XLeft:
x = corner.D3X;
y = corner.D3Z;
Do(ref x, ref y, -1);
corner.D3X = x;
corner.D3Z = y;
break;
case Rotation.YUp:
x = corner.D3Z;
y = corner.D3Y;
Do(ref x, ref y, 1);
corner.D3Z = x;
corner.D3Y = y;
break;
case Rotation.YDown:
x = corner.D3Z;
y = corner.D3Y;
Do(ref x, ref y, -1);
corner.D3Z = x;
corner.D3Y = y;
break;
case Rotation.ZRight:
x = corner.D3X;
y = corner.D3Y;
Do(ref x, ref y, -1);
corner.D3X = x;
corner.D3Y = y;
break;
case Rotation.ZLeft:
x = corner.D3X;
y = corner.D3Y;
Do(ref x, ref y, 1);
corner.D3X = x;
corner.D3Y = y;
break;
}
}
}
private void Do(ref double x, ref double y, int direction)
{
double distance = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2.0)); //141.42;
double ang = Math.Atan2(y, x)*180.0/Math.PI;
if (ang < 360) ang += 360;
ang += direction;
double deg = ang/180.0*Math.PI;
x = (Math.Cos(deg)*distance);
y = (Math.Sin(deg)*distance);
}
private void Set()
{
Calculate();
Convert();
}
private void Convert()
{
foreach (CubeCorner corner in _cubeCorners)
{
if (_isCartesian)
{
corner.D2X = pictureBox1.Width/2 + (int) corner.D3X;
corner.D2Y = pictureBox1.Height/2 - (int) corner.D3Y;
}
else
{
double dist = Math.Abs(corner.D3Z - LengthOfHalfEdge);
double factor = 1 - 0.125*dist/100;
corner.D2X = pictureBox1.Width/2 + (int) Math.Round(corner.D3X*factor);
corner.D2Y = pictureBox1.Height/2 - (int) Math.Round(corner.D3Y*factor);
}
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_keyPressed = false;
}
private void Form1_Load(object sender, EventArgs e)
{
InitializeCube();
Text = "Cube Cartesian";
Set();
pictureBox1.Hide();
timer1.Start();
}
private void InitializeCube()
{
_cC1.D3X = -LengthOfHalfEdge;
_cC1.D3Y = -LengthOfHalfEdge;
_cC1.D3Z = LengthOfHalfEdge;
_cC1.Number = 1;
_cC2.D3X = LengthOfHalfEdge;
_cC2.D3Y = -LengthOfHalfEdge;
_cC2.D3Z = LengthOfHalfEdge;
_cC2.Number = 2;
_cC3.D3X = LengthOfHalfEdge;
_cC3.D3Y = -LengthOfHalfEdge;
_cC3.D3Z = -LengthOfHalfEdge;
_cC3.Number = 3;
_cC4.D3X = -LengthOfHalfEdge;
_cC4.D3Y = -LengthOfHalfEdge;
_cC4.D3Z = -LengthOfHalfEdge;
_cC4.Number = 4;
//
_cC5.D3X = -LengthOfHalfEdge;
_cC5.D3Y = LengthOfHalfEdge;
_cC5.D3Z = LengthOfHalfEdge;
_cC5.Number = 5;
_cC6.D3X = LengthOfHalfEdge;
_cC6.D3Y = LengthOfHalfEdge;
_cC6.D3Z = LengthOfHalfEdge;
_cC6.Number = 6;
_cC7.D3X = LengthOfHalfEdge;
_cC7.D3Y = LengthOfHalfEdge;
_cC7.D3Z = -LengthOfHalfEdge;
_cC7.Number = 7;
_cC8.D3X = -LengthOfHalfEdge;
_cC8.D3Y = LengthOfHalfEdge;
_cC8.D3Z = -LengthOfHalfEdge;
_cC8.Number = 8;
}
internal class CubeCorner
{
internal int D2X;
internal int D2Y;
internal double D3X;
internal double D3Y;
internal double D3Z;
internal int Number;
}
internal enum Rotation
{
YUp,
YDown,
XLeft,
XRight,
ZLeft,
ZRight,
None
}
}
}[/src]
Drehen um 3 Achsen:
1)A und D
2)W und S
3)Q und E
Space: Umschalten Ansichten Koordinatensystem und räumliche Verkürzung

