Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/88: Рейтинг темы: голосов - 88, средняя оценка - 4.72
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407

График параметрической функции (C++)

21.01.2019, 18:30. Показов 18492. Ответов 29

Студворк — интернет-сервис помощи студентам
Всем привет!
На C++ SFML написал код программы, позволяющей строить графики функций вида y = f(x) и параметрически заданных x = f1(t), y = f2(t). Однако функции параметрические программа строит кривовато (см. скрин). Помогите скорректировать код, чтобы норм. строились функции. Такое ощущение, что дело в угле ang.
Принцип построения графиков: ищем точки графика по функции, эти точки соединяем прямоугольниками, которые играют роль линий. У прямоугольника задаём ширину (const), длину (по теореме Пифагора между соседними точками), координаты истока (леволежащая точка) и угол от горизонтали. У меня подозрение на угол, но это не точно.
Спасибо тем, кто поможет!

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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#include <SFML/Graphics.hpp>
#include <iostream>
#include <windows.h>
#include <sstream>
#include <functional>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <map>
#include <string>
 
using namespace std;
using namespace sf;
 
//Функции
 
//Конвертер в строку
template<typename T>
string convert_to_string(const T &);
 
//Облако точек функции
void function_point_cloud
(
    const function<double(double)> &f,
    vector<pair<double, double>> &v,
    const double &min,
    const double &max,
    const double &step
);
 
//Облако точек параметрической функции
void parametric_function_point_cloud
(
    const function<pair<double, double>(double)> &f,
    vector<pair<double, double>> &v,
    const double &t_max,
    const double &step
);
 
//Отрисовка графика
Image graph_builder
(
    const vector<vector<pair<double, double>>> &Data_,
    const double &limit_x0,
    const double &limit_x1,
    const double &limit_y0,
    const double &limit_y1,
    const double &step_x,
    const double &step_y,
    const vector<Color> &colors,
    const string &type,
    const string &win_name,
    const size_t &sz_win_x,
    const size_t &sz_win_y,
    const size_t &margin,
    const size_t &marker_size,
    const int &shift_of_axis_x,
    const int &shift_of_axis_y,
    const size_t &thickness_axis,
    const string &x_name,
    const string &y_name,
    const Color &color_axis,
    const Color &color_auxiliary,
    const size_t &thickness_auxiliary_line,
    const size_t &font_size
);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("color 0A");
 
    //+++++Графики
    //Обёртка для функции
    function<double(double)> f;
    //Обёртка для параметрической функции
    function<pair<double, double>(double)> fp;
    //Контейнеры
    //Пакет функций
    vector<vector<pair<double, double>>> funcs;
    //Пакет точек функции
    vector<pair<double, double>> Data_;
    //Конфигурация системы отрисовки графиков
    double x_min = -12,
    x_max = 12,
    step = 0.05,
    min_y = -12,
    max_y = 12;
 
    //Палитра цветов линий графиков для функций в порядке следования их наборов точек в контейнере
    vector<Color> colors;
    colors.push_back(Color(0, 255, 0));
    colors.push_back(Color(255, 0, 0));
    colors.push_back(Color(255, 255, 0));
    colors.push_back(Color(150, 75, 0));
    colors.push_back(Color(225, 165, 0));
    colors.push_back(Color(66, 170, 255));
 
    //Задача функций
    
    //Функция 1
    f = [](double x)
    {
    double y = 10 * sin(0.5 * x);
    return y;
    };
    function_point_cloud(f, Data_, x_min, x_max, step);
    funcs.push_back(Data_);
 
    
    //Функция 2
    Data_.clear();
    fp = [](double t)
    {
        double x = 12 * sin(t);
        double y = 12 * cos(t);
        return make_pair(x, y);
    };
    parametric_function_point_cloud(fp, Data_, x_max, step);
    funcs.push_back(Data_);
    
 
    //Отрисовка пакета графиков
    auto img_graph = graph_builder
    (
        funcs,
        x_min,
        x_max,
        min_y,
        max_y,
        1.,
        1.,
        colors,
        "line",
        "Graphic",
        1020u,
        1020u,
        20u,
        3u,
        0,
        0,
        3u,
        "x",
        "y",
        Color::White,
        Color::Cyan,
        1u,
        18u
    );
    img_graph.saveToFile("Graph.jpg");
 
    system("pause");
    return 0;
}
 
//+++++Функции
 
//Конвертер в строку
template<typename T>
string convert_to_string(const T &value)
{
    stringstream ss;
    string output;
    ss << value;
    ss >> output;
    return output;
}
 
//Облако точек функции
void function_point_cloud
(
    const function<double(double)> &f,
    vector<pair<double, double>> &v,
    const double &min,
    const double &max,
    const double &step
)
{
    for (double u = min; u <= max; u += step)
    {
        v.push_back(make_pair(u, f(u)));
    }
}
 
//Облако точек параметрической функции
void parametric_function_point_cloud
(
    const function<pair<double, double>(double)> &f,
    vector<pair<double, double>> &v,
    const double &t_max,
    const double &step
)
{
    for (double u = 0.0; u <= t_max; u += step)
    {
        v.push_back(make_pair(f(u).first, f(u).second));
    }
}
 
//Отрисовка графика
static Image graph_builder
(
    const vector<vector<pair<double, double>>> &Data_,
    const double &limit_x0,
    const double &limit_x1,
    const double &limit_y0,
    const double &limit_y1,
    const double &step_x,
    const double &step_y,
    const vector<Color> &colors,
    const string &type,
    const string &win_name,
    const size_t &sz_win_x,
    const size_t &sz_win_y,
    const size_t &margin,
    const size_t &marker_size,
    const int &shift_of_axis_x,
    const int &shift_of_axis_y,
    const size_t &thickness_axis,
    const string &x_name,
    const string &y_name,
    const Color &color_axis,
    const Color &color_auxiliary,
    const size_t &thickness_auxiliary_line,
    const size_t &font_size
)
{
    //Число Пи
    double pi = atan(1.) * 4.;
 
    //Скриншот
    Image img;
 
    //Имя окна
    //string win_name = window_name;
 
    //Размеры окна
    //int sz_win_x = window_size_x; //1350
    //int sz_win_y = window_size_y; //1020
 
    //Рамка
    //int margin = 20;
 
    //Размер маркера
    //size_t marker_size = 5u;
 
    //Смещение центра системы координат
    int shift_of_center_x = static_cast<double>(sz_win_x) / 2.;
    int shift_of_center_y = static_cast<double>(sz_win_y) / 2.;
 
    //Смещение осей координат от центра системы
    //int shift_of_axis_x = 0;
    //int shift_of_axis_y = 0;
 
    //Толщина осей
    //unsigned thickness_axis = 3;
 
    //Толщина линий графиков
    size_t thickness_gr = marker_size;
 
    //Цвет осей
    //Color color_axis(Color::White);
 
    //Названия осей
    //string x_name = "x";
    //string y_name = "y";
 
    //Цвет вспомогательных линий
    //Color color_auxiliary(Color::Cyan);
 
    //Толщина вспомогательной линии
    //unsigned thickness_auxiliary_line = 1;
 
    //Коэффициента масштабирования кривых по осям
    //double scale_factor_x = 1.0;
    //double scale_factor_y = 1.0;
 
    //Цвет графика
    Color color_graph;
 
    //Терминалы значений по осям
    //double limit_x0 = -10;
    //double limit_x1 = 10;
    //double limit_y0 = -5;
    //double limit_y1 = 5;
 
    //Шаги отметок по осям
    //double step_x = 1.;
    //double step_y = 1.;
 
    RenderWindow window(VideoMode(sz_win_x, sz_win_y), win_name);
 
    cout << "Чтобы программа продолжила выполнение закройте после просмотра окно графика (которое появится)" << endl;
    cout << endl;
 
    //Работа в окне
    while (window.isOpen())
    {
        //Событие
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        window.clear(Color::Black);
 
        unsigned NULL_x = 40;
        int st_y = 805;
 
        //Загрузка шрифтов
        sf::Font font;
        if (!font.loadFromFile("C:\\Windows\\Fonts\\arial.ttf"))
        {
            cout << "Ошибка чтения шрифта" << endl;
        }
        Text text;
        text.setFont(font);
        text.setCharacterSize(font_size); //В пикселях, а не точках!
        text.setFillColor(sf::Color::Green);
        text.setStyle(sf::Text::Bold);
 
        //Прочерчивание осей
 
        //Прямоугольник представляющий оси
        RectangleShape rectangle0;
        rectangle0.setFillColor(color_axis);
 
        //Вертикаль Y
        rectangle0.setPosition(shift_of_center_x + shift_of_axis_y, margin);
        rectangle0.setSize(Vector2f(thickness_axis, sz_win_y - 2 * margin));
        window.draw(rectangle0);
 
        //Горизонталь X
        rectangle0.setPosition(margin, shift_of_center_y + shift_of_axis_x);
        rectangle0.setSize(Vector2f(sz_win_x - 2 * margin, thickness_axis));
        window.draw(rectangle0);
 
        //Разметка вертикальной оси
        unsigned count_marker_y = static_cast<double>(limit_y1 - limit_y0) / step_y;
        unsigned len_axis_y = sz_win_y - 2 * margin;
        for (unsigned u = 0; u <= count_marker_y; ++u)
        {
            //Текст
            text.setString(convert_to_string(limit_y0 + (count_marker_y - u) * step_y));
            text.setPosition(shift_of_center_x + shift_of_axis_y + 15, (static_cast<double>(len_axis_y) / count_marker_y) * u + margin - 10);
            window.draw(text);
 
            //Вспомогательные линии сетки
            //Прямоугольник представляющий вспомогательные линии сетки
            rectangle0.setFillColor(color_auxiliary);
            //Вертикальные
            rectangle0.setPosition(shift_of_center_x - margin + 15 + shift_of_axis_y, (static_cast<double>(len_axis_y) / count_marker_y) * u + margin);
            rectangle0.setSize(Vector2f(11, thickness_auxiliary_line * 2));
            window.draw(rectangle0);
            //Горизонтальные
            rectangle0.setPosition(margin, (static_cast<double>(len_axis_y) / count_marker_y) * u + margin);
            rectangle0.setSize(Vector2f(sz_win_x - 2 * margin, thickness_auxiliary_line));
            window.draw(rectangle0);
        }
 
        //Разметка горизонатльной оси
        unsigned count_marker_x = static_cast<double>(limit_x1 - limit_x0) / step_x;
        unsigned len_axis_x = sz_win_x - 2 * margin;
        for (unsigned u = 0; u <= count_marker_x; ++u)
        {
            //Текст
            text.setString(convert_to_string(limit_x0 + u * step_x));
            text.setPosition((static_cast<double>(len_axis_x) / count_marker_x) * u + margin, shift_of_center_y + shift_of_axis_x + 15);
            window.draw(text);
 
            //Вспомогательные линии сетки
            rectangle0.setPosition((static_cast<double>(len_axis_x) / count_marker_x) * u + margin, shift_of_center_y - margin + 15 + shift_of_axis_x);
            rectangle0.setSize(Vector2f(thickness_auxiliary_line * 2, 11));
            window.draw(rectangle0);
 
            rectangle0.setPosition((static_cast<double>(len_axis_x) / count_marker_x) * u + margin, margin);
            rectangle0.setSize(Vector2f(thickness_auxiliary_line, sz_win_y - 2 * margin));
            window.draw(rectangle0);
        }
 
        //Подпись имён осей
 
        //X
        text.setString(x_name);
        text.setPosition(sz_win_x - margin - 15, shift_of_center_y + shift_of_axis_x - 25);
        window.draw(text);
 
        //Y
        text.setString(y_name);
        text.setPosition(shift_of_center_x + shift_of_axis_y - 15, margin);
        window.draw(text);
 
        //Отрисовка графика
 
        //Коэффициенты масштабирования по осям
        double scaling_factor_x = static_cast<double>(sz_win_x - 2 * margin) / (limit_x1 - limit_x0); //Пиксел в натуре
        double scaling_factor_y = static_cast<double>(sz_win_y - 2 * margin) / (limit_y1 - limit_y0);
 
        auto colors0 = colors;
 
        for (auto g : Data_)
        {
            color_graph = colors0[0];
            colors0.erase(colors0.begin());
            pair<double, double> old;
            bool trigger = true;
            for (auto pr : g)
            {
                if (trigger)
                {
                    trigger = false;
                }
                else
                {
 
                    double point_x_old = (old.first - limit_x0) * scaling_factor_x + margin;
                    double point_y_old = sz_win_y + (limit_y0 - old.second) * scaling_factor_y - margin;
 
                    if (type == "line")
                    {
                        double point_x_next = (pr.first - limit_x0) * scaling_factor_x + margin;
                        double point_y_next = sz_win_y + (limit_y0 - pr.second) * scaling_factor_y - margin;
 
                        double len = sqrt(pow((point_x_next - point_x_old), 2) + pow((point_y_next - point_y_old), 2));
                        sf::RectangleShape line(sf::Vector2f(len, thickness_gr));
                        line.setPosition(point_x_old, point_y_old);
                        double ang = (asin((point_y_next - point_y_old) / len) / pi) * 180;
                        line.rotate(ang);
                        line.setFillColor(color_graph);
                        window.draw(line);
                    }
                    else if (type == "points")
                    {
                        sf::CircleShape shape(marker_size);
                        shape.setPosition(point_x_old - marker_size, point_y_old - marker_size);
                        shape.setFillColor(color_graph);
                        window.draw(shape);
                    }
                }
                old = pr;
            }
        }
 
        //Скрин графика
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
            {
                img = window.capture();
                window.close();
                break;
            }
            default:
                break;
            }
        }
 
        //Отображение графика в окне
        window.display();
    }
 
    cout << "График успешно построен" << endl;
    cout << endl;
    return img;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2019, 18:30
Ответы с готовыми решениями:

График параметрической функции
Тут такое дело - по матану нужно было построить график параметрической функции x=(t^2+6*t+5)/3 &amp;&amp; y=(t^3-54)/(2*t) с исследованием....

График параметрической функции в Scilab
Не могу построить параметрический график!:( t=0:0.05:10; x=(t^2+t)/(t^2-t); y=(t^2-t)/(t^2+1); plot(x,y); Вот этот график...

Построить график параметрической функции
помогите график построить пожалуйста, очень нужно (

29
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.01.2019, 21:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Либо перестраивает (в значении излишка).
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Чем шаг меньше, тем окружность более сомкнута.
Что это все?
“Окружность также можно описать с помощью параметрического уравнения:”
https://ru.wikipedia.org/wiki/Окружность
задаете x0,y0,R, количество точек.
Находите шаг угла в радианах и в цикле получаете массив.

Обычно строят окружность R=1 в начале координат, так проще видно косяки.
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
24.01.2019, 09:34  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Что это все?
Да. Решение на поверхности было.
У меня было:
(Терминалы параметра: от 0 до 12) + (Крупный шаг)
Крупный шаг - это для отладки, чтобы лучше было как линии прочерчены. Потом я изменил интервал параметров на правильный, стал уменьшать шаг => увеличилось число точек, окружность стала смыкаться (с уменьшением шага).
Нужно:
(Терминалы параметра: от 0 до 2 * pi) + (Мелкий шаг)
Сейчас наделаю и выложу скринов, на которых можно проследить описанную градацию.
А почему он строил несомкнутыми линиями, как будь то штрихами, я про то что на скрине самого вопроса.
Потому что я для поиска угла разворота линий, интерполирующих набор точек, использовал asin() вместо atan2(). После замены на atan2() с передачей необходимых аргументов - стало всё отлично строить и обычные и функции заданные параметрически.
Я также реализовывал светофильтры, фракталы год назад на C++ SFML. Так вод, часть фракталов также вместо замкнутых линий они штрихами прочерчивались (например, фрактал "Дракон"). Там я использовал как обычно asin(), а он в некоторых случаях угол возвращает такой, что приводит к неверному прочерчиванию линий (без замыкания цепочкой).
Если у меня возникнет желание, я там тоже asin() заменю на atan2().
Миниатюры
График параметрической функции (C++)   График параметрической функции (C++)   График параметрической функции (C++)  

График параметрической функции (C++)   График параметрической функции (C++)  
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
24.01.2019, 09:35  [ТС]
Ещё скрины.
Миниатюры
График параметрической функции (C++)   График параметрической функции (C++)   График параметрической функции (C++)  

График параметрической функции (C++)   График параметрической функции (C++)  
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.01.2019, 15:22
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Что это все?
“Окружность также можно описать с помощью параметрического уравнения:”
https://ru.wikipedia.org/wiki/Окружность
задаете x0,y0,R, количество точек.
Находите шаг угла в радианах и в цикле получаете массив.
Обычно строят окружность R=1 в начале координат, так проще видно косяки.
Нужно задать из сколько точек строить кривую.
Шаг радиан=2 пи/ кол-во точек

Цитата Сообщение от SomniPhobia Посмотреть сообщение
я там тоже asin() заменю на atan2().
Asin требует проверки тригонометрических четвертей, а атан2 работает из коробки.

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

Но SFML лучше! Они похоже считают зачем-то по часовой, во вторых зачем-то в градусах, и от 0 до 360.
Сразу 3 косяка.

Добавлено через 4 минуты
Цитата Сообщение от SomniPhobia Посмотреть сообщение
фракталы год назад на C++ SFML. Т
Хотел когда то изучать Qt 4, чтобы слайдерами регулировать параметры фрактала.
В итоге на ПУСТОМ окне с одним слайдером с кода сделанного из примера по книге FPS плавал в 4 раза + фризы GUI.
Переделал код по своему FPS стали стабильны. Похоже эти “Эксперты” читают мышку например 500 раз в сек…
Стер Qt к черту
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
25.01.2019, 14:55  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Нужно задать из сколько точек строить кривую.
Шаг радиан=2 пи/ кол-во точек
Это у меня реализовано следующим образом.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Облако точек параметрической функции
void parametric_function_point_cloud
(
    const function<pair<double, double>(double)> &f,
    vector<pair<double, double>> &v,
    const double &t_min,
    const double &t_max,
    const double &step
)
{
    for (double u = t_min; u <= t_max; u += step)
    {
        v.push_back(f(u));
    }
}
Примеры аргументов.
t_min = 0;
t_max = 2 * pi;
step = 0.05;

Потом идёт подготовка данных к отрисовке.
C++
1
2
3
4
5
6
7
8
9
10
11
//Функция 2
    //Параметрически заданная
    Data_.clear();
    fp = [pi](double t)
    {
        double x = 12 * sin(2 * t);
        double y = 12 * sin(3 * t + pi/2.);
        return make_pair(x, y);
    };
    parametric_function_point_cloud(fp, Data_, 0, 2 * pi, step);
    funcs.push_back(make_tuple(Data_, "line", Color(0u, 255u, 255u), 3u));
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Asin требует проверки тригонометрических четвертей
В том то и дело. Из - за отсутствия проверки четверти и неверно отображались линии графиков при использовании asin().

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Настоящий атан2 возвращает угол от 0 до пи, а знак укажет выше горизонтали OX или ниже.
Я и хотел такую функцию использовать, не знал как называется - Вы подсказали. Спасибо!

Цитата Сообщение от Excalibur921 Посмотреть сообщение
во вторых зачем-то в градусах, и от 0 до 360.
Для людей наверно хотели удобней сделать. В данном случае, неудобно использовать получилось.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Похоже эти “Эксперты” читают мышку например 500 раз в сек…
Количество считываний мышки на секунду нельзя изменить? Я использую Qt C++, делал интерфейс для взаимодействия пользователя с БД MicrosoftSQL. Фракталы я реализовывал на C++ SFML. В Qt больше инструментов, чем в чистом C++, но я привык к чистому C++ в Visual Studio.
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
25.01.2019, 14:57  [ТС]
Скрин.
Миниатюры
График параметрической функции (C++)  
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
25.01.2019, 15:09  [ТС]
Я ещё добавил, можно в полярных координатах строить. Там клевер на скрине.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.01.2019, 16:06
Цитата Сообщение от SomniPhobia Посмотреть сообщение
step = 0.05;
Уже 3 раза сказал неправильно, так стыки кривой обязаны плавать.
Нужно задать количество из сколько точек строить ломанную, зная пределы параметров
находим какой шаг в радиан нужно брать step вычисляют а не задают…что тут сложного?
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Для людей наверно хотели удобней сделать.
А причем тут просто люди? Это должно быть удобно компу и программистам. Может это такой прибах только для отрезка, смотрите их справку.
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Количество считываний мышки на секунду нельзя изменить? Я использую Qt C++,
Понятия не имею, это вопрос наверно уровня ассемблер.
Судя по этому там обязаны быть просто сотни грубейших алгоритмических ошибок самих создателей этой Qt, раз очевидные вещи сделаны криво. Это как дети которые ставят в конфиге игры 999 FPS при максимальных 60 FPS монитора. Поэтому люди и ругают его за лаги GUI. Если не пашет правильно даже жалкий слайдер на пустом окне, о какой скорости работы говорить и зачем терзать это лаговое чудо?

Вон у меня в профиле 6 тем на Qt 4.8 предельная версия что пашет.
Просил примеры от гуру но ничего =). Хотел рисовать фракталы \ странные аттракторы и любую графику но так и остался на месте…а потом бросил.
Нарисовать, двигать, сохранить линию Qt 4.8.4
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
25.01.2019, 17:53  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Уже 3 раза сказал неправильно, так стыки кривой обязаны плавать.
Нужно задать количество из сколько точек строить ломанную, зная пределы параметров
находим какой шаг в радиан нужно брать step вычисляют а не задают…что тут сложного?
Поправил. Теперь точка старта совпадает с финишем в подавляющем числе значений разбиения для параметрически заданной функции. Также заменил цикл с double счётчиком на цикл с size_t счётчиком. Я слышал, что цикл double не рекомендуется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Облако точек параметрической функции
void parametric_function_point_cloud
(
    const function<pair<double, double>(double)> &f,
    vector<pair<double, double>> &v,
    const double &t_min,
    const double &t_max,
    const double &count_points_split
)
{
    double step = (t_max - t_min) / count_points_split;
    double left = t_min;
    for (size_t u = 0u; u < count_points_split; ++u, left += step)
    {
        v.push_back(f(left));
    }
}
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.01.2019, 18:49
А зачем эти велики вообще?

Разве нет готового рисователя кривых\графиков +адаптивное сглаживание + приличный и самый быстрый код умных дядей.
Помню написал велик одной функции над массивом понятный мне велик…так человек с форума заюзал какую-то готовую функцию…а там наверно вставки из ассемблера.

В общем готовая в 3 раза по скорости была быстрей…недаром хают велики.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Пост 11.
value 15136 time 0.9210
Пост 12 мой велик.
value 15135 time 3.78
Одно значение потерялось.
В 4 раза медленней. Я в шоке...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2019, 18:49

Построить график параметрической функции
x(t)=|cos(t| y(t)=sin(2t) 0&lt;= t &lt;=п/2 Как решить это напишите пожалуйста

График функции в параметрической форме
Доброго времени суток! Не могли бы вы пожалуйста помочь с решение задачи . В одной системе координат построить график функции y=f(x)...

Как построить график параметрической функции
помогите сделать график параметрической функции X(t)=a *cos(t)^2+ b * cos (t) y(t)=a *cos(t)*sin(t)+ b* sin(t)

Построить график функции заданной в параметрической форме
Построить график функции заданной в параметрической форме: x=x(t), y=y(t), (a=const) \left\{\begin{matrix} x = 2a*sint &amp; \\ ...

Написать программу, которая строит график параметрической функции
Всем привет. Не могу понять задачу. Используя операторы цикла написать программу, которая строит график параметрической функции {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru