AFON//Радиотехник
C++Builder · проект 33/50

Осциллограмма

Синус, меандр, пила, треугольник.

Задача

Нарисовать выбранную форму сигнала на Canvas с заданным числом периодов.

Компоненты на форме

PaintBox, ComboBox (ComboShape), Edit (EditCycles), Button (ButtonDraw).

Как работает

  1. Выбрать форму сигнала.
  2. Для каждого пикселя посчитать фазу и значение.
  3. Соединить точки ломаной.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 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.