WinFuture-Forum.de: Kreativ Lösung gesucht. (VB.Net 2010) - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Kreativ Lösung gesucht. (VB.Net 2010) gdi+ Loop mit zwei Ellipsen


#1 Mitglied ist offline   ledlightjungled 

  • Gruppe: aktive Mitglieder
  • Beiträge: 32
  • Beigetreten: 22. Januar 14
  • Reputation: 0

geschrieben 13. September 2018 - 18:34

Guten Abend.

Ich schrieb einen durchgehenden Loop mit VB.Net 2010. Es ist eine Forms Anwendung. Die Graphics Oberfläche zeigt einen Kreis der sich von links nach rechts bewegt. Auf der rechten Seite verlässt der Kreis den Rand um im selben Augenblich auf der linken Seite zu erscheinen.

Das was sichtbar sein kann erreichte ich in den Codezeilen mit zwei Ellipsen. Ich frage mich ist in der Welt der Programmierungen eine ProgrammiererInn oder ein Programmierer (können auch mehrere sein), die das Ergebnis mit nur einer Ellipse erreichen können.

Der folgende Code kann kopiert und eingefügt werden in einem Form Projekt des Programms VB.Net 2010 oder höher, ohne zusätzliche controls verwenden zu müssen.

Public Class Form1
Dim WithEvents t As New Timer() With {.Interval = 50}
Dim UFO As Integer
Dim reachTheotherSide As Integer
Dim counter As Integer

Private Sub t_Tick(sender As Object, e As EventArgs) Handles t.Tick
    reachTheotherSide += 1
    counter += 1

    If reachTheotherSide >= 198 Then
        UFO += 1
    End If

    If reachTheotherSide >= 250 And UFO = 45 Then
        reachTheotherSide = 45
    End If

    If UFO = 45 Then
        UFO = -87
    End If

    If counter = 285 Then
        Threading.Thread.Sleep(1000)
        counter = 0
    End If

    Me.Invalidate()
End Sub

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    DoubleBuffered = True
    CenterToScreen()
    t.Start()
    UFO = -87
    reachTheotherSide = 45
End Sub

Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    e.Graphics.DrawEllipse(New Pen(Color.Black, 0), UFO, 87, 86, 86)
    e.Graphics.DrawEllipse(New Pen(Color.Black, 0), reachTheotherSide, 87, 86, 86)
End Sub
End Class


Mit freundlichen Grüßen

Stefan
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.359
  • Beigetreten: 20. Juli 07
  • Reputation: 976

geschrieben 14. September 2018 - 07:00

Unter der Annahme, daß ich das Problem richtig verstanden hab:

- Nein, Du wirst zwei Ellipsen benötigen. Einfach deswegen, weil Du die Ellipse als (atomares) Objekt auf den Bildschirm zeichnest; keine halbe und keine Drittelellipse, sondern immer eine ganze, auch dann, wenn sie vom Rand "überdeckt" (=> abgeschnitten) wird.

- Je nachdem, was genau Dein Anspruch ist, kannst Du ein eigenes Ellipsenobjekt entwerfen und die beiden "Windows-Ellipsen" da drin kapseln, sodaß man sie nicht sieht. Dann kann die ganze Rechenlogik da rein und Du kannst ein eigenes Interface definieren, zB als <myEllipse>.move(vector) und dann würden die erforderlichen Berechnungen im Hintergrund so angestellt werden, daß wenn die Ellipse auf dem definierten Vektor an den Fensterrand anstößt, der Weg nahtlos gemäß dem Ursprungsvektor fortgesetzt wird (so als wäre das eine endlose Ebene).


- Wenn es Dir aber nur darum geht, statt zwei Ellipsen nur eine instantiieren zu müssen, um mit weniger Code auskommen zu können: eher nicht.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   ledlightjungled 

  • Gruppe: aktive Mitglieder
  • Beiträge: 32
  • Beigetreten: 22. Januar 14
  • Reputation: 0

geschrieben 14. September 2018 - 12:34

Ja, es währe einfach mit weniger Code. ("RalphS" Du hast das Thema richtig verstehen können) Und ich könnte versuchen die Geschwindigkeit stätig zu ändern weil ich mich nur auf ein Objekt konzentrieren könnte. (langsam, schnell, schneller und wieder schnell, langsam).

Den zweiten (respektive ersten) Teil ein eigenes Ellipsenobjekt zu entwerfen ist mit meinen Künsten noch nicht in Reichweite.
<myEllipse>.move(vector) ist mit meiner Vorstellungskraft eine sehr interessante Variante, doch mit meinen VB.Net Fähigkeiten unvorstellbar. Wenn möglich schaff ich einen Fortschritt in zwei Jahren (Forenzauber exklusive).

Trotzdem mit freundlichen Grüßen

. . .und p.s.: das Thema wartet auf eine Heldin oder einen Helden (mehrere geht auch)
0

#4 Mitglied ist offline   nobido 

  • Gruppe: aktive Mitglieder
  • Beiträge: 203
  • Beigetreten: 20. April 07
  • Reputation: 9

geschrieben 28. September 2018 - 22:15

Taechle...

interessanter Code - erinnert mich ein wenig an meine Zeit, als ich "anfing" Spiele unter VB zu "programmieren". Damals noch unter VB 1.0, spaeter unter VS6 Prof - letztes Jahrtausend. OldSchool sozusagen.

Um beim Thema zu bleiben und Deine Frage kurz zu beantworten: Nein! (Ich lass mich aber vom geneigten Leser gern eines besseren belehren.)


Um beim Thema zu bleiben und Deine Frage etwas laenger zu beantworten: Jein.

Ich empfehle Dir als erstes Dich evtl. in the Methode DrawArc() einzulesen. Diese ermoeglicht es Kurven unter Angabe eines Mittelpunkt, eines Winkel, eines Winkel-Startpunkt und einem Radius zu zeichnen - bis hin zu einem Kreis.

Erzeuge Dir von den verwendeten Objekten eigene Klassen und vererbe die entsprechende Oberklasse (egal ob Du nun eine Ellipse oder, wie von mir vorgeschlagen, eine Kurve) an diese.
In das Thema Vererbung von Klassen kann man sich, soweit es die von Dir beschriebene Problemstellung betrifft, relativ schnell weit genug reinlesen umd diese zu loesen.
Sorge dafuer dass Dein(e) Objekt(e) ihren Zustand (ihre Position auf dem Formular kennen) und verwende die entsprechenden Werte der jeweiligen Objekte in der Paint-Methode.

An dieser Stelle beende ich mal die etwas laengere Version meiner Antwort. Um hier jetzt naemlich noch wirklich hilfreich zu sein muesste ich mich wieder in VB einlesen... wie gesagt, lange ist es daher.


Ein (nicht ganz) kleiner Tip zum Ende hin:

Ich wuerde deine Abfragen bzgl. der Position der Ellipsen im Formular nicht statisch halten, sondern von den entsprechenden Werten der Formular-Groesse - denn wenn das Formular groesser wird, dann kann der Kreis je de facto weiter nach rechts wandern (zu beobachten, wenn Du das Formular waehrend der Programmausfuehrung mal maximierst).

Weiterhin ist die Position von UFO scheinbar abhaenging von der Position von reachTheotherSide.
Warum startest Du UFO also nicht einfach weit genug im negativen Bereich des Formular (analog UFO = -87), laesst beide Objekte gleichzeitig wandern sprich: erhoehst UFO +=1 und reachTheotherSide +=1 und laesst dann beide Objekte zeichnen... ?

Ich stell einfach mal in den Raum dass dies Dir locker zwei IF-Abfragen spart (in dem vielen Code <lach>).


Da ich nicht weiss, wie weit Du in der Materie steckst... verzeih mir halt, wenn es etwas kompliziert geschrieben sein sollte oder ich Dich mit meinen Ausfuehrungen ueberfordere.


... das soll es dann aber auch gewesen sein.
Vllt. hilft es ja.

greetz

n.


*edit:

eigentlich reicht es ja reachTheotherSide per +=1 zu bewegen. Weil, UFO sollte doch immer x = (x von reachTheotherSide) - irgendwas sein, oder irre ich? Also, wenn UFO weit genug im negativen Bereich des Formular startet. Und wenn der Durchlauf nach counter = irgendwas durch ist, dann einfach die X-Werte wieder auf die Startwerte setzen.
Das Ganze noch in einen eigenen Thread auslagern...

...ach, was schreib ich. 's ist halt schon spaet.

Dieser Beitrag wurde von nobido bearbeitet: 28. September 2018 - 22:55

0

#5 Mitglied ist offline   ledlightjungled 

  • Gruppe: aktive Mitglieder
  • Beiträge: 32
  • Beigetreten: 22. Januar 14
  • Reputation: 0

geschrieben 29. September 2018 - 17:55

Da ich kein Geld verdienen kann mit Arbeiten die Microsoft Produkte als Inhalt haben, kann ich mich nicht nur auf die VB.Net Oberfläche konzentrieren. Dies schrieb ich weil es eine nicht näher bestimmte Zeit dauern wird das Material das ich als Antwort erhielt zu verarbeiten. Ich strebe in meinen Ausführungen zu einer Art Höfflichkeit in meiner Forum Antwort. Danke das ich Hinweise erhielt.

Nachdem ich nicht nur einen fertigen Code erhielt, was natürlich nicht sein muss, werde ich eine weitere Durststrecke zum abarbeiten basteln. Es wird dauern bis ich einen fertigen Code präsentieren kann. (frohes neues Jahr Haha)

Mit freundlichen Grüßen
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0