/* 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(&.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-8 | 0
|