Suche Algo, um den Mittelwert für einen Umlauf zu finden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Suche Algo, um den Mittelwert für einen Umlauf zu finden

    Moin,
    ich verwende einen
    System.Threading.Thread, welcher sich nur um eine Prozedur kümmert. Der Wert x_F_1 wird ständig neu beschrieben. In einer anderen, asynchronen Prozedur wird der Wert abgefragt und es wird ein Rechteck gezeichnet, proportional zur Größe des Werts. Leider flackert alles, da ich gerade nicht auf die Idee komme, die Werte für einen Umlauf zu sammeln und durch die Anzahl aller Werte zu dividieren.
    Entweder brauche ich einen Tiefpassfilter im Programm oder ich muss die Umlaufzeit
    T herausfinden. Für letzteres kann ich nicht herausfinden, wie schnell der Thread feuert. Oder doch?

    VB.NET-Quellcode

    1. Private Sub Sub_T_1()
    2. While continue_
    3. 'x_F_1 = 0.0F
    4. 'For i As Integer = 0 To 99 Step 1
    5. x_F_1 = CSng((Math.Cos(2.0 * Math.PI * 9.0 * Math.Sqrt(2.0) * (Date.Now - Me.DateNow).TotalSeconds) + 1.0) * Math.Cos(-2.0 * Math.PI * 1.0 * (Date.Now - Me.DateNow).TotalSeconds))
    6. 'Next
    7. 'x_F_1 /= 1000.0F
    8. End While
    9. End Sub


    Beispiel: Für diese Figur ist die x-Komponente des Schwerpunkts der Figur offensichtlich x = 0. Daher ist die Höhe des gezeichneten Rechtecks = 0.



    Für diese Figur ist die x-Komponente des Schwerpunkts der Figur x > 0. Daher ist die Höhe des gezeichneten Rechtecks sichtbar.


    Mit Umlaufzeit meine ich: die Figur muss 1× komplett gezeichnet werden, also 360°. Wobei sie währenddessen ihre Kurven zum Mittelpunkt und wieder nach außen macht. Und ich weiß eben nicht, wie schnell der Thread ist, um herauszufinden, wann ich aufhören muss, aufzusummieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    @Bartosz Lass das ganze doch mal ohne Thread laufen und ermittle initial die Randbedingungen für Deine Zählung.
    Soll das quasi endlos laufen?
    Dann berechne alle Daten für einen Umlauf und spiele die dann permanent ab.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Soll das quasi endlos laufen?
    Ja

    Dann berechne alle Daten für einen Umlauf und spiele die dann permanent ab.
    Ähm, ok, hätte ich dazusagen müssen. Es sind nicht immer diese Figuren / Muster. Ich weiß nie, was da kommt. Diese Figur ist nur ein Test.



    Edit: Weißt, was mir gerade auffällt? Wenn da immer "sonstwas" kommt, dann gibt es nie die Umlaufzeit. Dann muss ich zwischen 2 Dates die Zeitspanne ermitteln und die Anzahl der in dieser Spanne errechneten Werte zählen. Und dann dividieren.

    Die processing-Prozedur läuft 12-mal pro Sekunde (alle 83ms). Solange kann Sub_T_1() sammeln. Also, ich stelle mir das so vor:
    Pseudocode

    Quellcode

    1. Private Sub Sub_T_1()
    2. While continue_
    3. while (Stopwatch fragen, ob 80ms um sind. Falls nicht:
    4. x_F_1 = CSng((Math.Cos(2.0 * Math.PI * 9.0 * Math.Sqrt(2.0) * (Date.Now - Me.DateNow).TotalSeconds) + 1.0) * Math.Cos(-2.0 * Math.PI * 1.0 * (Date.Now - Me.DateNow).TotalSeconds))
    5. Sonst die innere While beenden und Mittelwert bilden.
    6. End While
    7. End While
    8. End Sub

    Does that make sense to you?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Bartosz“ ()