Kleiner Fehler bei Imageanimation
Übersicht BlitzBasic Allgemein
FlushBetreff: Kleiner Fehler bei Imageanimation |
Sa, Jan 14, 2017 16:15 Antworten mit Zitat |
|
---|---|---|
Hallo Leute,
ich habe eine Kreisillusion mit der Sinusfunktion erstellt. Funktioniert wie es soll . 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 aber gerade deshalb finde ich sie auch ums ver*#$%*en nicht. ! 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: 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!!!!) Vielen Dank für Eure Mühe und Hilfe, Flush |
||
HolzchopfMeisterpacker |
Sa, Jan 14, 2017 17:40 Antworten mit Zitat |
|
---|---|---|
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) MfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Flush |
Sa, Jan 14, 2017 17:55 Antworten mit Zitat |
|
---|---|---|
@Holzchopf
Funktioniert super, vielen Dank. Muss das ganze jetzt noch verdauen Vielen Dank, Flush |
||
Flush |
Sa, Jan 14, 2017 18:01 Antworten mit Zitat |
|
---|---|---|
@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 . Grüße, Flush |
||
Flush |
Sa, Jan 14, 2017 18:03 Antworten mit Zitat |
|
---|---|---|
Ich nehm's zürück.
Mit Mod 209 funktioniert es auch nicht, heut is nich mein Tach @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
XeresModerator |
Sa, Jan 14, 2017 18:06 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
HolzchopfMeisterpacker |
Sa, Jan 14, 2017 21:35 Antworten mit Zitat |
|
---|---|---|
Ich nehme mal an, du hast irgendetwas verändert, bevor es aufgehört hat zu funktionieren
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 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Flush |
So, Jan 15, 2017 19:58 Antworten mit Zitat |
|
---|---|---|
@Holzchopf
Du hast vollkommen Recht . Ich hab drüber nachgedacht und habs verstanden ! Wie ich gestern schon geschrieben hab wars einfach nicht mein Tag . Danke für Deine Mühe und Hilfe, Flush |
||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group