Похоже на строку:
gr.DrawLine(p, -stepX, lastY, 0, y);
Всегда будет рисовать линию от (-stepX, lastY) до (0, y). Только координаты Y этих точек изменяются во время вашего цикла, который не выглядит так, как вы хотите.
Кроме того, вы шагаете в направлении X на stepX
, который определен как 1 / 35.0f. Это означает, что вы шагаете 35 раз на весь пиксель; немного чрезмерно. Избавьтесь от ScaleTransform
и вместо этого масштабируйте независимую переменную (x), чтобы получить более разумную частоту. Вероятно, вам также следует увеличить значение amplitude
, чтобы получить хорошую кривую.
Я думаю, ваш цикл рисования должен выглядеть примерно так:
for (int x = 1; x < halfX; x += 1)
{
y = (float) amplitude * Math.Sin(x * stepX);
gr.DrawLine(p, x - 1, lastY, x, y);
lastY = y;
}
Это будет рисовать от начала координат (0,0) до правой стороны графического поля сразу. Чтобы оживить это, вам нужно взять этот код, и вместо того, чтобы зацикливаться до halfX
, вы хотите зациклить только часть пути и отслеживать, где вы будете в следующий раз, когда ваш Timer
запустит свое событие.
редактирование:
Каждый раз, когда вы создаете Pen
объект, вы берете дескриптор из Windows через GDI. Эти дескрипторы возвращаются для повторного использования только тогда, когда вы Dispose()
Pen
объект. Если вы создаете новое перо каждый раз, когда рисуете, и не утилизируете его, у вас в конце концов останутся ручки!
Чтобы быть в безопасности при использовании этих типов объектов (Pen
, Brush
, Font
и другие должны быть утилизированы), оберните их в оператор using
:
using (Pen pen = new Pen(Color.Red, 0.015f)) {
// ... use the pen here
}
// After here it is Disposed and cannot be accessed