2014-12-30 5 views
0

Я пытаюсь отобразить трехмерную ось с использованием метода drawline, мне удалось прокрутить линию вокруг своей оси, но у меня возникли проблемы с тем, чтобы вторая линия вращалась в 90 градусов угол от этой линии, я хотел бы реализовать основной метод вращения, но я не знаю, как его реализовать в C# http://en.wikipedia.org/wiki/Rotation_matrix. Я хотел бы знать, как разместить ось z на графике xy. Помните, что я хочу сделать это в простой C# без прямого x или что-то еще.3d-координаты в плоскости C#

вот мой основной код для рисования

private void Go_Click(object sender, EventArgs e) 
    { 


     int radiusx1= Int32.Parse(xbarvalue.Text); 
     int radiusy1 = Int32.Parse(ybarvalue.Text); 
     int radiusz1 = Int32.Parse(zbarvalue.Text); 
     int speedwait = speed.Value; 

     int position1 =canvas.Width/2 ; 
      int position2 = canvas.Height/2; 


      for (double i = 0; i <=360; i = i + 0.5) 
     { 

     double angle= Math.PI * i/180.0; 


     // double angle = i * 0.01745; 
      float position1x = (float)(position1+Math.Sin(angle)*Theta); 
      float position1y = (float)(position2+Math.Cos(angle)*Theta2); 
      float position2x = (float)(position1 + Math.Sin(angle) *radiusy1); 
      float position2y = (float)(position2 + Math.Cos(angle) * radiusz1); 
      float position3x = (float)(position1 + Math.Sin(angle) *radiusx1); 
      float position3y = (float)(position2 + Math.Cos(angle) *radiusz1); 


      // Graphics g; 
     // g = canvas.CreateGraphics(); 
      //Pen p; 
      // Rectangle r; 
     // p = new Pen(Brushes.Blue); 
     // r = new Rectangle(position2x,position2y, 1, 1); 

     // g.DrawRectangle(p, r); 

     System.Threading.Thread.Sleep(speedwait); 
     canvas.Refresh(); 
     px.Text = Convert.ToString(position1x); 
     py.Text = Convert.ToString(position1y); 
     // pz.Text = Convert.ToString(position1z); 
     px.Refresh(); 
     py.Refresh(); 
     // pz.Refresh(); 

      System.Drawing.Pen myPen; 
      System.Drawing.Pen myPen2; 
      System.Drawing.Pen myPen3; 
      myPen = new System.Drawing.Pen(System.Drawing.Color.Red); 
      myPen2 = new System.Drawing.Pen(System.Drawing.Color.Black); 
      myPen3 = new System.Drawing.Pen(System.Drawing.Color.Blue); 
      System.Drawing.Graphics formGraphics = canvas.CreateGraphics(); 
      formGraphics.DrawLine(myPen, position1, position2, position1x, position1y); 
      formGraphics.DrawLine(myPen2, position1, position2,position2x,position2y); 
     formGraphics.DrawLine(myPen3, position1, position2,position3x, position3y); 





     }; 

    } 

моего первого метода должны был использовать эллипсы на прядильных линиях, чтобы создать иллюзию глубины

может кто-то показать мне, как писать основной код вращения в C#, у меня проблемы с массивами.

+0

float position1x = (float) (position1 + Math.Sin (angle) * Theta); поплавка position1y = (поплавок) (Position2 + Math.cos (угол) * Theta2) , предполагают, чтобы быть поплавка position1x = (поплавок) (Должность1 + Math.sin (угол) * radiusx1); float position1y = (float) (position2 + Math.Cos (angle) * radiusy1) – user3513130

+0

На 90 градусов от линии, но на одной и той же плоскости, или на 90 градусов до равнины линии, как обычный нормальный? – Tigran

ответ

1

Если вы добавляете ссылки на WindowsBase и PresentationCore, тогда есть объекты, которые могут помочь вам в 3D-преобразованиях. Эти сборки являются частью основной платформы .NET Framework и не требуют установки каких-либо дополнительных библиотек, таких как DirectX. Пример:

using System.Windows.Media.Media3D; 
... 
// Define a 90 degree rotation about Y axis 
var rotation = new AxisAngleRotation(new Vector(0,1,0), 90); 

// Create transformation from our rotation definition 
var transform = new RotateTransform3D(rotation); 

// Rotate a point using the transformation 
var original = new Vector3D(1, 1, 1); 
var rotated = transform.Transform(original); 

Для того, чтобы нарисовать 3D-объекты на 2D поверхности, хотя, вы должны будете использовать матрицу проекции. Перспективная проекция делает объекты менее отдаленными, а параллельная проекция сохраняет размер на всех расстояниях. Проекционная матрица - это заключительный шаг, который преобразует 3D-векторы в 2D-векторы, которые можно использовать на экране.