Создание поверхности сдвига сплайн функции Безье. Вай - 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д