C++ Builder: построение графиков. Часть 2. Синусы (sin)

В предыдущей заметке я писала о построении графика косинуса (cos). На сей раз желаю поведать о построении графика другой математической функции – синус (sin).

В серию о построении графиков в C++ Builder уже вошли такие посты:

  1. Построение косинусов (cos);
  2. Построение синусов (sin);
  3. Построение тангенсов (tg);
  4. Построение котангенсов (ctg).

Разлиновку канвы (под этим действием я понимаю добавление линий на компонент Image) я разбирала в предыдущей статье (ссылка выше).

В этой разберу лишь масштабирование по оси Y (масштабирование по оси X также разобрано в предыдущей статье – иксы то у нас известны на начальном этапе построения графика, а игреки еще нужно посчитать).

В общем, поехали!

Строить будем функцию вида a*sin(X)+k. Естественно, a может быть равно 1 (т.е. фактически не влиять на результат), а k – 0.

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
// делаем компонент Image видимым
  Image1->Visible=true;
 
// циклически рассчитываем максимальное и минимальное
// значения Y 
 for (X=Xmin;X<=Xmax;X+=dX)
  {
   Y=a*sin(X)+k;
   if(Ymax<Y) Ymax=Y;
   if(Ymin>Y) Ymin=Y;
  }
 
// рассчитываем масштаб по оси Y
MasY=(LY-40)/(Ymax-Ymin);
 
// выводим «промасштабированные» значения возле оси Y
// для обозначения уже нарисованных дополнительных линий
  float B[11];
 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);
}
 
//помещаем курсора (карандаш) в нужную точку на 
// объекте Image
 Image1->Canvas->MoveTo(50,LY-(Ymin*(-1)+a*sin(Xmin))*MasY);
 
// рисуем график
 for (X=Xmin;X<=Xmax;X+=dX)
  {
   Y=a*sin(X);
 
 PY=LY-(Ymin*(-1)+Y)*MasY;
       PX=X*MasX+50;
   Image1->Canvas->LineTo(PX-Xmin*MasX,PY);
}

Вот и все. На рисунке график функции синус (sin) построенный с такими исходными данными:

1
2
3
4
5
Xmin = 0;
Xmax=10;
dX=0.02;
a=1;
k=0;

И вот что получилось:

Построенный график функции a*sin(X)+k

Надеюсь, у вас все получится.

0

  1. Толковая статья , очень помогла в работе с компонентой Image.
    Огромный респект автору и создателю сайта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *