Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/125: Рейтинг темы: голосов - 125, средняя оценка - 4.50
 Аватар для GreatTalker
4 / 4 / 1
Регистрация: 03.10.2010
Сообщений: 111

Построить график функции на заданном интервале

23.03.2011, 18:10. Показов 24681. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.Необходимо нарисовать график функции F(x)=sin(ln(x))-cos(ln(x))+2ln(x) на интервале[1;3],25 точек с шагом 0,083.Я просмотрел тему Построение графика функции,но только понял,как сделать координатные оси,а сам график у меня не получился
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void panel1_Paint(object sender, PaintEventArgs e)
        {
            float W = panel1.Width, H = panel1.Height;
            float halfW = W / 2, halfH = H / 2;
            e.Graphics.DrawLine(Pens.Black, halfW, 0, halfW, H);
            e.Graphics.DrawLine(Pens.Black, 0, halfH, W, halfH);
            float h=0.083F;
            float x = 1;
             for (int n = 0; n < 26; n++)
             {
              float   y =(float)Math.Sin(Math.Log(x)) - (float)Math.Cos(Math.Log(x)) + 2 * (float)Math.Log(x);
              x = x + 0;
              float xh = x + h;
                 e.Graphics.DrawLine(Pens.Red, x, y, xh,y);
                
             }
В чём моя ошибка?и можно с подробными комментариями,пожалуйста...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2011, 18:10
Ответы с готовыми решениями:

Построить график линейной функции на заданном интервале
Нужно построить график функции y=2x-5 на промежутке от Буду очень благодарен т.к сдам сессию) За ранее спасибо

Построить график двух функций в Chart и найти точки пресечения их на заданном интервале
Здравствуйте, столкнулся с затруднением,поставлена задача: построить график 2х функций cos(x) и sin(x) и найти точки пресечения их на...

Построить график функции на заданном интервале
2. Составить программу на языке Visual Basic Net, которая строит график функции при х от -3 до 3 с шагом 0,1. Добавлено через 10...

30
Заблокирован
24.03.2011, 11:02
вроде так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            float W = panel1.Width, H = panel1.Height;
            float halfW = W / 2, halfH = H / 2;
            e.Graphics.DrawLine(Pens.Black, halfW, 0, halfW, H);
            e.Graphics.DrawLine(Pens.Black, 0, halfH, W, halfH);
            float h = 0.083F;
            float x = 1;
            float yh = (float)Math.Sin(Math.Log(x)) - (float)Math.Cos(Math.Log(x)) + 2 * (float)Math.Log(x);
            for (int n = 0; n < 26; n++)
            {
                float xh = x;
                x += h;
                float y = (float)Math.Sin(Math.Log(x)) - (float)Math.Cos(Math.Log(x)) + 2 * (float)Math.Log(x);
                e.Graphics.DrawLine(Pens.Red, 50 * xh + halfW, halfH - 50 * yh, 50 * x + halfW, halfH - 50 * y);
                yh = y;
            }
        }
увеличили график в 50 раз и сместили относительно начала координат
перевернули т.к. "у" отсчитывается сверху
xh, yh - координаты предыдущей точки
x, y - координаты текущей точки

Добавлено через 10 минут
может вот так понятней будет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            float W = panel1.Width, H = panel1.Height;
            float halfW = W / 2, halfH = H / 2;
            e.Graphics.DrawLine(Pens.Black, halfW, 0, halfW, H);
            e.Graphics.DrawLine(Pens.Black, 0, halfH, W, halfH);
            float h = 0.083F;
            float x = 1;
            for (int n = 0; n < 26; n++)
            {
                e.Graphics.DrawLine(Pens.Red, 50 * x + halfW, halfH - 50 * func(x),
                    50 * (x + h) + halfW, halfH - 50 * func(x + h));
                x += h;
            }
        }
        float func(float z)
        {
            return (float)Math.Sin(Math.Log(z)) - (float)Math.Cos(Math.Log(z)) + 2 * (float)Math.Log(z);
        }
0
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
24.03.2011, 12:27
я посоветую использовать какую-нибудь стороннюю библиотеку...например ZedGraph. Удобно, и не надо изобретать велосипед...
1
 Аватар для GreatTalker
4 / 4 / 1
Регистрация: 03.10.2010
Сообщений: 111
24.03.2011, 19:40  [ТС]
Спасибо всем большое!Только можете объяснить эту строчку?зачем умножать на 50?типа слишком маленькие точки получились бы?xh + halfW почему плюс,а здесь halfH - 50 * yh минус?
e.Graphics.DrawLine(Pens.Red, 50 * xh + halfW, halfH - 50 * yh, 50 * x + halfW, halfH - 50 * y);
ZedGraph?А как её открыть в форме?
0
Местный Ёжидзе
 Аватар для hitmen047
42 / 44 / 4
Регистрация: 03.03.2010
Сообщений: 225
24.03.2011, 23:00
Цитата Сообщение от GreatTalker Посмотреть сообщение
ZedGraph?А как её открыть в форме?
Открывать не нужно. Просто подключаешь к проекту библиотеку ZedGraph'а.
Сперва скачиваешь, затем открываешь проект и подключаешь библиотеку ZedGraph.resources.dll, которую разархивируешь из скачанного архива, из папки ru.
Для подключения библиотек:
1) Правой кнопкой по "ссылки" (в "solution explorer"/"обозревателе решений")
2) "Добавить ссылку"
3) Выбираешь вкладку "обзор" и ищешь ZedGraph.resources.dll (библиотеку, которую ты скачал и разархивировал)

Далее в коде формы прописываешь:
C#
1
using ZedGraph.resources;
И можешь начать строить при помощи возможностей ZedGraph'a.
0
Заблокирован
25.03.2011, 08:58
Цитата Сообщение от GreatTalker Посмотреть сообщение
зачем умножать на 50?типа слишком маленькие точки получились бы?
слишком маленький график получается, поэтому увеличиваем его в 50 раз
Цитата Сообщение от GreatTalker Посмотреть сообщение
xh + halfW почему плюс,а здесь halfH - 50 * yh минус?
"х" увеличивается слева направо, "у" - сверху вниз(т.к. отсчет с левого верхнего угла)
минус чтобы перевернуть график, тогда "у" будет увеличиваться снизу вверх, как и должно быть на графике
1
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
20.05.2011, 10:09
Такой вопрос, использовал вот этот кусок кода:
C#
1
2
3
4
5
6
7
8
            float h = 0.083F;
            float x = 1;
            for (int n = 0; n < 26; n++)
            {
                e.Graphics.DrawLine(Pens.Red, 50 * x + halfW, halfH - 50 * func(x),
                    50 * (x + h) + halfW, halfH - 50 * func(x + h));
                x += h;
            }
Так вот возник такой вопрос: как сделать так, чтобы область значений функции не выходила за пределы какой-то определенной области, в моем случае - area:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            if (this.chkF2.CheckState == CheckState.Checked)
            {
                h = 0.083F;
                x = 0.769F / tbSizing.Value;
                for (int n = 0; n < area.Width; n++)
                {
                    e.Graphics.DrawLine(pf, (float)(tbSizing.Value * 6.5 * x),
                                        area.Height / 2 - 50 * (float)Math.Tan(x),
                                        (float)(tbSizing.Value * 6.5 * (x + h)),
                                        area.Height / 2 - 50 * (float)Math.Tan(x + h));
                    x += h;
                }
            }
Т.е. чтобы график не вылазил за пределы панели или любого другого контрола, не важно. Что-то не могу сообразить как правильно задать верхнюю границу n.
tbSizing.Value - это у меня значение trackbar, с помощью которого я делаю масштабирование графика, т.е. делаю как бы приближение, увеличивая ячею сетки координат.

Добавлено через 42 минуты
И еще такой вопросик, что-то совсем меня притупило с математикой, как построить график экспоненты таким же макаром? Вот такой у меня код:
C#
1
2
3
4
5
6
7
8
9
10
h = 0.083F;
                x = 0.769F / tbSizing.Value;
                for (int n = 0; n < area.Width; n++)
                {
                    e.Graphics.DrawLine(pf, (float)(tbSizing.Value * x * 6.5),
                                        (area.Height / 2 - (float)Math.Exp(x)),
                                        (float)(tbSizing.Value * 6.5 * (x + h)),
                                        (area.Height / 2 - (float)Math.Exp(x + h)));
                    x += h;
                }
Сначала вроде строится, но через секунду выкидывает overflow error, а что там переполняется - черт-те знает. Ошибку выкидывает при n=249, при x=20.74, то есть значение экспоненты получается равным примерно 1 111 100 000, т.е. 1,1 млрд, что вполне укладывается в область значений float.
Есть какие-нибудь мысли по поводу?

Добавлено через 22 часа 12 минут
Вопрос актуален!
0
Заблокирован
20.05.2011, 10:47
Цитата Сообщение от dezmond06 Посмотреть сообщение
чтобы график не вылазил за пределы панели
может так
C#
1
2
3
4
5
6
7
8
            while (x < area.Width)//или другое условие
            {
                e.Graphics.DrawLine(pf, (float)(tbSizing.Value * 6.5 * x),
                                    area.Height / 2 - 50 * (float)Math.Tan(x),
                                    (float)(tbSizing.Value * 6.5 * (x + h)),
                                    area.Height / 2 - 50 * (float)Math.Tan(x + h));
                x += h;
            }
Добавлено через 20 минут
Цитата Сообщение от dezmond06 Посмотреть сообщение
overflow error, а что там переполняется
возможно Math.Exp(x) реализована в виде рекурсии и идет переполнение стека по вызовам самой себя, неохота вот это пересказывать
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
20.05.2011, 11:29
Нет, так тоже вылазит, этот самый интуитивный вариант я в первую очередь попробовал. И главное, не пойму почему вылазит, по законам математики не должно ))
Переполнение, оказывается, у меня по другой причине происходит, что-то связанное с событием OnPaint, переопределив которое я произвожу перерисовку - а я и не посмотрел watcher в начале )), ну да ладно, будем разбираться.
Извините, что надоедаю с вопросами, можете еще подсказать как правильно менять размеры функции при масштабировании (по движению trackbar), какие параметры изменять в ней, а то при увеличении она меняется не так как надо, т.е. надо чтобы при увеличении она проходила через те же точки на осях, но только растягивалась, в другом масштабе, так сказать.
На примере того же косинуса:
C#
1
2
3
4
5
6
7
8
9
10
                h = 0.083F;
                x = 0.769F / tbSizing.Value;
                for (float n = 0; n < area.Width; n++)
                {
                    e.Graphics.DrawLine(pf, (float)(tbSizing.Value*6.5 * x),
                                        area.Height / 2 - 50 * (float)Math.Cos(x),
                                        (float)(tbSizing.Value * 6.5 * (x + h)),
                                        area.Height / 2 - 50 * (float)Math.Cos(x+h));
                x += h;
                }
Помогите, и братская держава вас не забудет!
P.S. Сам наполовину украинец ))
Миниатюры
Построить график функции на заданном интервале   Построить график функции на заданном интервале  
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
23.05.2011, 17:50
Очень актуально еще!

Добавлено через 8 часов 28 минут
Актуально!
0
1 / 1 / 3
Регистрация: 23.10.2010
Сообщений: 18
23.05.2011, 23:04
Возьми ZedGraph насамом деле очень удобно, не паришься по поводу осей, куча опций, настроек, цветов, зумов, можно надписи делать на графике) манипулировать объектами. В использовании достаточно прост без всяких излишних "примудростей".
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
23.05.2011, 23:42
Цитата Сообщение от hasufelisc Посмотреть сообщение
Возьми ZedGraph насамом деле очень удобно, не паришься по поводу осей, куча опций, настроек, цветов, зумов, можно надписи делать на графике) манипулировать объектами. В использовании достаточно прост без всяких излишних "примудростей".
Ну это все хорошо, но надо все сделать стандартными классами, да и так, для себя хочу из спортивного интереса разобраться...
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
06.06.2011, 11:13
Никто не может помочь?
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
16.06.2011, 16:04
Все еще актуально.
0
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
16.06.2011, 16:39
так я не понял...в чём проблема то?...
у тебя есть функция F(x)=sin(ln(x))-cos(ln(x))+2ln(x)
на интервале[1;3],25 точек с шагом 0,083 вычисляешь значение этой функции и заосишь в ссписок List<PointF>, где X = текущему x, Y = F(x)...
Далее задаёшь размер области, на которой будешь рисовать график....далее вычисляешь коэффициент преобразования для осей, т.е. сколько пикселей будет содержаться в еденице длины. ну и далее просто по циклу идёшь, и строишь линии...
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
16.06.2011, 17:05
Цитата Сообщение от DeKaN Посмотреть сообщение
так я не понял...в чём проблема то?...
у тебя есть функция F(x)=sin(ln(x))-cos(ln(x))+2ln(x)
на интервале[1;3],25 точек с шагом 0,083 вычисляешь значение этой функции и заосишь в ссписок List<PointF>, где X = текущему x, Y = F(x)...
Далее задаёшь размер области, на которой будешь рисовать график....далее вычисляешь коэффициент преобразования для осей, т.е. сколько пикселей будет содержаться в еденице длины. ну и далее просто по циклу идёшь, и строишь линии...
Однако, уважаемый, все это уже сделано. Загвоздка заключается именно в математике - как правильно установить этот коэффициент преобразования? Чтобы и функция изменялась правильно и не вылазила за пределы области, где осуществляется рисование?
Функция-то нелинейно изменяется, мне допустим надо cos(x) или экспоненту построить.
Как правильно задать закон, согласно которому она будет изменяться при изменении масштаба?
Я рисунки как она сейчас неправильно работает прилагал, но могу и еще раз приложить -
мой пост
И код уже публиковал свой.
0
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
17.06.2011, 11:31
Функция-то нелинейно изменяется, мне допустим надо cos(x) или экспоненту построить.
а какая разница какая функция...У тебя есть List<PointF> координат....Находишь в нём Xmin,Xmax - это твой интервал...И Ymin,Ymax - просто пробегом по List<PointF>....Затем находишь dY=Ymax-Ymin, и твой коэффициент по оси Y = (Width области рисования)/dY...Ну по X аналогично....
Вопросы?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.06.2011, 11:36
Цитата Сообщение от GreatTalker Посмотреть сообщение
Построить график на C#
Частота утечек памяти от величины утечки, или частоты крахов софтины по времени?
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 19
20.06.2011, 10:08
Вот сделал как написано, вроде:
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
 if (this.chkF1.CheckState == CheckState.Checked)
            {
                h = 0.083F;
                x = 5F;
                List<PointF> mygraph = new List<PointF>();
                float n, xmin, xmax, ymin, ymax;
                xmin = x;
                int i = 0;
                for (n = x; n < area.Width; n += h)
                {
                    PointF g = new PointF(n, (float)Math.Cos(n));
                    mygraph.Add(g);
                    //e.Graphics.DrawLine(pf, (float)(tbSizing.Value*6.5 * x),
                    //                    area.Height / 2 - 50 * (float)Math.Cos(x),
                    //                    (float)(tbSizing.Value * 6.5 * (x + h)),
                    //                    area.Height / 2 - 50 * (float)Math.Cos(x+h));
                    i++;
                }
                xmax = n;
                ymin = mygraph.Min(g => g.Y);
                ymax = mygraph.Max(g => g.Y);
                float fy = area.Width / (ymax - ymin);
                float fx = area.Width / (xmax - xmin);
                Graphics mgr = this.CreateGraphics();
                for (float k = x; k < area.Width; k += h)
                {
                    mgr.DrawLine(pf,
                                        k,
                                        (float)Math.Cos(k) * fy,
                                        (k + h),
                                        (float)Math.Cos(k + h) * fy);
                }
                //MessageBox.Show(fx.ToString());
            }
            else { }
        }
А строится следующая бяка:
Миниатюры
Построить график функции на заданном интервале  
0
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
23.06.2011, 11:05
почему бяка? по-моему стоится косинус..просто его надо растянуть, вот и всё
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.06.2011, 11:05
Помогаю со студенческими работами здесь

Построить график функции на заданном интервале
Народ кто может сделайте, f(x)=sin(x)-a на интервале Добавлено через 2 часа 20 минут Люди кто знает напишите код

Построить график функции на заданном интервале
ИЗУЧЕНИЯ ПОСТРОЕНИЯ ГРАФИКОВ ФУНКЦИЙ на заданном интервале

Построить график функции 1+x*y на заданном интервале [0,1]
Нужна помощь!!!Паскаль

Построить график функции на заданном интервале
1. Очистить экран монитора и при необходимости установить желаемый цвет фона. 2. Выбрать размещения системы координат в соответствии с...

Построить график функции на заданном интервале
Построить график функции f(x,y)=y-(2*x)/y на заданном интервале


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru