Создание поверхности сдвига сплайн функции Безье. Вай - C#
Формулировка задачи:
Ух ребята. Контрольная работа тут у меня. Но не стоит паниковать. Я тут уже чего спрограммулил..
В общем я тоже долго курил что от меня требует. На сколько я понял нужно построить кривую, на шаге допстим в 300 (относительно z) построить точно такую же кривую, и соеденить полигонами так, чтоб всё это вышло в кривоватую поверхность.
Когда я выкурил уже третий бамбук и дело пошло до акации на подоконнике, я подумал что проще будет сделать похожий вариант соседа, то есть построить не кривую Безье, а криую синуса.. Ну хоть формулы знакомые будут.
(яндекс картинками не блещет, вот подобные)
http://lib.znate.ru/pars_docs/refs/52/51896/51896_html_769b2327.png
http://2.bp.blogspot.com/-X_Ds7swG6o...36.34%2BAM.png
Короче в итоге должно получиться что-то в духе шифера/зановесок/флага на ветру...
Использовать ваши новомодные opengl/unity/etc нельзя. По хардкору всё. Типа чтобы знали как ведьмаки создавать с нуля... видимо.
Получилось у меня пока только что отображается 4 кривые и нефига не понятно они часть одной плоскости или 4 разные плоскости о_О Используется метод художника, может полигоны перекрывыают друг друга и не отрисовываются
код
http://pastebin.com/Qut5qC3J
СЛоН (*.sln)
https://www.dropbox.com/s/jxb6gb91mj3dk7f/3d-test3.7z?dl=0
Код напичкам мусорными комментариями, так как я всё же надеялся что Безье мне под силу.. Но препод похлопал меня по плечу и сказал "да тут фигня ваще, тут работы то на 15 минут".
На данный момент я отправился в горы познавать Дзинь как мой "учитель". Он то ведь за 15 минут такое решит..
Прошу вашей помощи допилить или пнуть в направлении верного решения.
ЗЫ: И да, код нефига не оптимизирован.. я всё ручками писал. Делать цикл в цикле в цикле не мой конёк
Решение задачи: «Создание поверхности сдвига сплайн функции Безье. Вай»
textual
Листинг программы
- using System;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Windows.Forms;
- using System.Linq;
- namespace WindowsFormsApplication268
- {
- public partial class Form1 : Form
- {
- private PointF[] points;
- public Form1()
- {
- InitializeComponent();
- SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
- //строим кривую Безье
- var path = new GraphicsPath();
- var s = "0,50;50,110;100,40;150,90";
- points = s.Split(';').Select(p => new PointF(int.Parse(p.Split(',')[0]), int.Parse(p.Split(',')[1]))).ToArray();
- path.AddBeziers(points);
- //получаем точки
- path.Flatten();
- points = path.PathPoints;
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- //шкалирование
- e.Graphics.ScaleTransform(3, 3);
- //перспектива
- var dx = 5;
- var dy = -3;
- //рисуем полигоны
- for (int z = 0; z < 10; z++ )
- for (int i = 0; i < points.Length - 1; i++)
- {
- var p1 = new PointF(points[i].X + z * dx, points[i].Y + z * dy);
- var p2 = p1 + new Size(dx, dy);
- var p4 = new PointF(points[i + 1].X + z * dx, points[i + 1].Y + z * dy);
- var p3 = p4 + new Size(dx, dy);
- var pp = new PointF[] {p1, p2, p3, p4};
- e.Graphics.FillPolygon(Brushes.Silver, pp);
- e.Graphics.DrawPolygon(Pens.Black, pp);
- }
- base.OnPaint(e);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д