Autor Beitrag
blutengel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 02.01.11 20:14 
Hi!

Habe ein Problem mit meinem Programm.

Mit :

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
if (waveform.Value == 3)
            {
              
                double u_spitze;
                double frequenz;
                double periodendauer;
                double augenblickswert;
                double omega;

                u_spitze = Convert.ToDouble(amplitude.Value)*20;
                frequenz = Convert.ToDouble(frequency.Value);
             
                periodendauer = 1 / frequenz;
                int periodendauer_int=Convert.ToInt32( periodendauer = periodendauer * 1000);

                

                Point[] sinus = new Point[periodendauer_int];
                sinus[0] = new Point(20150);// Ersten Punkt manuell festlegen

               omega = (2 * Math.PI) * frequenz;

                //Eine Periode zeichnen!!
                for (int zeit = 1; zeit < periodendauer_int-1; zeit++)
                {
                    
                   augenblickswert = u_spitze * (Math.Sin(omega*zeit));
                   sinus[zeit] = new Point(20 + zeit, 150 - (Convert.ToInt32((u_spitze * (Math.Sin(((2 * Math.PI) * frequenz) * zeit / 1000))))));

                    
                    
                }
                g.DrawCurve(plila, sinus);
}


versuche ich schon seit längerem einen Sinus zu zeichnen. Wie man auf dem Pic sehen kann funktioniert das auch.Die Funktion lässt sich auch über die beiden TrackBars ändern. Aber ich bekomme die Gerade am Ende der Funktion einfach nicht weg.Ich kann leider den Fehler nicht finden.Ich hoffe ich habe alle Informationen, die zu einer Fehlerfindung nötig sind, zusammengetragen.Schon mal Dake im vorraus.



MFG
blutengel
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 02.01.11 20:24 
Da liegt daran, daß du ein Array 'sinus' der Größe 'periodendauer_int' anlegst, aber nur 'periodendauer_int - 1' Werte dort reinschreibst (d.h. der letzte Punkt ist (0,0)).
Also Schleife ändern zu:
ausblenden C#-Quelltext
1:
2:
for (int zeit = 1; zeit < periodendauer_int; zeit++)
   // ...

Für diesen Beitrag haben gedankt: blutengel
blutengel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 02.01.11 20:37 
Danke jetzt gehts. Noch zwei andere Fragen: Gibts noch ne einfachere Möglichkeit den Sinus zu Zeichnen, oder ist dies schon der einfachste Weg? Und kann man nur Int Werte zum Zeichnen nehmen. Dadurch das ich ja die Periodendauer von Double nach Int umwandel geht mir ja was verloren, und ist dann nicht mehr so genau.

MFG

blutengel
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 02.01.11 20:52 
Du könntest auch direkt mit PointF-Strukuren arbeiten (also 'float'), denn DrawCurve hat auch eine Überladung dafür. Für die Darstellung am Bildschirm müssen natürlich die Werte wieder auf ganze Zahlen gerundet werden (da es nunmal keine halben Pixel gibt -).
blutengel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 02.01.11 21:59 
Das werd ich mal am Schluss ausprobieren. Jetzt habe ich noch das Problem das ich ja nicht nur eine Periode haben will , sonder ein Komplettes Signal bis ans Ende des Koordinatenkreuzes. Wie könnt ich das am besten machen?


MFG

blutengel
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 02.01.11 22:15 
Dann mußt du nur dein Array entsprechend der Breite deines Koordinatenkreuzes (Panel) anpassen, also
ausblenden C#-Quelltext
1:
Point[] sinus = new Point[panel.Width - 20// - 20, da du ja erst ab Position 20 zeichnest					

Entsprechend dann die for-Schleife anpassen, d.h. allgemein
ausblenden C#-Quelltext
1:
for (int zeit = 1; zeit < sinus.Length; zeit++)					

Du zeichnest ja pro X-Koordinate (20 + zeit) einen Punkt (= 1 Pixel). Nur bei einer Streckung/Stauchung in X-Richtung müßtest du die Formel noch anpassen.

P.S. Du könntest dir auch mal mein Graph-Programm (Graph.zip gepostet am 14.07.2009) unter Parser für mathematische Formeln anschauen.
Dort zeichne ich beliebige Funktionsgraphen und skaliere sie entsprechend der eingestellten Min/Max-Werte für X und Y.

Noch ein P.S. :-)
Hörst du die gleichnamige Band "Blutengel" gerne, z.B. "Blut der Ewigkeit" und "Weg zu mir"?

Vllt. kennst du dann auch das Zitat meiner Signatur (ist von einer ähnlichen Band)...

_________________
... denn die Kunst ist nur der Schein anders als der Rest zu sein.
blutengel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 09.01.11 01:22 
@ TH96:

Danke erstmal für die ganzen Tips. In deiner letzten Antwort hattest du ja geschrieben

Zitat:
Entsprechend dann die for-Schleife anpassen, d.h. allgemein
ausblenden anzeigen C#-Quelltext
ausgeblendet



Leider schaffe ich es nicht die formel anzupassen, weiss auch leider nicht wo ich anfangen soll.

Was müsste ich denn ändern?


MFG


blutengel
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 09.01.11 13:54 
Ich habe dir doch konkret geschrieben, welche zwei Zeilen du ändern mußt :roll: