Kleiner Fehler bei Imageanimation

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Flush

Betreff: Kleiner Fehler bei Imageanimation

BeitragSa, Jan 14, 2017 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich habe eine Kreisillusion mit der Sinusfunktion erstellt. Funktioniert wie es soll Cool . Leider wird das Bild bem "rollen" nicht vollständig gezeichnet. Der obere Teil des Bildes (Köpfe des roten und des violetten Eddies) wird etwas abgeschnitten.
Die Lösung ist wahrscheinlich erschreckend einfach Rolling Eyes aber gerade deshalb finde ich sie auch ums ver*#$%*en nicht. Sad !
Könnt Ihr Euch vorstellen was da schief läuft.
Ich habe den Code soweit nützlich/ nötig kommentiert!

Hier ein Bild von dem Fehler während der Animation:

user posted image

Code: [AUSKLAPPEN]

Graphics 800, 600, 24, 2
SetBuffer BackBuffer ()

;------------------------------------------------------------------------------------------------------------------------------------------------------------

Global y_Part[210]
Global arrSin%[360]

xPos = 10
yPos = 310
;------------------------------------------------------------------------------------------------------------------------------------------------------------

font1 = LoadFont ("Arial", 16,1,0,1)
font2 = LoadFont ("Arial", 14,1,0,1)

eddieCollage = LoadImage ("Eddie Collage_02.bmp")
Local bildBreite = ImageWidth (eddieCollage)
Local bildHoehe = ImageHeight (eddieCollage)
;------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                      ;SINUS ARRAY ERSTELLEN
calcSine()

;------------------------------------------------------------------------------------------------------------------------------------------------------------
                                 ; ARRAY MIT BMPS DES ORIGINALBILDES ERSTELLEN

y_splitImage(eddieCollage, bildHoehe,186 )

Local y_eddie[210]; Arrays wechseln
For j = 0 To 209
   y_eddie[j] = CreateImage(186,1)
   y_eddie[j] = y_Part[j]
Next

;------------------------------------------------------------------------------------------------------------------------------------------------------------
;                                          >>>   MAIN----ANIMATION----LOOP <<<
;------------------------------------------------------------------------------------------------------------------------------------------------------------

While Not KeyHit(1)
   Cls
                                                ;ORIGINALBILD ZEICHNEN
      SetFont (font1)
      Text 10, 50, "Original Image:", False, False
      drawOrigImage(eddieCollage)
      
;------------------------------------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                   ;ANIMATION TEST
      SetFont (font1)            ;FEHLER: KÖPFE DER OBEREN EDDIES WERDEN ICHT KOMPLETT    ANGEZEIGT         
      Text 300, 50, "Animation : TEST - KREIS", False, False
      k = k + 1
      
      drawAnimation(k , y_eddie, arrSin, bildHoehe)
         
      SetFont (font2)
      xPos = 10
      For m = 0 To 360 Step 10
         Text  xPos, yPos, arrSin[m], False, False
         xPos = xPos + 24
      Next
      
      Flip
Wend

;------------------------------------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------------------------

WaitKey()
End()
;------------------------------------------------------------------------------------------------------------------------------------------------------------

Function drawAnimation(k, Image[210], arrSin[360], imgHoehe)

For i = 0 To imgHoehe
   DrawImage Image[(i)Mod 210], 290, (180) + arrSin[(i + k)Mod 180];i
Next

End Function



Function calcSine()

   k = 0
   
   For j = 0 To 180
      sinus = Sin(j)*50
      If k > 90
         sinus = sinus * (-1)
      End If
      arrSin[k] = sinus

      k = k + 1
   Next
   
Return arrSin[180]

End Function



Function y_splitImage(img, imgHoehe, imgBreite)

   For j = 0 To imgHoehe
      y_Part[j] = CreateImage(imgBreite, 1)
      SetBuffer ImageBuffer (y_Part[j])
      DrawImageRect img, 0, 0,1, j, imgBreite, 1
   Next
   SetBuffer BackBuffer()
Return y_Part[j]

End Function

Function drawOrigImage(eddieCollage)
   
   DrawImage eddieCollage, 10, 80
   
End Function


Hier das TestBild (im Bmp umwandeln!!!!)

user posted image


Vielen Dank für Eure Mühe und Hilfe,
Flush

Holzchopf

Meisterpacker

BeitragSa, Jan 14, 2017 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Flush

Dein Problem liegt darin, dass die Bildhöhe nicht dem entspricht, was die Funktion erwartet. Sie erwartet ein Bild mit 180px Höhe, du schickst aber 209 Pixel - damit übermalst du einfach einen Teil wieder.

Wenn du flexibler sein willst, was Bildhöhe und Ausgabehöhe und Anzahl (wie oft das Bild "abgewickelt" werden soll) angeht, kommst du mit dieser Funktion ans Ziel:

BlitzBasic: [AUSKLAPPEN]
Function drawAnimation(k, Image[210], arrSin[360], imgHoehe) 

Local AusgabeRadius = 50 ; Radius des darzustellenden Zylinders
Local AnzahlBilderAmUmfang = 2 ; Wie oft das Bild am Umfang verteilt ist
Local dy%, alpha# ; y-Position der Projektion und dazugehöriger Winkel (0-180°)
Local imagey% ; entsprechende y-Position im Bild

; Die Schleife geht den auszugebenden Bereich durch, damit wird verhindert,
; dass Zeilen doppelt gezeichnet werden
For dy = -AusgabeRadius To AusgabeRadius
; Winkel der "gescannten" Zeile bestimmen
; Die Formel folgt aus der Auflösung von
; dy = cos( alpha ) * AusgabeRadius
; nach alpha
; Dann wird noch die "drehkonstante" k dazuaddiert
alpha = ACos( dy / Float(AusgabeRadius) ) +k
; y-Position im Bild berechnen
; alpha wird geteilt, durch
; 360 geteilt durch AnzahlBilderAmUmfang, damit das Bild wiederholt wird
imagey = alpha /(360.0 / AnzahlBilderAmUmfang) *imgHoehe
; Modulo imgHoehe, weil bei Bildwiederholung imagey grösser sein kann als imgHoehe
imagey = imagey Mod imgHoehe
; imgHoehe-1, weil das Array von 0...imgHoehe befüllt ist
; -imagey, damit das Bild richtig rum gezeichnet wird
DrawImage Image[imgHoehe-1 -imagey], 290, 180 +dy
Next

End Function


MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Flush

BeitragSa, Jan 14, 2017 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf

Funktioniert super, vielen Dank. Very Happy
Muss das ganze jetzt noch verdauen Wink

Vielen Dank,
Flush

Flush

BeitragSa, Jan 14, 2017 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf P.S:
Ich schicke 209 PX Höhe, klar. In der Funktion mache ich einen Mod180 um nur die ersten 180 Grad des Sinus zu nutzen. Wenn ich einen Mod209 loslasse funktioniert das leider auch nicht Embarassed .

Grüße,
Flush

Flush

BeitragSa, Jan 14, 2017 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed Embarassed Ich nehm's zürück.
Mit Mod 209 funktioniert es auch nicht, heut is nich mein Tach Exclamation

@Xeres
Ja werd ich machen

@Holzchopf
Du hast ne PN

ich glaube es liegt daran dass ich versuche 209 Werte auf 180 Grad zu verteilen!
Irgendwie muss das aber doch klappen?


Danke für Eure Mühe,
Flush
  • Zuletzt bearbeitet von Flush am Sa, Jan 14, 2017 18:41, insgesamt 3-mal bearbeitet

Xeres

Moderator

BeitragSa, Jan 14, 2017 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Flush, bitte editiere deine Beiträge nach anstatt mehrfach hintereinander zu posten - danke.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

BeitragSa, Jan 14, 2017 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme mal an, du hast irgendetwas verändert, bevor es aufgehört hat zu funktionieren Wink Rolling Eyes

Den einzigen Fehler, den ich an meinem Code gerade so entdecke, ist hier
BlitzBasic: [AUSKLAPPEN]
; imgHoehe-1, weil das Array von 0...imgHoehe befüllt ist

sollte
BlitzBasic: [AUSKLAPPEN]
; imgHoehe-1, weil das Array von 0...imgHoehe-1 befüllt ist

sein.

Wenn du einfach starr die 209 Zeilen deines Bildes auf 180° verteilen willst, musst du:
1. Winkel = Bild-y-Position geteilt durch Bildhöhe, also 209 (dann kriegst du Werte im Bereich [0, 1])
2. Winkel = Winkel * 180 (gibt dann Werte im Bereich [0, 180])

Intermezzo
Jetzt hast du 209 Werte gleichmässig auf das Intervall [0, 180] verteilt. Logischerweise bedeutet das, dass der Abstand zwischen den Werten nicht ganzzahlig ist. Wenn du also damit den Sinus-Wert aus einem Array liest, werden zwangsweise ein paar Zeilen das selbe Ergebnis haben, also die selbe y-Position. Das wird zu seltsamen Lücken und Effekten führen, wenn du deinen Zylinder grösser als mit 50px Radius zeichnen willst.
Überhaupt wird diese Methode zu Lücken führen, wenn der Zylinder > 50px im Radius ist.

3. Die Ausgabe-y-Position anhand Sin(Winkel) * Radius berechnen

Wie oben eingeschoben, hat diese Methode einen grossen Nachteil:
Du zeichnest immer 209 Zeilen deines Bildes, unabhängig davon, ob vom Bildschirm 50, 100 oder 500 Zeilen zum Zylinder gehören. Das ist entweder ineffizient oder wird zu Darstellungsfehlern führen.


Flush hat Folgendes geschrieben:
ich glaube es liegt daran dass ich versuche 209 Werte auf 180 Grad zu verteilen!

Richtig. Du solltest versuchen, 180 Grad auf 209 Werte zu verteilen. Wie das geht, steht in meinem Code Wink

MfG
Holzchopf

PS: Dafür hättest du mir nicht unbedingt 'ne PN schicken müssen.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Flush

BeitragSo, Jan 15, 2017 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Du hast vollkommen Recht Cool .
Ich hab drüber nachgedacht und habs verstanden Idea !
Wie ich gestern schon geschrieben hab wars einfach nicht mein Tag Embarassed .


Danke für Deine Mühe und Hilfe,
Flush

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group