Source file: /~heha/mb-iwp/NA/MSVC.zip/src/Sweep.cpp

/* Grafische Darstellung, auf Geschwindigkeit optimiert
 */

#include "PiezoMess.h"

SWEEP sweep;

void SWEEP::ChangeScale() {	// Nur die Frequenz-Skale (x) ändert sich!
 x.a=feature.GetFu()/FreqUnit.Mul;
 x.e=feature.GetFo()/FreqUnit.Mul;
 x.log=feature.IsLog();
 x.AutoCalcTicks();
 WaitForSingleObject(hMutex,INFINITE);
 if (data) delete[] data;
 width=feature.steps;
 if (width<2) width=2;
 data=new SDATA[width];
 writtento=0;			// damit's schöner aussieht
 ReleaseMutex(hMutex);
 InvalidateRect(ghMainWnd,NULL,TRUE); 
}

void SWEEP::Resize(int cx, int cy) {
 SetRect(&bbox,SCALEWIDTH,SCALEWIDTH,cx-SCALEWIDTH,cy-SCALEWIDTH);
 SetRect(&amp.bbox,0,bbox.top,bbox.left,bbox.bottom);	// links vom Diagramm zum Fensterrand
 SetRect(&pha.bbox,bbox.right,bbox.top,cx,bbox.bottom);	// rechts vom Diagramm zum Fensterrand
 SetRect(&x.bbox,bbox.left,bbox.bottom,bbox.right,cy);	// unter das Diagramm
 if (gdi.bmpBack) DeleteBitmap(gdi.bmpBack);
 HDC dc=GetDC(0);
 gdi.bmpBack=CreateCompatibleBitmap(dc,bbox.width(),bbox.height());
 ReleaseDC(0,dc);
}

void SWEEP::GenXPositions(const RECT*rcBack, POINT*pt) const {
 double scale = x.e!=x.a ? (rcBack->right-rcBack->left-1)/(x.e-x.a) : 1;
 for (int i=0; i<width; i++) {
  double f = i*(x.e-x.a)/(width-1)+x.a;	// Frequenzwert des Samples
  pt[i].x = rcBack->left+lrint((f-x.a)*scale);
 }
}

void SWEEP::GenYPositions(const RECT*rcBack, POINT*pt, const SDATA*data, bool pha) const {
 double scale = ((pha?rcBack->top-rcBack->bottom:rcBack->bottom-rcBack->top)+1)*16/(double)adcmean.ref;
 int offset = pha?rcBack->bottom:rcBack->top;
 for (int i=0; i<width; i++) {
  double y = pha ? data[i].pha() : data[i].amp();		// zugehöriger Messwert (noch unskaliert)
  pt[i].y = lrint(y*scale)+offset;
 }
}

// Mischfarben-Komponente (R, G oder B) generieren
static BYTE BlendByte(BYTE from, BYTE to, int to256) {
 return from+MulDiv(to-from,to256,256);
}

// Mischfarbe erzeugen
COLORREF BlendColor(COLORREF from, COLORREF to, int to256) {
 return RGB(
  BlendByte(GetRValue(from),GetRValue(to),to256),
  BlendByte(GetGValue(from),GetGValue(to),to256),
  BlendByte(GetBValue(from),GetBValue(to),to256));
}

void SWEEP::Draw(HDC dc, bool all) const{
 if (all) {
  x.Draw(dc);
  amp.Draw(dc);
  pha.Draw(dc);
 }
 RECT rcBack;	// Rechteck in Hintergrund-Bitmap
 HDC dcBack=CreateCompatibleDC(dc);
 SetRect(&rcBack,0,0,bbox.width(),bbox.height());
 HBITMAP obm=SelectBitmap(dcBack,gdi.bmpBack);
 FillRect(dcBack,&rcBack,GetStockBrush(BLACK_BRUSH));
 POINTFLOAT scale={
  (float)((rcBack.right-rcBack.left-1)/(x.e-x.a)),
  (float)((rcBack.top-rcBack.bottom+1)/(amp.e-amp.a))};
// Gitternetz: waagerecht (Ticks von amp-Skale)
 POINT p2[2];
 SelectPen(dcBack,gdi.penDivider[0]);
 if (amp.okay()) {
  p2[0].x=rcBack.left;
  p2[1].x=rcBack.right;
  for (double z=amp.begin(); !amp.beyond(z); z=amp.next(z)) {
   p2[1].y=p2[0].y=rcBack.bottom-1+lrint((z-amp.a)*scale.y);
   Polyline(dcBack,p2,2);
  }
 }
// Gitternetz: senkrecht
 if (x.okay()) {
  p2[0].y=rcBack.top;
  p2[1].y=rcBack.bottom;
  for (double z=x.begin(); !x.beyond(z); z=x.next(z)) {
   if (z!=z) break;
   p2[1].x=p2[0].x=rcBack.left+lrint((z-x.a)*scale.x);
   Polyline(dcBack,p2,2);
  }
 }
 if (data) {
// Graf
  POINT *pt=new POINT[width];	// Punktliste
  if (!pt) return;
  GenXPositions(&rcBack,pt);	// Frequenzwert des Samples
  if (backup) {
   int i;
   Trace const *tr = amp.trace;
   for (i=0; i<nbackup; i++) {
    HPEN pen=CreatePen(tr->penstyle,tr->penwidth,BlendColor(0,tr->color,MulDiv(i+2,256,nbackup+2)));
    HPEN o=SelectPen(dcBack,pen);
    GenYPositions(&rcBack,pt,backup[i]);
    Polyline(dcBack,pt,width);
    SelectPen(dcBack,o);
    DeletePen(pen);
   }
   SelectPen(dcBack,gdi.penGraph[3]);
   tr = pha.trace;
   for (i=0; i<nbackup; i++) {
    HPEN pen=CreatePen(tr->penstyle,tr->penwidth,BlendColor(0,tr->color,MulDiv(i+2,256,nbackup+2)));
    HPEN o=SelectPen(dcBack,pen);
    GenYPositions(&rcBack,pt,backup[i],true);
    Polyline(dcBack,pt,width);
    SelectPen(dcBack,o);
    DeletePen(pen);
   }
  }
// Amplitude: 0 → +30 dB, ~3200 → -30 dB = Referenzspannung (1,8 V) vom AD8302
// {die müsste man den Messdaten voranstellen!}
  WaitForSingleObject(hMutex,INFINITE);
  GenYPositions(&rcBack,pt,data);
  ReleaseMutex(hMutex);
  SelectPen(dcBack,gdi.penGraph[0]);
  Polyline(dcBack,pt,nsamp);
  Polyline(dcBack,pt+nsamp,width-nsamp);
// Phase: 0 → ±180°, ~3200 → 0° = Referenzspannung vom AD8302
  WaitForSingleObject(hMutex,INFINITE);
  GenYPositions(&rcBack,pt,data,true);
  ReleaseMutex(hMutex);
  SelectPen(dcBack,gdi.penGraph[1]);
  Polyline(dcBack,pt,nsamp);
  Polyline(dcBack,pt+nsamp,writtento-nsamp);
  if (nsamp && nsamp!=width) {
   SelectPen(dcBack,GetStockPen(WHITE_PEN)/*gdi.penDivider[0]*/);
   int x=MulDiv(bbox.width(),nsamp,width);
   POINT pt[2]={x,0,x,bbox.height()};
   Polyline(dcBack,pt,2);
  }
  delete[] pt;
 }
 BitBlt(dc,bbox.left,bbox.top,rcBack.right,rcBack.bottom,dcBack,0,0,SRCCOPY);
 SelectBitmap(dcBack,obm);
 DeleteDC(dcBack);
}
Detected encoding: UTF-80