Задача
Нарисовать выбранную форму сигнала на Canvas с заданным числом периодов.
Компоненты на форме
PaintBox, ComboBox (ComboShape), Edit (EditCycles), Button (ButtonDraw).
Как работает
- Выбрать форму сигнала.
- Для каждого пикселя посчитать фазу и значение.
- Соединить точки ломаной.
Исходный код модуля
//---------------------------------------------------------------------------
// Проект 33. Осциллограмма сигнала
// Синус, меандр и пила на Canvas с выбором формы.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Генератор форм сигнала. sample(t) возвращает мгновенное значение −1..1
// для выбранной формы — ядро проверяется тестом на ключевых точках.
double sample(int shape, double phase) // phase 0..1, shape 0=sin 1=меандр 2=пила 3=треуг
{
switch (shape){
case 0: return sin(2*M_PI*phase);
case 1: return (phase<0.5)? 1.0 : -1.0;
case 2: return 2.0*phase - 1.0;
case 3: return (phase<0.5)? (4*phase-1) : (3-4*phase);
}
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonDrawClick(TObject *Sender)
{
TCanvas *c=PaintBox1->Canvas; int W=PaintBox1->Width,H=PaintBox1->Height;
c->Brush->Color=clBlack; c->FillRect(PaintBox1->ClientRect);
int shape=ComboShape->ItemIndex; double cycles=StrToIntDef(EditCycles->Text,3);
c->Pen->Color=clYellow;
for (int px=0;px<W;px++){
double ph = fmod(px*cycles/(double)W, 1.0);
double v = sample(shape, ph);
int py=(int)(H/2 - v*H*0.4);
if (px==0) c->MoveTo(px,py); else c->LineTo(px,py);
}
}
//---------------------------------------------------------------------------
Пояснения
- Ядро sample(shape, phase) возвращает значение −1…1.
- Число периодов масштабирует фазу по ширине области.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.
Что дальше
Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.