Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Builder Определение mac-адреса сетевой карты https://www.cyberforum.ru/ cpp-builder/ thread1730718.html
Приветствую. Ребят, дайте пожалуйста действующий способ определения mac-адреса сетевой карты на билдере.
C++ Builder Сообщения линкера "Unresolved external 'WinMain'"
Создаю электронный учебник в Borland C++Builder 6 запускаю выводит Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl Unresolved...
C++ Builder Считать текст из файла, выполнить в нем поиск и записать результат в файл
Помогите написать код как можно более простым способом: В начале исходного текста стоит заглавная буква русского алфавита для поиска с символом ':' (например, А: ). Далее идет словарь русских слов...
C++ Builder Смена страниц в PageControl по таймеру сделал смену только для 2 страниц : void __fastcall TForm1::Timer2Timer(TObject *Sender) { switch(PageControl1->ActivePageIndex) { case 0: PageControl1->ActivePageIndex=1;... https://www.cyberforum.ru/ cpp-builder/ thread1730494.html
C++ Builder StringGrid (Оптимизация кода) - Загрузка и Сохранение https://www.cyberforum.ru/ cpp-builder/ thread1730368.html
Добрый день! Для сохранения StringGrid в файл использую TStringList *Table = new TStringList; for(int i = 0 ; i < fStringGrid->RowCount ; i++) { ...
Вывод двумерного массива в StringGrid C++ Builder
Здравствуйте можете подсказать как сделать вывод двумерного массива в StringGrid ? И если есть ошибки в исходнике можете на них указать ? (По заданию мне надо поменять максимальный элементы местами)...
Вывод двумерного массива в StrigGrid C++ Builder
Здравствуйте , можете подсказать как вывести двумерный массив в StringGrid ? По заданию мне нужно поменять местами максимальный и минимальный элементы: Вот исходник. И есть ли в нём ошибки ? ...
C++ Builder Зависшая программа. Перезапуск Добрый день! Задумался. Есть программа написанная на Embarcadero XE8. Гипотетически, она может зависнуть. Как написать стороннее приложение (2) проверяющее не зависло ли приложение (1) ? Если... https://www.cyberforum.ru/ cpp-builder/ thread1730264.html
C++ Builder Ограничения для RandomRange https://www.cyberforum.ru/ cpp-builder/ thread1730178.html
Нужно чтобы рандом работал на меня. Тоесть ,чтобы задавал цифры из диапазона по условию . Например d1=RandomRange(1,10); d2=RandomRange(1,10); Нужно чтобы d1%d2==0 . Как грамотно записать?
C++ Builder Как сделать объекты видимыми? Вот код: void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TLabel *CreateLabel= new TLabel(this); if (Button == mbLeft) {... https://www.cyberforum.ru/ cpp-builder/ thread1730099.html
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
14.05.2016, 19:05  [ТС] 0

В-сплайновые кривые

14.05.2016, 19:05. Показов 4120. Ответов 17
Метки (Все метки)

Ответ

gunslinger, нет проблем. Если сам разберусь, то отпишусь

Добавлено через 3 часа 30 минут
Понятия не имею что я изменил, но программа перестала ругаться на деление на ноль и стала рисовать, однако программа стала капризничать и не выполнять некоторые команды. Например не хочет менять цвет и толщину линии, несмотря на то, что я эти команды поместил в тело основной функции. Во время отрисовки сплайна все настройки сбрасывается и рисуется черная линия толщиной 1. И рисовать начинает из левого верхнего угла (1,1).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
#define ic Image1->Canvas
}
int  flag=0, nc=0;
int count=4;
TPoint point[100];
double tmin = 0., tmax = 6.;
double step = (tmax-tmin) / (count-1 + count-1);
 
double N(UINT q, UINT k, double t)
{
  if (q == 1)
  {
    if (t >= tmin + step * k && t <= tmin + step * (k + 1))
      return 1;
    else
      return 0;
  }
  else
    return (t - tmin - step * k) / (tmin + step * (k + q + 1) - tmin - step * k) * N(q-1, k, t) +
           (tmin + step * (k + q) - t) / (tmin + step * (k + q) - tmin - step * (k + 1)) * N(q-1, k+1, t);
}
//---------------------------------------------------------------------------
TPoint R(UINT q, double t)
{
  TPoint b = TPoint(0, 0);
  double temp;
  for (UINT i = 0; i < count; i++)
  {
    temp = N(q, i, t);
    b.x += point[i].x * temp;
    b.y += point[i].y * temp;
  }
  return b;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
 
    if (flag)
     {
        Refresh();
        UINT n = count-1;
        TPoint a;
        double st = 0.0001;
        double step = 0.001;
        ic->MoveTo(point[0].x,point[0].y);
        ic->Pen->Color=clRed;
        ic->Pen->Width=3;
        for(double t = tmin + step*0; t <= tmax - step*0; t += st)
        {
 
            a = R(n, t);
           /*   if (t <= tmin + 0*step || t > tmax - 0*step)
            {
                 Canvas->MoveTo(a.x, a.y);
 
            }
            else
            { */
                Canvas->LineTo(a.x, a.y);
 
            //}
        }
        flag=0;
     } else {count = 0; flag=1; ic->MoveTo(1,1);}
 
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
ic->Pen->Width=10;
ic->Pen->Color=clBlack;
point[count]= TPoint(X,Y);
ic->MoveTo(X,Y);
ic->LineTo(X,Y);
if (count) {
   ic->Pen->Width=3;
   ic->Pen->Color=clSilver;
   ic->MoveTo(point[count-1].X, point[count-1].Y);
   ic->LineTo(X,Y);
}
 
count++;
}
Но даже если не смотреть на это кривая выглядит чересчур страшной)

Добавлено через 47 минут
Вот на шарпе готовая программа, но тут много лишнего
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace b_spline
{
    public partial class Form1 : Form
    {
        public struct mypanel // создаём структуру, содержащую 
        {
            //панель, на которой расположены
            public Panel pan;
            //два поля для ввода координат
            public TextBox tbxx;
            public TextBox tbxy;
            //  и надписи X и Y.
            public Label lx;
            public Label ly;
        }
        public mypanel temp; //с помощью этой переменной будем инициализировать новые панели
        private List<mypanel> pnls;// список панелей, в котором будут храниться все наши панели
        public int pnls_num;// количество элементов в списке
        public PointF[] coords; // массив точек, в который будем загружать записанные в текстбоксы данные из списка панелей
        private float[] a = new float[4];// массив для рассчёта коэффициентов а
        private float[] b = new float[4];// для рассчёта коэффициентов b
        public Graphics graph;// поверхность для рисования
        public Bitmap btmp;// рисунок
        public Pen axis_pen = new Pen(Color.Black, 1);//  для рисования осей
        public Pen spline_pen = new Pen(Color.Blue, 1); //  для рисования сплайна
        public SolidBrush points_brush= new SolidBrush(Color.Red); // для рисования опорных точек
        public Form1()
        {
            this.InitializeComponent();
        }
        private void load_Form(object sender, EventArgs e)
        {
            load();
        }// обработка события " загрузка формы"
        public void load()
        {
            temp = new mypanel();// создаем новый объект типа mypanel, из которого будем передавать данные в список
            // инициализируем уже  существующими элементами (для удобства построения
            temp.pan = panel12;
            temp.tbxx = TextBox23;
            temp.tbxy = TextBox24;
            temp.lx = label23;
            temp.ly = label24;
            pnls = new List<mypanel>(4);// инициализируем список панелей (минимум 4 точки)
            pnls.Add(temp);// добавляем существующую панель в список
            for (int i = 1; i < 4; i++)
                pnls.Add(new_Panel(pnls[i - 1])); //создаём еще 3 панели 
            pnls_num = 4;// устанавливаем счётчик
        }
        public void Add_to_control(mypanel panel)
        {
            // добавляем родителей каждому элементу структуры. Это необходимо для отображения на экране
            flowLayoutPanel1.Controls.Add(panel.pan);
            panel.pan.Controls.Add(panel.tbxx);
            panel.pan.Controls.Add(panel.tbxy);
            panel.pan.Controls.Add(panel.lx);
            panel.pan.Controls.Add(panel.ly);
        }
        public mypanel new_Panel(mypanel sender)
        {
            //инициализируем объект mypanel и объекты, которые к нему подсоединим
            temp = new mypanel();
            temp.pan = new Panel();// панель, содержащая боксы и надписи
            temp.lx = new Label();
            temp.ly = new Label();
            temp.tbxx = new TextBox();// бокс для ввода x
            temp.tbxy = new TextBox();// бокс для ввода y
            temp.pan.Location = new Point(3, 28*sender.pan.Location.Y + 3);// каждую новую панель сдвигаем на 28 пикселов вниз
            temp.pan.Name = "panel" + temp.pan.Location.Y;// имя
            temp.pan.Size = new Size(152, 25);// размер
            temp.lx.Font = temp.ly.Font = new Font("Times New Roman", 6.75F, FontStyle.Bold, GraphicsUnit.Point, 204);//параметры шрифта
            temp.lx.Margin = temp.ly.Margin = new Padding(0);//внешняя граница не видна
            temp.lx.Size = temp.ly.Size = new Size(14, 11);// размер
            temp.lx.Text = "X:";// текст в label'ах
            temp.ly.Text = "Y:";
            //координаты label lx и ly
            temp.lx.Location = new Point(1, 7);//координаты
            temp.ly.Location = new Point(75, 6);
            temp.lx.Name = "temp.lx" + temp.pan.Location.Y;// имена
            temp.ly.Name = "temp.ly" + temp.pan.Location.Y;
            temp.tbxx.Size = temp.tbxy.Size = new Size(60, 20);
            temp.tbxx.KeyPress += (this.key_press);// добавляем функцию обработки ввода
            temp.tbxy.KeyPress += (this.key_press);
            temp.tbxx.Location = new Point(15, 2);//координаты
            temp.tbxy.Location = new Point(89, 2);
            temp.tbxx.Name = "temp.tbxx" + temp.pan.Location.Y;//имена
            temp.tbxy.Name = "temp.tbxy" + temp.pan.Location.Y;
            temp.tbxx.TabIndex = 1;//очерёдность переключения с помощью Tab
            temp.tbxy.TabIndex = 2;
            Add_to_control(temp);// добавляем к родителям
            return temp;// возвращаем готовый элемент списка
        }
        private int is_not_empty(TextBox tbx)// проверка заполненности поля ввода координат (возвращает содержимое)
        {
            int res;// создаем результат типа int (можно вводить только целые значения)
            if (!Int32.TryParse(tbx.Text, out res))// проверяем введено ли значение
                res = Int32.MaxValue;// если нет, то присваиваем результату 2^32 (не самый лучший способ, но размеры экрана всё-таки намного меньше)
            return res;// возвращаем полученнное значение
         }
        private void key_press(object s, KeyPressEventArgs e)// проверка ввода
        {
            TextBox sender = (TextBox) s;// знаем, что событие создает TextBox, поэтому производим приведение типов
 
            if (e.KeyChar != 22)// если не производится вставка
                // Handled- это свойство KeyPressEventArgs, которое показывает, обработано ли нажатие клавиши
                // проверяем ввод Разрешено вводить "-" первым символом, цифру и нажимать Backspace
                if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char) Keys.Back &&
                    (e.KeyChar != '-' || (sender).SelectionStart != 0 ||
                     ((sender).Text.Contains("-") && !(sender).SelectedText.Contains("-"))))
                    e.Handled = true;
        }
        private void Add_field(object sender, EventArgs e)// если нажали кнопку "Добавить", появляется новая панель
        {
            pnls.Add(new_Panel(pnls[pnls.Count - 1]));
            pnls_num++;
        }
        private void Delete_field(object sender, EventArgs e)// по нажатию кнопки "Удалить" удаляется панель, если их количество больше 4
        {
            if (pnls_num > 4)
            {
                pnls[pnls.Count - 1].pan.Dispose();
                pnls.RemoveAt(pnls.Count - 1);
                pnls_num--;
            }
        }
        public void Calculate(object sender, EventArgs e)
        {
            //в функции производится считывание данных из TextBox'ов
            //проверка корректности и вызов функции рассчёта и отображения точек и сплайна
            bool correct_input = true; // флаг правильного ввода
            coords = new PointF[pnls_num + 2];// создаём массив точек, в которые помещаем данные из текстбоксов
            for (int i = 0; i < pnls_num; i++)// считываем данные из всех текстбоксов
            {
                if ((coords[i + 1].X = is_not_empty(pnls[i].tbxx)) == Int32.MaxValue ||// проверяем правильный ввод
                    (coords[i + 1].Y = is_not_empty(pnls[i].tbxy)) == Int32.MaxValue)
                {
                    correct_input = false;// если неправильный, то выходим из цикла
                    break;
                }
            }
            if (correct_input == false)// ошибка
                MessageBox.Show("Рассчёт не может быть произведён.\r\nНеверно (неполностью) заполнены поля ввода.");
            else
            {
                btmp = new Bitmap(pictureBox1.Width , pictureBox1.Height);// инициализируем битмап
                // для правильного отображения сплайна необходимо дважды добавить первую и последнюю точку
                coords[0] = coords[1];
                coords[pnls_num + 1] = coords[pnls_num];
                pictureBox1.Refresh();// обновляем pictureBox(стираем старое)
                graph = Graphics.FromImage(btmp);// инициализируем поверхность для рисования
                graph.TranslateTransform(pictureBox1.Width/2, pictureBox1.Height/2);// переносим начало координат в центр
                graph.ScaleTransform(1, -1);// меняем направление оси Y
                //рисуем координатные оси
                graph.DrawLine(axis_pen, 0, -pictureBox1.Height / 2, 0, pictureBox1.Height / 2);
                graph.DrawLine(axis_pen, -pictureBox1.Width / 2, 0,pictureBox1.Width / 2 , 0);
                Draw_spline();// рисуем сплайн
                Draw(null, null);// рисуем опорные точки
            }
        }
        public void Draw(object sender, PaintEventArgs e)
        {
            for (int i = 1; i < pnls_num+1; i++)
                graph.FillRectangle(points_brush, coords[i].X - 1, coords[i].Y - 1, 3, 3);// точки рисуются прямоугольниками
            pictureBox1.BackgroundImage = btmp;// переносим на битмап
        }
        public void Draw_spline()
        {
            for (int i = 1; i < pnls_num; i++)// в цикле по всем четвёркам точек
            {
                Coefficient(i);// считаем коэффициенты
                PointF[] points=new PointF[100];// создаём массив промежуточных точек
                for(int j=0;j<100;j++)
                {
                    float t = (float)((float)j/100);// шаг интерполяции
                    // передаём массиву точек значения по методу beta-spline
                    points[j].X = (a[0] + t * (a[1] + t * (a[2] + t * a[3])));
                    points[j].Y = (b[0] + t * (b[1] + t * (b[2] + t * b[3])));
                }
                graph.DrawCurve(spline_pen, points,0.1f);// рисуем кривую по полученным точкам
            }
        }
        public void Coefficient(int i)// в функции рассчитываются коэффициенты a0-a3, b0-b3
        {
            a[3] = (-coords[i - 1].X + 3*coords[i].X - 3*coords[i + 1].X + coords[i + 2].X)/6;
            a[2] = (coords[i - 1].X - 2*coords[i].X + coords[i + 1].X)/2;
            a[1] = (-coords[i - 1].X + coords[i + 1].X)/2;
            a[0] = (coords[i - 1].X + 4*coords[i].X + coords[i + 1].X)/6;
            b[3] = (-coords[i - 1].Y + 3*coords[i].Y - 3*coords[i + 1].Y + coords[i + 2].Y)/6;
            b[2] = (coords[i - 1].Y - 2*coords[i].Y + coords[i + 1].Y)/2;
            b[1] = (-coords[i - 1].Y + coords[i + 1].Y)/2;
            b[0] = (coords[i - 1].Y + 4*coords[i].Y + coords[i + 1].Y)/6;
        }
    }
}
http://grafika.me/node/408

Добавлено через 6 минут

Вернуться к обсуждению:
В-сплайновые кривые
0
Заказывайте контрольные, курсовые и дипломы здесь.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2016, 19:05

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Кривые Безье
Добрый вечер! Помогите, пожалуйста! Никак не могу разобраться с кривыми Безье :cry: Мне нужно...

Эллиптические кривые
Не подскажете, что можно почитать про эллиптические кривые на средне-популярном уровне? Скажем, на...

Эллиптические кривые
Доброго времени суток! Нуждаюсь в помощи людей, которые разбираются в этом хоть чуточку лучше меня....

полиномиальные кривые
Здравствуйте! Задание: Z-функции (zmf), PI-функции (pimf) и S-функции (smf). Функция zmf...

Кривые Безье
Имеется задание: С помощью кубических кривых Безье нарисовать первую букву своего имени(Русский или...

кривые зеркала
Есть сайтик. все было норм. 10 стр в индексе, их и есть 10. сегодня смотрю - 14 добавило 4...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.