Moin.
Ich habe hier mehrere Datumsangaben. Ich muss sie euch leider anonymisiert zeigen. Diese Datumsangaben stellen Beginn und Ende eines Prozesses dar. Hieraus werden Zeitspannen (TimeSpan) gemacht. Diese TimeSpans werden untereinander und entlang der chronologischen Reihenfolge in einer PictureBox gezeichnet. Trotz Verwendung von
Meine PictureBox füllt die ganze Formbreite aus. Das heißt, PictureBox1 beginnt auf der Form bei {0,0} und hat die Breite von 1902 und eine Höhe von 400 Pixeln.
Der Zeitstrahl beginnt am linken Bildrand mit dem Datum [denkt euch bitte ein Datum, das noch vor dem allerersten Prozess ist] und endet am rechten Bildrand mit dem Datum 22.03.2021. Die PictureBox-Breite ist somit der gesamte betrachtete Zeitraum, und somit 1902 Pixel und 100%.
Die Rechnung:
Meine Klasse Zeichnung
in Form_Main
Die Bilder im Anhang stammen nicht aus dem ↑ Beispielcode.
Ich habe hier mehrere Datumsangaben. Ich muss sie euch leider anonymisiert zeigen. Diese Datumsangaben stellen Beginn und Ende eines Prozesses dar. Hieraus werden Zeitspannen (TimeSpan) gemacht. Diese TimeSpans werden untereinander und entlang der chronologischen Reihenfolge in einer PictureBox gezeichnet. Trotz Verwendung von
Math.Round()
(statt nur mittels CInt()
abzuschneiden) ergeben sich Pixelfehler von ±1 Pixel, so dass es so aussehen könnte, als wenn 2 Prozesse gerade so eben zeitgleich laufen – obwohl der nächste Prozess definitiv später angefangen hat als der vorherige! Was macht ihr bei so etwas? Ich habe mir in die Dokumentation geschrieben: „Da das Programm die Zeitspannen auf die Bildbreite (in Pixeln) verteilen muss, kann ein Rundungsfehler von ± 1 Pixel auftreten.“Meine PictureBox füllt die ganze Formbreite aus. Das heißt, PictureBox1 beginnt auf der Form bei {0,0} und hat die Breite von 1902 und eine Höhe von 400 Pixeln.
Der Zeitstrahl beginnt am linken Bildrand mit dem Datum [denkt euch bitte ein Datum, das noch vor dem allerersten Prozess ist] und endet am rechten Bildrand mit dem Datum 22.03.2021. Die PictureBox-Breite ist somit der gesamte betrachtete Zeitraum, und somit 1902 Pixel und 100%.
Die Rechnung:
- mehrere Datumsangaben für Beginn und Ende
- aus denen wird jeweils eine TimeSpan
- es wird berechnet, wie viel Prozent der gesamten Spanne diese kleine Spanne groß ist
- Es wird auch berechnet, ab welchem Pixel das Rechteck zu sehen ist.
Meine Klasse Zeichnung
VB.NET-Quellcode
- Public Class Zeichnung
- Private ReadOnly Start_dieser_Zeichnung As Date = #08/01/2010# '01.08.2010 'Beispiel :-)
- Private Start_Prozess_I As Date = #01/01/2021#
- Private Ende_Prozess_I As Date = #02/28/2021#
- Private Ende_dieser_Zeichnung As Date 'heute
- Public Liste_mit_prozentualen_Zeitspannen As New List(Of Double)
- Public Liste_mit_Farben As New List(Of Color) From {
- Color.FromArgb(255, 166, 0), 'Orange
- Color.FromArgb(255, 255, 0), 'Gelb
- Color.FromArgb(98, 255, 0), 'Hellgrün
- Color.FromArgb(0, 194, 0), 'Mittelgrün
- Color.FromArgb(0, 255, 221), 'Cyan
- Color.FromArgb(0, 215, 255), 'Hellblau
- Color.FromArgb(0, 140, 255), 'Normalblau
- Color.FromArgb(144, 0, 255), 'Lila
- Color.FromArgb(255, 0, 191), 'Rosa
- Color.FromArgb(255, 0, 81), 'Magenta
- Color.FromArgb(178, 184, 123), 'Gelb-Grau
- Color.FromArgb(255, 255, 255), _ 'Weiß
- Color.Firebrick
- }
- Public Liste_mit_Startpunkten As New List(Of Integer)
- Public Sub Berechne_Zeitspannen_und_Relationen()
- Liste_mit_prozentualen_Zeitspannen.Clear()
- Ende_dieser_Zeichnung = Date.Now
- Dim Spanne_dieser_Zeichnung As TimeSpan = Ende_dieser_Zeichnung - Start_dieser_Zeichnung
- Dim Spanne_ProzessI As TimeSpan = Ende_Prozess_I - Start_Prozess_I
- Dim Prozent_ProzessI As Double = Spanne_ProzessI.TotalDays * 100.0 / Spanne_dieser_Zeichnung.TotalDays
- Liste_mit_prozentualen_Zeitspannen.Add(Prozent_ProzessI)
- '====================================
- Dim t As TimeSpan
- Dim t1 As Integer
- t = Start_Prozess_I - Start_dieser_Zeichnung
- t1 = CInt(Math.Round(t.TotalDays * Form_Main.PictureBox1.Width / Spanne_dieser_Zeichnung.TotalDays, 0))
- Liste_mit_Startpunkten.Add(t1)
- End Sub
- End Class
in Form_Main
VB.NET-Quellcode
- Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
- If e.Graphics IsNot Nothing AndAlso Z1.Liste_mit_prozentualen_Zeitspannen IsNot Nothing AndAlso Z1.Liste_mit_prozentualen_Zeitspannen.Count > 0 Then
- e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
- e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
- e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
- e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
- Using IMG As New Bitmap(PictureBox1.Width, PictureBox1.Height)
- Using G As Graphics = Graphics.FromImage(IMG)
- G.FillRectangle(Brushes.Black, New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height))
- Dim recta As Rectangle
- For Each member As Double In Z1.Liste_mit_prozentualen_Zeitspannen
- recta = New Rectangle(Z1.Liste_mit_Startpunkten(i),
- y_aktuell_Start,
- CInt(Math.Round(Z1.Liste_mit_prozentualen_Zeitspannen(i) * PictureBox1.Width / 100.0, 0)),
- Hoehe_des_Rechtecks)
- Using myBrush As SolidBrush = New SolidBrush(Z1.Liste_mit_Farben(i))
- e.Graphics.FillRectangle(myBrush, recta)
- G.FillRectangle(myBrush, recta)
- End Using
- y_aktuell_Start += 33
- i += 1
- Next
- IMG.Save("meinPfad\1.png", Imaging.ImageFormat.Png)
- End Using
- End Using
- End If
- End Sub
Die Bilder im Anhang stammen nicht aus dem ↑ Beispielcode.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()