Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как построить график функции tg(X)???


Автор: RammeN 19.12.2007, 17:44
Пожалуйста, расскажите как построить график функции y=tg(X), буду очень благодарен! Надо курсовую доделать, а как сделать тангенс - ума не хватает!  smile 

Автор: mr.DUDA 19.12.2007, 20:09
Создаём проект Windows Application, кидаем на форму Panel, подписываемся на событие панели Paint. Пишем код:

Код
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        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);

            // координаты предыдущей точки
            int ixPrev = -1, iyPrev = (int)halfH;

            // тангенс на интервале x=[-Pi..Pi]
            // проходим по всем точкам на форме, вычисляем x и y=tg(x)
            for (int ix = 0; ix < W; ix++)
            {
                // переводим x в диапазон -1..1
                float x = (ix - halfW) / halfW;

                // переводим x в -pi..pi
                x *= (float)Math.PI;
                
                // получаем tg(x)
                float y = (float)Math.Tan(x);

                // переводим y из -1..1 в пикселы на форме
                int iy = (int)(halfH - y * halfH);

                // вуаля
                e.Graphics.DrawLine(Pens.Red, ixPrev, iyPrev, ix, iy);

                ixPrev = ix;
                iyPrev = iy;
            }
        }
    }
}


Можно также заменить Tan на Sin или Cos и посмотреть что получится smile

Автор: farad 19.12.2007, 20:58
mr.DUDA, безусловно прокатит  smile, но для сложных функций лучше делать по уму, всю байду не вычислять в процессе рисования, а расчитать заранее, засунуть в массив и рисовать уже по даным массива, лишь вводить поправки на координаты..

Автор: Real 19.12.2007, 23:39
Цитата(farad @ 19.12.2007,  20:58)
mr.DUDA, безусловно прокатит  smile, но для сложных функций лучше делать по уму, всю байду не вычислять в процессе рисования, а расчитать заранее, засунуть в массив и рисовать уже по даным массива, лишь вводить поправки на координаты..

Например как?
Глупый вопрос,но скажы?
Напримере покажы, если не сложно?

Автор: RammeN 20.12.2007, 09:54
mr.DUDA, низкий вам поклон!!! Большое спасибо! smile  smile  smile  

Автор: Solotoy29 8.1.2010, 01:25
привет всем, подскажите пожалуста как нарисовать график двух переменных, например вот этой функции:
(-2 * Math.Pow(_x2, 3) + 6 * Math.Pow(_x2, 2) + 6 * _x2 + 10) * Math.Sin(Math.Log(_x1, Math.E)*Math.Pow(Math.E,_x2))

или посоветуйте где можно найти примеры такиг графиков...

Автор: Экскалупатор 8.1.2010, 01:58
Цитата(Solotoy29 @  8.1.2010,  00:25 Найти цитируемый пост)
привет всем, подскажите пожалуста как нарисовать график двух переменных, например вот этой функции:
(-2 * Math.Pow(_x2, 3) + 6 * Math.Pow(_x2, 2) + 6 * _x2 + 10) * Math.Sin(Math.Log(_x1, Math.E)*Math.Pow(Math.E,_x2))

что значит график двух переменных? я так понимаю что график это зависимость чего то от чего то. например зависимость y от x. что у тебя от чего зависит? чему все это выражение равняется? если 0 то вырази одну из переменных, а потом просто считай для разных значений.

Автор: Heinzz 8.1.2010, 13:33
Цитата(Экскалупатор @  8.1.2010,  01:58 Найти цитируемый пост)
что значит график двух переменных?

вероятно это поверхность или группа поверхностей

Автор: Heinzz 8.1.2010, 13:48
для плоской графики можно использовать ZedGraph

Автор: Solotoy29 13.1.2010, 22:54
График мне нужен по теме генетических алгоритмов, оси координат принимают значение поколений и функцыи, какуя я выше приводил, а самая функцыя имеет две переменные (х1 и х2), пользуюсь компонентом ZedGraph но ничего путнего не выходит...

Автор: GavriKos 17.1.2010, 18:29
Если у тебя две оси координат, то у тебя все выражение равно 0, тогда можно одну перменую выразить через другую.

И, по моему, т ы сген.алгоритмами что то напутал.

Автор: Gein 6.12.2010, 22:32
Здравствуйте!
mr.DUDA, В Вашем коде у меня при построении график тангенса пишет " ошибка переполнения", Вы не могли бы сказать, как её можно исправить? И желательно, чтобы тангенс рисовался без этих вертикальных линий, потому что в этих точках он не существует :(
Заранее спасибо всем откликнувшимся!

Автор: Enter 13.12.2010, 18:44
Цитата

график тангенса пишет "ошибка переполнения"

скорее всего значение выходит слишком большое для Int32. я бы сначала сделал проверку функции на существование 
и вставил ловлю ошибок 
Код
try
{
if (!double.IsNaN(fnn)&& !double.IsInfinity(fnn)){}
}
catch (Exception ex)
{
}

чтобы тангенс рисовался без вертикальтных линий, надо тока точки рисовать. при соединении точек линиями график портится.
у меня вроде было простенькое приложение с тангенсом и не только.
http://rapidshare.com/files/436694834/sin.zip

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)