Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Visual Studio 2015
Статья по теме: 

Демонстрация аппроксимации β-сплайном.
Функция drawSpline(int[] points, Pen pen) принимает набор точек (х,y) и рисует по этому набору сплайн. Функция drawSpline(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, Pen pen) принимает 4 точки и используя функцию подсчета коэффициентов countSplineCoefficient(int index, int x1, int x2, int x3, int x4) и формулы

x(t) = ((a3t + a2)t + a1)t + a0, для 0 <= t <= 1
y(t) = ((b3t + b2)t + b1)t + b0, для 0 <= t <= 1

изображает дугу.

Код программы: 

using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private Bitmap bitmap;
        private Graphics g;
        private Pen pen;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void draw()
        {
            pen = new Pen(Color.Black);
 
            int[] spline = new int[] { 50, 400, 150, 300, 250, 400, 350, 300, 450, 400 }; //сплайн - волна
            drawSpline(spline, pen);
 
            spline = new int[] { 400, 100, 700, 100, 700, 400, 400, 400, 400, 100 }; //сплайн по квадрату
            pen.Color = Color.Red;
            drawSpline(spline, pen);
 
            spline = new int[] { 300, 100, 500, 300, 100, 300, 300, 100 }; //сплайн по треугольнику
            pen.Color = Color.Green;
            drawSpline(spline, pen);
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            bitmap = new Bitmap(panel.Width, panel.Height);
            g = Graphics.FromImage(bitmap);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            draw();
 
            panel.BackgroundImage = bitmap;
        }
 
        //рисует сплайн по точкам
        public void drawSpline(int[] points, Pen pen)
        {
 
            if (points.Length % 2 == 1 || points.Length < 8) //выходим, если координаты заданы неверно
                return;
 
            drawSpline(points[0], points[1], points[0], points[1], points[2], points[3], points[4],
                       points[5], pen); //рисуем сплайн по первой четверке точек
 
            for (int i = 8; i <= points.Length; i += 2) //рисуем сплайн по каждой четверке точек
                drawSpline(points[i - 8], points[i - 7], points[i - 6], points[i - 5], points[i - 4],
                           points[i - 3], points[i - 2], points[i - 1], pen);
 
            int j = points.Length - 6;
            drawSpline(points[j], points[j + 1], points[j + 2], points[j + 3], points[j + 4],
                       points[j + 5], points[j + 4], points[j + 5], pen); //рисуем сплайн по последней четверкке точек
        }
 
        //сплайн по четырем координатам
        private void drawSpline(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4,
                                Pen pen)
        {
            //подсчет коэффициентов сплайна
            float a0 = countSplineCoefficient(0, x1, x2, x3, x4);
            float a1 = countSplineCoefficient(1, x1, x2, x3, x4);
            float a2 = countSplineCoefficient(2, x1, x2, x3, x4);
            float a3 = countSplineCoefficient(3, x1, x2, x3, x4);
 
            float b0 = countSplineCoefficient(0, y1, y2, y3, y4);
            float b1 = countSplineCoefficient(1, y1, y2, y3, y4);
            float b2 = countSplineCoefficient(2, y1, y2, y3, y4);
            float b3 = countSplineCoefficient(3, y1, y2, y3, y4);
 
            float xPrev = a0, yPrev = b0;
 
            for (int i = 1; i <= 20; i++) //разбиваем кривую на 20 отрезков
            {
                float t = i / 20.0f;
                float x = ((a3 * t + a2) * t + a1) * t + a0; //x(t)
                float y = ((b3 * t + b2) * t + b1) * t + b0; //y(t)
 
                g.DrawLine(pen, xPrev, yPrev, x, y); //соединяем подсчитанные точки
                xPrev = x;
                yPrev = y;
            }
        }
 
        //пересчет коэффициентов сплайна
        private float countSplineCoefficient(int index, int x1, int x2, int x3, int x4)
        {
            switch (index)
            {
                case 0:
                    return (x1 + 4 * x2 + x3) / 6.0f; //свободный член
                case 1:
                    return (-x1 + x3) / 2.0f; //коэффициент при t
                case 2:
                    return (x1 - 2 * x2 + x3) / 2.0f; //коэффициент при t^2
                case 3:
                    return (-x1 + 3 * x2 - 3 * x3 + x4) / 6.0f; //коэффициент при t^3
            }
 
            return 0;
        }
 
    }
}

Прикрепленный файлРазмер
betta_spline.zip66.32 кб