Ответ 1
Вероятно, у вас будет более одного образца для каждого пикселя. Для каждой группы образцов, отображенных на один пиксель, вы можете провести (вертикальный) сегмент линии от минимального значения в группе образцов до максимального значения. Если вы увеличиваете масштаб до 1 образца на пиксель или меньше, это больше не работает, а "хорошим" решением будет отображать интерполированные значения sinc. Поскольку DrawLine не может рисовать один пиксель, возникает небольшая проблема, когда минимальные и максимальные значения одинаковы. В этом случае вы можете скопировать одно пиксельное изображение в нужную позицию, как в приведенном ниже коде:
double samplesPerPixel = (double)L / _width;
double firstSample = 0;
int endSample = firstSample + L - 1;
for (short pixel = 0; pixel < _width; pixel++)
{
int lastSample = __min(endSample, (int)(firstSample + samplesPerPixel));
double Y = _data[channel][(int)firstSample];
double minY = Y;
double maxY = Y;
for (int sample = (int)firstSample + 1; sample <= lastSample; sample++)
{
Y = _data[channel][sample];
minY = __min(Y, minY);
maxY = __max(Y, maxY);
}
x = pixel + _offsetx;
y1 = Value2Pixel(minY);
y2 = Value2Pixel(maxY);
if (y1 == y2)
{
g->DrawImageUnscaled(bm, x, y1);
}
else
{
g->DrawLine(pen, x, y1, x, y2);
}
firstSample += samplesPerPixel;
}
Обратите внимание, что Value2Pixel масштабирует значение выборки до значения пикселя (в направлении y).