Hallo,
in meinem Projekt möchte ich eine Sinus-Funktion (beliebige Frequenz und Amplitude)
berechnen und die einzelnen Punkte über eine Com-Schnittstelle versenden.
Mit Hilfe einer weiteren Com-Schnittstelle werden die Daten eingelesen und
in eine Picturebox gezeichnet (g.DrawCurve(green, sinus_pic2)).
Das versenden der Daten funktioniert reibungslos (mit Terminalprogramm überprüft)
aber beim zeichnen des Graphens kommt es zu Fehlern (Teile der Sinuskurve sind korrekt
gezeichnet, andere widerrum sind nicht zu definieren)
Würde mich über ein Lösungsansatz freuen...
MfG okto
[highlight=c#]
private void berechnen()
{
Graphics h = pictureBox1.CreateGraphics();
Pen red = new Pen(Color.Red, 5);
h.Clear(pictureBox1.BackColor);
double u = Convert.ToDouble(trackBar2.Value);
double f = Convert.ToDouble(trackBar1.Value);
dauer = Convert.ToInt16((1 / f) * 100000);
takt = 0;
takt2 = 0;
sinus = new int[dauer];
sinus[0] = point;
double omega = (2 * Math.PI) * f;
for (int zeit = 0; zeit < dauer; zeit++) //+1
{
double now = u * (Math.Sin(omega * zeit / 100000));
sinus[zeit] = point - Convert.ToInt32(now);
}
sinus_pic[0] = new Point(0, point);
for (int zeit = 1; zeit < pictureBox1.Width; zeit++)
{
double now = u * (Math.Sin(omega * zeit / 100000));
sinus_pic[zeit] = new Point(zeit, point - Convert.ToInt32(now));
}
h.DrawCurve(red, sinus_pic);
}
private void timer1_Tick(object sender, EventArgs e)
{
//if (zeichen == 0)
{
serialPort1.Write(Convert.ToString(sinus[takt]));
takt++;
if (takt == dauer)
takt = 0;
}
// zeichen = 1;
}
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgse)
{
rueck = Convert.ToInt32(serialPort2.ReadExisting());
this.Invoke(new EventHandler(DisplayText));
}
private void DisplayText(object sender, EventArgs e)
{
//zeichen = 0;
sinus_pic2[takt2] = new Point(takt2, (rueck));
takt2++;
if (takt2 == 300)
takt2 = 0;
Graphics g = pictureBox2.CreateGraphics();
Pen green = new Pen(Color.Green, 5);
g.Clear(pictureBox2.BackColor);
g.DrawCurve(green, sinus_pic2);
}
[/highlight]
in meinem Projekt möchte ich eine Sinus-Funktion (beliebige Frequenz und Amplitude)
berechnen und die einzelnen Punkte über eine Com-Schnittstelle versenden.
Mit Hilfe einer weiteren Com-Schnittstelle werden die Daten eingelesen und
in eine Picturebox gezeichnet (g.DrawCurve(green, sinus_pic2)).
Das versenden der Daten funktioniert reibungslos (mit Terminalprogramm überprüft)
aber beim zeichnen des Graphens kommt es zu Fehlern (Teile der Sinuskurve sind korrekt
gezeichnet, andere widerrum sind nicht zu definieren)
Würde mich über ein Lösungsansatz freuen...
MfG okto
[highlight=c#]
private void berechnen()
{
Graphics h = pictureBox1.CreateGraphics();
Pen red = new Pen(Color.Red, 5);
h.Clear(pictureBox1.BackColor);
double u = Convert.ToDouble(trackBar2.Value);
double f = Convert.ToDouble(trackBar1.Value);
dauer = Convert.ToInt16((1 / f) * 100000);
takt = 0;
takt2 = 0;
sinus = new int[dauer];
sinus[0] = point;
double omega = (2 * Math.PI) * f;
for (int zeit = 0; zeit < dauer; zeit++) //+1
{
double now = u * (Math.Sin(omega * zeit / 100000));
sinus[zeit] = point - Convert.ToInt32(now);
}
sinus_pic[0] = new Point(0, point);
for (int zeit = 1; zeit < pictureBox1.Width; zeit++)
{
double now = u * (Math.Sin(omega * zeit / 100000));
sinus_pic[zeit] = new Point(zeit, point - Convert.ToInt32(now));
}
h.DrawCurve(red, sinus_pic);
}
private void timer1_Tick(object sender, EventArgs e)
{
//if (zeichen == 0)
{
serialPort1.Write(Convert.ToString(sinus[takt]));
takt++;
if (takt == dauer)
takt = 0;
}
// zeichen = 1;
}
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgse)
{
rueck = Convert.ToInt32(serialPort2.ReadExisting());
this.Invoke(new EventHandler(DisplayText));
}
private void DisplayText(object sender, EventArgs e)
{
//zeichen = 0;
sinus_pic2[takt2] = new Point(takt2, (rueck));
takt2++;
if (takt2 == 300)
takt2 = 0;
Graphics g = pictureBox2.CreateGraphics();
Pen green = new Pen(Color.Green, 5);
g.Clear(pictureBox2.BackColor);
g.DrawCurve(green, sinus_pic2);
}
[/highlight]
Comment