Каким образом можно построить на C# изображение шара как многогранника?

Узнай цену своей работы

Формулировка задачи:

Какие средства можно использовать в Visual Studio? И как можно это реализовать?

Должно выйти нечто из разряда трёхмерных объектов!!!

Решение задачи: «Каким образом можно построить на C# изображение шара как многогранника?»

textual
Листинг программы
  1. class Triangle
  2. {
  3.     public IList<Vector3> Vertices = new Vector3[3];
  4.    
  5.     public IList<Triangle> ApplyBisection()
  6.     {
  7.         var middles = Vertices.Select((v, i) => (v + Vertices[(i + 1) % 3]) / 2).ToList();
  8.        
  9.         var res = new List<Triangle>();
  10.        
  11.         for (int i = 0; i < 3; i++)
  12.         {
  13.             var triangle = new Triangle();
  14.            
  15.             triangle.Vertices[0] = Vertices[i];
  16.             triangle.Vertices[1] = middles[i];
  17.             triangle.Vertices[2] = middles[(i - 1 + 3) % 3];
  18.            
  19.             res.Add(triangle);
  20.         }
  21.  
  22.         res.Add(new Triangle { Vertices = middles });
  23.        
  24.         return res;
  25.     }
  26.  
  27.     public Vector3 Middle => Vertices.Aggregate((r, v) => r + v) / 3;
  28. }
  29.  
  30. static class FloatExtentions
  31. {
  32.     public static float ToDegrees(this float radians)
  33.     {
  34.         return (float)(radians * 180 / Math.PI);
  35.     }
  36.    
  37.     public static float ToRadians(this float degrees)
  38.     {
  39.         return (float)(degrees * Math.PI / 180);
  40.     }
  41. }
  42.  
  43. class IcosahedronBuilder
  44. {
  45.     private IList<Vector3> _topRing = new List<Vector3>();
  46.     private IList<Vector3> _bottomRing = new List<Vector3>();
  47.    
  48.     private Vector3 _top = new Vector3(0, 1, 0);
  49.     private Vector3 _bottom = new Vector3(0, -1, 0);
  50.    
  51.     private IList<Vector3> BuildTopRing()
  52.     {
  53.         var result = new List<Vector3>();
  54.        
  55.         var basis = new Vector3(0, 0, -1);
  56.        
  57.         float pitch = 30f.ToRadians();
  58.        
  59.         for (int i = 0; i < 5; i++)
  60.         {
  61.             float yaw = -(360f / 5f * i).ToRadians();
  62.            
  63.             var transform = Matrix4x4.CreateFromYawPitchRoll(yaw, pitch, 0);
  64.             result.Add(Vector3.Transform(basis, transform));
  65.         }
  66.        
  67.         return result;
  68.     }
  69.    
  70.     private IList<Vector3> BuildBottomRing(IList<Vector3> topRing)
  71.     {
  72.         var transform = Matrix4x4.CreateFromYawPitchRoll((360f / 10f).ToRadians(), 0, 0f.ToRadians());
  73.         transform = transform * Matrix4x4.CreateScale(1, -1, 1);
  74.        
  75.         return topRing.Select(p => Vector3.Transform(p, transform)).ToList();
  76.     }
  77.    
  78.     public List<Triangle> Build()
  79.     {
  80.         _topRing = BuildTopRing();
  81.         _bottomRing = BuildBottomRing(_topRing);
  82.        
  83.         var result = new List<Triangle>();
  84.        
  85.         for (int i = 0; i < _topRing.Count; i++)
  86.         {
  87.             var triangle = new Triangle();
  88.            
  89.             triangle.Vertices[0] = _top;
  90.             triangle.Vertices[1] = _topRing[i];
  91.             triangle.Vertices[2] = _topRing[(i + 1) % _topRing.Count];
  92.            
  93.             result.Add(triangle);
  94.         }
  95.  
  96.         for (int i = 0; i < _topRing.Count; i++)
  97.         {
  98.             var triangle = new Triangle();
  99.  
  100.             triangle.Vertices[0] = _topRing[i];
  101.             triangle.Vertices[1] = _bottomRing[i];
  102.             triangle.Vertices[2] = _bottomRing[(i + 1) % _bottomRing.Count];
  103.  
  104.             result.Add(triangle);
  105.         }
  106.  
  107.         for (int i = 0; i < _bottomRing.Count; i++)
  108.         {
  109.             var triangle = new Triangle();
  110.  
  111.             triangle.Vertices[0] = _bottomRing[i];
  112.             triangle.Vertices[1] = _topRing[i];
  113.             triangle.Vertices[2] = _topRing[(i - 1 + _topRing.Count) % _topRing.Count];
  114.  
  115.             result.Add(triangle);
  116.         }
  117.  
  118.         for (int i = 0; i < _bottomRing.Count; i++)
  119.         {
  120.             var triangle = new Triangle();
  121.  
  122.             triangle.Vertices[0] = _bottom;
  123.             triangle.Vertices[1] = _bottomRing[i];
  124.             triangle.Vertices[2] = _bottomRing[(i - 1 + _bottomRing.Count) % _bottomRing.Count];
  125.  
  126.             result.Add(triangle);
  127.         }
  128.        
  129.         return result;
  130.     }
  131. }
  132.  
  133. class Model
  134. {
  135.     public IList<Triangle> Triangles = new List<Triangle>();
  136. }
  137.  
  138. class MainForm : Form
  139. {
  140.     private Model _model = new Model();
  141.    
  142.     public MainForm()
  143.     {
  144.         base.DoubleBuffered = true;
  145.         base.WindowState = FormWindowState.Maximized;
  146.        
  147.         _model.Triangles = new IcosahedronBuilder().Build();
  148.            
  149.         for (int i = 0; i < 2; i++)
  150.         {
  151.             _model.Triangles = _model.Triangles.SelectMany(t =>
  152.             {
  153.                 IList<Triangle> derivatives = t.ApplyBisection();
  154.                 foreach (var triangle in derivatives)
  155.                 {
  156.                     triangle.Vertices = triangle.Vertices.Select(v => Vector3.Normalize(v)).ToList();
  157.                 }
  158.                 return derivatives;
  159.             }).ToList();
  160.         }
  161.  
  162.         var scale = Matrix4x4.CreateScale(200, -200, 200);
  163.         var translate = Matrix4x4.CreateTranslation(500, 500, 0);
  164.         var transform = scale * translate;
  165.  
  166.         foreach (var triangle in _model.Triangles)
  167.             triangle.Vertices = triangle.Vertices.Select(v => Vector3.Transform(v, transform)).ToList();
  168.     }
  169.  
  170.     protected override void OnPaint(PaintEventArgs e)
  171.     {
  172.         var g = e.Graphics;
  173.         g.SmoothingMode = SmoothingMode.HighQuality;
  174.  
  175.         using (var gp = new GraphicsPath())
  176.         using (var brush = new SolidBrush(Color.Black))
  177.         {
  178.             foreach (var triangle in _model.Triangles.OrderByDescending(t => t.Middle.Z))
  179.             {
  180.                 gp.AddPolygon(triangle.Vertices.Select(v => new PointF(v.X, v.Y)).ToArray());
  181.                
  182.                 var n = Vector3.Cross(triangle.Vertices[2] - triangle.Vertices[1], triangle.Vertices[1] - triangle.Vertices[0]);
  183.                 n = 10 * Vector3.Normalize(n);
  184.                 var light = 1 - 0.8f * new Vector3(n.X, n.Y, 0).Length()/n.Length();//1 - cos(a)
  185.                 int gray = (int)(light * 255);
  186.                
  187.                 brush.Color = Color.FromArgb(gray, gray, gray);
  188.                
  189.                 g.FillPath(brush, gp);
  190.                 //g.DrawPath(Pens.Red, gp);
  191.  
  192.                 gp.Reset();
  193.             }
  194.         }
  195.     }
  196. }
  197.  
  198. void Main()
  199. {
  200.     Application.Run(new MainForm());
  201. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут