InitializeComponent();
}
public
float
getY(float
X) {
return
(float)Math.Sin(X);
}
public
float
delta = 0;
private
void
panel1_Paint(object
sender, PaintEventArgs
e) {
List<PointF>
points = new
List<PointF>();
for
(float
x = -(float)Math.PI
; x < Math.PI;
x += 0.2F) {
PointF
newP = new
PointF(x,
getY(x + delta));
points.Add(newP);
}
GraphPainter
p = new
GraphPainter();
p.draw(points.ToArray(),
e.Graphics, panel1.Width, panel1.Height);
}
private
void
timer1_Tick(object
sender, EventArgs
e) {
delta
= delta + 0.1F;
panel1.Invalidate();
}
}
class
GraphPainter
{
//0,
3, 8
//0,
3/8, 8/8
//[a..b]
//[0..b-a]+a
//[0..1]*(b-a)+a
//(a-min)/(max-min)
//[0..maxDrawX]
//[0..1]*MaxDrawX
public
void
draw(PointF[]
points, Graphics
g, int
maxDrawX, int
maxDrawY) {
float
minX = points.Select(p => p.X).Min();
float
maxX = points.Select(p => p.X).Max();
for
(int
i = 0; i < points.Length; i++) {
if
(maxX == minX) {
points[i].X
= 0.5F;
}
else
{
points[i].X
= (points[i].X - minX) / (maxX - minX);
}
points[i].X
= points[i].X * maxDrawX;
}
float
minY = points.Select(p => p.Y).Min();
float
maxY = points.Select(p => p.Y).Max();
for
(int
i = 0; i < points.Length; i++) {
if
(maxY == minY) {
points[i].Y
= 0.5F;
}
else
{
points[i].Y
= (points[i].Y - minY) / (maxY - minY);
points[i].Y
= 1 - points[i].Y;
}
points[i].Y
= points[i].Y * maxDrawY;
}
for
(int
i = 0; i < points.Length - 1; i++) {
g.DrawLine(Pens.Black,
points[i], points[i + 1]);
}
}
}
}