Ergebnis 1 bis 4 von 4

Thema: Drahtwürfel

  1. #1
    ♪♪♫♪♫♫♪ Avatar von KaPiTN
    Registriert seit
    Jul 2013
    Beiträge
    8.655
    ngb:news Artikel
    9

    Drahtwürfel

    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.


    Würfel Demo Video


    Bin-Datei
    Cube.zip

    Code

    Spoiler: 

    Code (C#):
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Drawing;
    4. using System.Drawing.Drawing2D;
    5. using System.Windows.Forms;
    6.  
    7. namespace Cube
    8. {
    9.     public partial class Form1 : Form
    10.     {
    11.         private const int LengthOfHalfEdge = 100;
    12.         private readonly CubeCorner _cC1;
    13.         private readonly CubeCorner _cC2;
    14.         private readonly CubeCorner _cC3;
    15.         private readonly CubeCorner _cC4;
    16.         private readonly CubeCorner _cC5;
    17.         private readonly CubeCorner _cC6;
    18.         private readonly CubeCorner _cC7;
    19.         private readonly CubeCorner _cC8;
    20.         private readonly List<CubeCorner> _cubeCorners = new List<CubeCorner>();
    21.         private bool _isCartesian = true;
    22.         private bool _keyPressed;
    23.         private Rotation _rotation = Rotation.None;
    24.  
    25.         public Form1()
    26.         {
    27.             InitializeComponent();
    28.             KeyDown += (Form1_KeyDown);
    29.             KeyUp += (Form1_KeyUp);
    30.             timer1.Tick += (timer1_Tick);
    31.             Paint += (Form1_Paint);
    32.             _cC1 = new CubeCorner();
    33.             _cC2 = new CubeCorner();
    34.             _cC3 = new CubeCorner();
    35.             _cC4 = new CubeCorner();
    36.             _cC5 = new CubeCorner();
    37.             _cC6 = new CubeCorner();
    38.             _cC7 = new CubeCorner();
    39.             _cC8 = new CubeCorner();
    40.             _cubeCorners.Add(_cC1);
    41.             _cubeCorners.Add(_cC2);
    42.             _cubeCorners.Add(_cC3);
    43.             _cubeCorners.Add(_cC4);
    44.             _cubeCorners.Add(_cC5);
    45.             _cubeCorners.Add(_cC6);
    46.             _cubeCorners.Add(_cC7);
    47.             _cubeCorners.Add(_cC8);
    48.         }
    49.  
    50.         private void timer1_Tick(object sender, EventArgs e)
    51.         {
    52.             if (_keyPressed) RotateCube();
    53.         }
    54.  
    55.  
    56.         private void Form1_KeyDown(object sender, KeyEventArgs e)
    57.         {
    58.             _keyPressed = true;
    59.  
    60.             if (e.KeyCode == Keys.Space)
    61.                 SwitchView();
    62.  
    63.             switch (e.KeyCode)
    64.             {
    65.                 case Keys.W:
    66.                     _rotation = Rotation.YUp;
    67.                     break;
    68.                 case Keys.S:
    69.                     _rotation = Rotation.YDown;
    70.                     break;
    71.                 case Keys.A:
    72.                     _rotation = Rotation.XLeft;
    73.                     break;
    74.                 case Keys.D:
    75.                     _rotation = Rotation.XRight;
    76.                     break;
    77.                 case Keys.Q:
    78.                     _rotation = Rotation.ZLeft;
    79.                     break;
    80.                 case Keys.E:
    81.                     _rotation = Rotation.ZRight;
    82.                     break;
    83.                 default:
    84.                     return;
    85.             }
    86.  
    87.             RotateCube();
    88.         }
    89.  
    90.         private void SwitchView()
    91.         {
    92.             _isCartesian = !_isCartesian;
    93.             Convert();
    94.             Refresh();
    95.  
    96.             Text = _isCartesian ? "Cube                                 Cartesian" : "Cube                                 Perspective";
    97.         }
    98.  
    99.         private void Form1_Paint(object sender, PaintEventArgs e)
    100.         {
    101.             e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    102.             var pen = new Pen(Color.Red);
    103.             e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC2.D2X, _cC2.D2Y);
    104.             pen = new Pen(Color.Green);
    105.             e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC3.D2X, _cC3.D2Y);
    106.             e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC4.D2X, _cC4.D2Y);
    107.             e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC1.D2X, _cC1.D2Y);
    108.  
    109.             pen = new Pen(Color.Blue);
    110.             e.Graphics.DrawLine(pen, _cC5.D2X, _cC5.D2Y, _cC6.D2X, _cC6.D2Y);
    111.             pen = new Pen(Color.Green);
    112.             e.Graphics.DrawLine(pen, _cC6.D2X, _cC6.D2Y, _cC7.D2X, _cC7.D2Y);
    113.             e.Graphics.DrawLine(pen, _cC7.D2X, _cC7.D2Y, _cC8.D2X, _cC8.D2Y);
    114.             e.Graphics.DrawLine(pen, _cC8.D2X, _cC8.D2Y, _cC5.D2X, _cC5.D2Y);
    115.  
    116.             e.Graphics.DrawLine(pen, _cC1.D2X, _cC1.D2Y, _cC5.D2X, _cC5.D2Y);
    117.             pen = new Pen(Color.Yellow);
    118.             e.Graphics.DrawLine(pen, _cC2.D2X, _cC2.D2Y, _cC6.D2X, _cC6.D2Y);
    119.             pen = new Pen(Color.Green);
    120.             e.Graphics.DrawLine(pen, _cC3.D2X, _cC3.D2Y, _cC7.D2X, _cC7.D2Y);
    121.             e.Graphics.DrawLine(pen, _cC4.D2X, _cC4.D2Y, _cC8.D2X, _cC8.D2Y);
    122.         }
    123.  
    124.         private void RotateCube()
    125.         {
    126.             if (_keyPressed)
    127.                 Set();
    128.             _rotation = Rotation.None;
    129.             Refresh();
    130.  
    131.             Invalidate();
    132.         }
    133.  
    134.         private void Calculate()
    135.         {
    136.             foreach (CubeCorner corner in _cubeCorners)
    137.             {
    138.                 double x;
    139.                 double y;
    140.                 switch (_rotation)
    141.                 {
    142.                     case Rotation.XRight:
    143.                         x = corner.D3X;
    144.                         y = corner.D3Z;
    145.                         Do(ref x, ref y, 1);
    146.                         corner.D3X = x;
    147.                         corner.D3Z = y;
    148.                         break;
    149.                     case Rotation.XLeft:
    150.                         x = corner.D3X;
    151.                         y = corner.D3Z;
    152.                         Do(ref x, ref y, -1);
    153.                         corner.D3X = x;
    154.                         corner.D3Z = y;
    155.                         break;
    156.                     case Rotation.YUp:
    157.                         x = corner.D3Z;
    158.                         y = corner.D3Y;
    159.                         Do(ref x, ref y, 1);
    160.                         corner.D3Z = x;
    161.                         corner.D3Y = y;
    162.                         break;
    163.                     case Rotation.YDown:
    164.                         x = corner.D3Z;
    165.                         y = corner.D3Y;
    166.                         Do(ref x, ref y, -1);
    167.                         corner.D3Z = x;
    168.                         corner.D3Y = y;
    169.                         break;
    170.                     case Rotation.ZRight:
    171.                         x = corner.D3X;
    172.                         y = corner.D3Y;
    173.                         Do(ref x, ref y, -1);
    174.                         corner.D3X = x;
    175.                         corner.D3Y = y;
    176.                         break;
    177.                     case Rotation.ZLeft:
    178.                         x = corner.D3X;
    179.                         y = corner.D3Y;
    180.                         Do(ref x, ref y, 1);
    181.                         corner.D3X = x;
    182.                         corner.D3Y = y;
    183.                         break;
    184.                 }
    185.             }
    186.         }
    187.  
    188.         private void Do(ref double x, ref double y, int direction)
    189.         {
    190.             double distance = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2.0)); //141.42;
    191.             double ang = Math.Atan2(y, x)*180.0/Math.PI;
    192.  
    193.             if (ang < 360) ang += 360;
    194.  
    195.             ang += direction;
    196.             double deg = ang/180.0*Math.PI;
    197.             x = (Math.Cos(deg)*distance);
    198.             y = (Math.Sin(deg)*distance);
    199.         }
    200.  
    201.         private void Set()
    202.         {
    203.             Calculate();
    204.             Convert();
    205.         }
    206.         private void Convert()
    207.         {
    208.             foreach (CubeCorner corner in _cubeCorners)
    209.             {
    210.                 if (_isCartesian)
    211.                 {
    212.                     corner.D2X = pictureBox1.Width/2 + (int) corner.D3X;
    213.                     corner.D2Y = pictureBox1.Height/2 - (int) corner.D3Y;
    214.                 }
    215.                 else
    216.                 {
    217.                     double dist = Math.Abs(corner.D3Z - LengthOfHalfEdge);
    218.                     double factor = 1 - 0.125*dist/100;
    219.                     corner.D2X = pictureBox1.Width/2 + (int) Math.Round(corner.D3X*factor);
    220.                     corner.D2Y = pictureBox1.Height/2 - (int) Math.Round(corner.D3Y*factor);
    221.                 }
    222.             }
    223.         }
    224.         private void Form1_KeyUp(object sender, KeyEventArgs e)
    225.         {
    226.             _keyPressed = false;
    227.         }
    228.  
    229.         private void Form1_Load(object sender, EventArgs e)
    230.         {
    231.             InitializeCube();
    232.             Text = "Cube                                 Cartesian";
    233.             Set();
    234.             pictureBox1.Hide();
    235.             timer1.Start();
    236.         }
    237.         private void InitializeCube()
    238.         {
    239.             _cC1.D3X = -LengthOfHalfEdge;
    240.             _cC1.D3Y = -LengthOfHalfEdge;
    241.             _cC1.D3Z = LengthOfHalfEdge;
    242.             _cC1.Number = 1;
    243.  
    244.             _cC2.D3X = LengthOfHalfEdge;
    245.             _cC2.D3Y = -LengthOfHalfEdge;
    246.             _cC2.D3Z = LengthOfHalfEdge;
    247.             _cC2.Number = 2;
    248.  
    249.             _cC3.D3X = LengthOfHalfEdge;
    250.             _cC3.D3Y = -LengthOfHalfEdge;
    251.             _cC3.D3Z = -LengthOfHalfEdge;
    252.             _cC3.Number = 3;
    253.  
    254.             _cC4.D3X = -LengthOfHalfEdge;
    255.             _cC4.D3Y = -LengthOfHalfEdge;
    256.             _cC4.D3Z = -LengthOfHalfEdge;
    257.             _cC4.Number = 4;
    258.             //
    259.             _cC5.D3X = -LengthOfHalfEdge;
    260.             _cC5.D3Y = LengthOfHalfEdge;
    261.             _cC5.D3Z = LengthOfHalfEdge;
    262.             _cC5.Number = 5;
    263.  
    264.             _cC6.D3X = LengthOfHalfEdge;
    265.             _cC6.D3Y = LengthOfHalfEdge;
    266.             _cC6.D3Z = LengthOfHalfEdge;
    267.             _cC6.Number = 6;
    268.  
    269.             _cC7.D3X = LengthOfHalfEdge;
    270.             _cC7.D3Y = LengthOfHalfEdge;
    271.             _cC7.D3Z = -LengthOfHalfEdge;
    272.             _cC7.Number = 7;
    273.             _cC8.D3X = -LengthOfHalfEdge;
    274.             _cC8.D3Y = LengthOfHalfEdge;
    275.             _cC8.D3Z = -LengthOfHalfEdge;
    276.             _cC8.Number = 8;
    277.         }
    278.  
    279.         internal class CubeCorner
    280.         {
    281.             internal int D2X;
    282.             internal int D2Y;
    283.             internal double D3X;
    284.             internal double D3Y;
    285.             internal double D3Z;
    286.             internal int Number;
    287.         }
    288.  
    289.         internal enum Rotation
    290.         {
    291.             YUp,
    292.             YDown,
    293.             XLeft,
    294.             XRight,
    295.             ZLeft,
    296.             ZRight,
    297.             None
    298.         }
    299.     }
    300. }


    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
    Für diesen Beitrag bedanken sich Brother John, theSplit
    J'irai pisser sur votre bombes
    You can educate a fool, but you cannot make him think

  2. #2

    Re: Drahtwürfel

    Zitat Zitat von KaPiTN Beitrag anzeigen
    Ich habe gestern etwas absolut nutzloses gebaut[...]
    Nutzlos, jo.

    Aber hübsch.

    Auch nett mit dem Video dazu.


    Zu nichts zu gebrauchen, aber ein Häkchen auf der bucketlist.
    Darauf kommt es (auch) an. Finde ich klasse das du das hier (auch mit Code) präsentierst und dich daran gesetzt hast. Solche "Spielereien" finde ich sehr interessant. Danke dafür.
    Für diesen Beitrag bedankt sich KaPiTN
    Gruß theSplit
    @ I might be sober. The good things... the bad things... all I ever know is here! @ The past; yesterday, the present; here and now; the future; to be shaped. @
    +++ Pi-Thread +++ IT-Talents Code Competitions +++ NGB-Statistik Opt-Out/Anonymisierung +++ Stonerhead +++ Add-on Flag Cookies +++ Google Image Directlinks +++ dwrox.net

  3. #3

    Re: Drahtwürfel

    Oh, der Drahtwürfel! Da werden alte BASIC-Erinnerungen wach. Ich hoffe, du hattest viel Spaß mit verknäulten Würfeln, bis die Bugs draußen waren.

  4. #4
    ♪♪♫♪♫♫♪

    (Threadstarter)

    Avatar von KaPiTN
    Registriert seit
    Jul 2013
    Beiträge
    8.655
    ngb:news Artikel
    9

    Re: Drahtwürfel

    Mit verknäulten Würfeln hatte ich keine Probleme.
    Aber ich habe wohl öfter mal das Vorzeichen gewechselt, weil ich die Drehrichtung für falsch hielt, bis ich gemerkt habe, daß das Gehirn nicht immer die Seite vorne sieht, die beabsichtigt ist.
    Da blinzelt man einmal und plötzlich dreht sich der Würfel in die entgegengesetzte Richtung.
    J'irai pisser sur votre bombes
    You can educate a fool, but you cannot make him think

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •