<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: sin code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 29 Aug 2008 16:16:08 GMT</pubDate>
    <description>DZone Snippets: sin code</description>
    <item>
      <title>Wave Plotter //Pascal Class</title>
      <link>http://snippets.dzone.com/posts/show/2201</link>
      <description>A wave plotter component that is able to draw sin, poly and squared lines, I used this in a osciloscope xD&lt;br /&gt;&lt;br /&gt;I didn't liked this code, but the draw part (TWaveShape.paint) is looking cool, I used the same "X" coord to draw the 3 kinds of lines :)&lt;br /&gt;&lt;br /&gt;I mean:&lt;br /&gt;&lt;br /&gt;loop(x){&lt;br /&gt;  case waveType of&lt;br /&gt;    wtSin: y := lala;&lt;br /&gt;    wtPoly: y := lele;&lt;br /&gt;    wtSqr: y := lili;&lt;br /&gt;  end;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;unit WavePlotter;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  forms, dialogs, SysUtils, Classes, Controls, Graphics;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  PI2 = PI * 2;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TWaveType = ( wtSqr, wtPoly, wtSin );&lt;br /&gt;&lt;br /&gt;  TWave = class( TPersistent )&lt;br /&gt;  public&lt;br /&gt;    waveType: TWaveType;&lt;br /&gt;    color: TColor;&lt;br /&gt;    offset: integer;&lt;br /&gt;    frequency, amplitude, volts, interval, gain: extended;&lt;br /&gt;&lt;br /&gt;    procedure AssignTo(Dest: TPersistent); override;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TWaveShape = class( TGraphicControl )&lt;br /&gt;  protected&lt;br /&gt;    fWaves: TList;&lt;br /&gt;    fBoxSize: integer;&lt;br /&gt;    fLineColor: TColor;&lt;br /&gt;&lt;br /&gt;    function getWave(const index: integer): TWave;&lt;br /&gt;    procedure setBoxSize(const Value: integer);&lt;br /&gt;&lt;br /&gt;    function getBackgroundColor: TColor;&lt;br /&gt;    procedure setBackgroundColor(const Value: TColor);&lt;br /&gt;    procedure setLineColor(const Value: TColor);&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor create( AOwner: TComponent ); override;&lt;br /&gt;    destructor destroy; override;&lt;br /&gt;&lt;br /&gt;    procedure clear;&lt;br /&gt;    procedure delete( const index: integer );&lt;br /&gt;&lt;br /&gt;    function add: integer;&lt;br /&gt;&lt;br /&gt;    property waves[ const index: integer]: TWave read GetWave;&lt;br /&gt;&lt;br /&gt;  published&lt;br /&gt;    procedure paint; override;&lt;br /&gt;    property boxSize: integer read fBoxSize write setBoxSize;&lt;br /&gt;    property backgroundColor: TColor read getBackgroundColor write setBackgroundColor;&lt;br /&gt;    property lineColor: TColor read fLineColor write setLineColor;&lt;br /&gt;&lt;br /&gt;    //inherited&lt;br /&gt;    //property Canvas;&lt;br /&gt;    property Align;&lt;br /&gt;    property Anchors;&lt;br /&gt;    property Constraints;&lt;br /&gt;    property DragCursor;&lt;br /&gt;    property DragKind;&lt;br /&gt;    property DragMode;&lt;br /&gt;    property Enabled;&lt;br /&gt;    //property Font;&lt;br /&gt;    property ParentColor;&lt;br /&gt;    //property ParentFont;&lt;br /&gt;    property ParentShowHint;&lt;br /&gt;    property PopupMenu;&lt;br /&gt;    property ShowHint;&lt;br /&gt;    property Visible;&lt;br /&gt;    property OnClick;&lt;br /&gt;    property OnContextPopup;&lt;br /&gt;    property OnDblClick;&lt;br /&gt;    property OnDragDrop;&lt;br /&gt;    property OnDragOver;&lt;br /&gt;    property OnEndDock;&lt;br /&gt;    property OnEndDrag;&lt;br /&gt;    property OnMouseDown;&lt;br /&gt;    property OnMouseMove;&lt;br /&gt;    property OnMouseUp;&lt;br /&gt;    property OnStartDock;&lt;br /&gt;    property OnStartDrag;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;function max( const a, b: integer ): integer;&lt;br /&gt;begin&lt;br /&gt;  if a &gt; b then&lt;br /&gt;    result := a&lt;br /&gt;  else&lt;br /&gt;    result := b;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TWaveShape }&lt;br /&gt;&lt;br /&gt;function TWaveShape.add: integer;&lt;br /&gt;begin&lt;br /&gt;  result := fWaves.add( TWave.Create );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.clear;&lt;br /&gt;begin&lt;br /&gt;  while fWaves.count &gt; 0 do begin&lt;br /&gt;    TWave( fWaves[0] ).free;&lt;br /&gt;    fWaves.delete( 0 );&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TWaveShape.create(AOwner: TComponent);&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;  fWaves := TList.create;&lt;br /&gt;  fLineColor := clGray;&lt;br /&gt;  color := clBtnFace;&lt;br /&gt;  fBoxSize := 50;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.delete(const index: integer);&lt;br /&gt;begin&lt;br /&gt;  if ( index &gt; -1 ) and ( index &lt; fWaves.count ) then begin&lt;br /&gt;    TWave( fWaves[index] ).free;&lt;br /&gt;    fWaves.delete( index );&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TWaveShape.destroy;&lt;br /&gt;begin&lt;br /&gt;  fWaves.free;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TWaveShape.getBackgroundColor: TColor;&lt;br /&gt;begin&lt;br /&gt;  result := color;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TWaveShape.getWave(const index: integer): TWave;&lt;br /&gt;begin&lt;br /&gt;  result := nil;&lt;br /&gt;  if ( index &gt; -1 ) and ( index &lt; fWaves.count ) then&lt;br /&gt;    result := TWave( fWaves[ index ] );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.paint;&lt;br /&gt;var&lt;br /&gt;  k, x: integer;&lt;br /&gt;  lastX, lastY: array of integer;&lt;br /&gt;  y: extended;&lt;br /&gt;begin&lt;br /&gt;  if not enabled then&lt;br /&gt;    exit;&lt;br /&gt;  canvas.brush.color := color;&lt;br /&gt;  canvas.fillRect( clientRect );&lt;br /&gt;&lt;br /&gt;  setLength( lastY, fWaves.count );&lt;br /&gt;  setLength( lastX, fWaves.count );&lt;br /&gt;  for k := 0 to high( lastY ) do begin&lt;br /&gt;    lastY[k] := clientHeight div 2 + waves[k].offset;&lt;br /&gt;    lastX[k] := 0;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  for x := 0 to max( clientWidth, clientHeight ) do begin&lt;br /&gt;    with canvas do begin&lt;br /&gt;      pen.color := fLineColor;&lt;br /&gt;      pen.width := 1;&lt;br /&gt;      pen.style := psDot;&lt;br /&gt;&lt;br /&gt;      if x mod fBoxSize = 0 then begin&lt;br /&gt;        moveTo( 0, x + trunc( frac( clientHeight / 2 / fBoxSize ) * fBoxSize ) );&lt;br /&gt;        lineTo( clientWidth, x + trunc( frac( clientHeight / 2 / fBoxSize ) * fBoxSize ) );&lt;br /&gt;&lt;br /&gt;        moveTo( x, 0 );&lt;br /&gt;        lineTo( x, clientHeight );&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      for k := 0 to fWaves.count - 1 do begin&lt;br /&gt;        with waves[k] do begin&lt;br /&gt;          pen.color := color;&lt;br /&gt;          pen.width := 1;&lt;br /&gt;          pen.style := psSolid;&lt;br /&gt;&lt;br /&gt;          y := pi*k + PI2 * x * interval / fBoxSize * frequency;&lt;br /&gt;&lt;br /&gt;          case waveType of&lt;br /&gt;            wtSin:&lt;br /&gt;              y := sin( y );&lt;br /&gt;            wtPoly: begin&lt;br /&gt;              y := frac( y / PI2 );&lt;br /&gt;              if y &lt;= 0.25 then&lt;br /&gt;                y := y / 0.25&lt;br /&gt;              else if y &lt;= 0.75 then&lt;br /&gt;                y := ( -y + 0.5 ) / 0.25&lt;br /&gt;              else&lt;br /&gt;                y := ( y - 1 ) / 0.25;&lt;br /&gt;            end;&lt;br /&gt;            wtSqr: begin&lt;br /&gt;              if frac( y / PI2 ) &lt;= 0.5 then&lt;br /&gt;                y := 1&lt;br /&gt;              else&lt;br /&gt;                y := -1;&lt;br /&gt;            end;&lt;br /&gt;          end;&lt;br /&gt;          y := ( y * ( fBoxSize / volts ) * amplitude * gain ) + clientHeight / 2 + offset;&lt;br /&gt;          moveTo( lastX[k], lastY[k] );&lt;br /&gt;          lastX[k] := x;&lt;br /&gt;          lastY[k] := trunc( y );&lt;br /&gt;          lineTo( x, lastY[k] );&lt;br /&gt;        end;&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.setBackgroundColor(const Value: TColor);&lt;br /&gt;begin&lt;br /&gt;  color := Value;&lt;br /&gt;  Invalidate;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.setBoxSize(const Value: integer);&lt;br /&gt;begin&lt;br /&gt;  fBoxSize := Value;&lt;br /&gt;  invalidate;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TWaveShape.setLineColor(const Value: TColor);&lt;br /&gt;begin&lt;br /&gt;  fLineColor := Value;&lt;br /&gt;  Invalidate;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TWave }&lt;br /&gt;&lt;br /&gt;procedure TWave.AssignTo(Dest: TPersistent);&lt;br /&gt;begin&lt;br /&gt;  if Dest.ClassType &lt;&gt; TWave then&lt;br /&gt;    inherited;&lt;br /&gt;  with TWave( Dest ) do begin&lt;br /&gt;    waveType := self.waveType;&lt;br /&gt;    color := self.color;&lt;br /&gt;    offset := self.offset;&lt;br /&gt;    frequency := self.frequency;&lt;br /&gt;    amplitude := self.amplitude;&lt;br /&gt;    volts := self.volts;&lt;br /&gt;    interval := self.interval;&lt;br /&gt;    gain := self.gain;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 15 Jun 2006 19:28:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2201</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
