Продолжаю серию постиков о построении графиков в C++ Builder. Для тех, кто не в курсе, в эту серию уже вошли такие записи:
- Построение косинусов (cos);
- Построение синусов (sin);
- Построение тангенсов (tg);
- Построение котангенсов (ctg).
В общем, данная заметка посвящена тангенсам (tg), а если точнее: построению функции вида a*tg(x)+k
. Константы a
и k
задаются в начале выполнения программы.
Кроме того, в начале выполнения программы должны задаваться минимальное (Xmin
) и максимальное (Xmax
) значения x, а также шаг, с которым данное значение будет изменяться (dX
).
Собственно говоря, разлиновку под график оставим «старой» (рассмотрена в предыдущих статьях, а если точнее – в построении графика косинуса).
Важным моментом является отсутствие функции получения тангенса (tg) в C++ Builder’е. Для этих целей используется выражение, тождественное данной функции. А именно tg(x)=sin(x)/cos(x)
.
Непосредственно построение графика в можно выполнить C++ Builder так:
// делаем рисунок видимым
Image1->Visible=true;
// рассчитываем максимальное и минимальное
// значение по оси Y
for (X=Xmin;X<=Xmax;X+=dX)
{
if (cos(X)==0) X+=dX;
Y=a*sin(X)/cos(X)+k;
if(YmaxY) Ymin=Y;
}
// рассчет масштаба по оси Y
if((Ymax-Ymin)==0) MasY=LY-40;
else MasY=(LY-40)/(Ymax-Ymin);
float B[11];
//вывод промежуточных значений по шкале Y
for (i=0;i<=10;i++)
{
B[i]=50+LY/11*i;
AnsiString S = FloatToStrF(Ymax-((Ymax-Ymin)/10)*i,ffFixed,5,2);
Image1->Canvas->TextOutA(20,B[i]-15,S);
}
// как известно, на 0 делить нельзя, а в случае, если косинус
// от X равен 0, переходим к следующему шагу
if (cos(Xmin)==0) Image1->Canvas->MoveTo(50,LY-(Ymin*(-1)+a*sin(Xmin+dX)/cos(Xmin+dX))*MasY);
else Image1->Canvas->MoveTo(50,LY-(Ymin*(-1)+a*sin(Xmin)/cos(Xmin))*MasY);
// непосредственное построение графика на канве Image1
for (X=Xmin;X<=Xmax;X+=dX)
{
Y=a*sin(X)/cos(X)+k;
PY=LY-(Ymin*(-1)+Y)*MasY;
PX=X*MasX+50;
Image1->Canvas->LineTo(PX-Xmin*MasX,PY);
}
Вот и все. На рисунке график функции тангенс (tg) построенный с такими исходными данными:
Xmin=0;
Xmax=10;
dX=0.02;
a=1;
k=0;
Результат. Как известно, функция тангенсов не существует в некоторых точках (там, где синус (находящийся в знаменателе) равен 0). Прерывания я делать не стала (для учебных целей, как по мне, это излишество. Может есть желание переубедить?..
Надеюсь, у вас все получится.
Очень интересно и познавательно, по крайней мере для меня, так как я учитель математики и мне часто надо строить графики тригонометрических функций, спасибо!
)))
Вы, как учитель математики, знаете об этом гораздо больше меня =)
Тангенс с помощью Брезенхема каким образом сделать?
гхм… не знаю =)
Нет идей как закрасить те квадраты, через которые проходят линии?)
Просто закрасить? – Циклически, в зависимости от значения тангенса. Но вам ведь не это нужно, по сути. Нужно разобрать, как строиться алгоритм поточечно…
Мне желательно с помощью алгоритма Брезенхема, но ведь смещение и будет происходить с помощью цикла, верно?
Да, смещение при помощи цикла. Дело не в этом. Алгоритм предполагает, что вы само значение тангенса найдете циклически (не при помощи функции тангенса). А потом, я так понимаю, отразите на графике точки, которые использовались при расчете. Чисто нарисовать проще наоборот – отталкиваясь от рассчитанных значений тангенса.
Если я верно поняла, конечно %)