TFormFilter beim Drehen einiger Quadrate

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Seoman

Betreff: TFormFilter beim Drehen einiger Quadrate

BeitragDo, Mai 25, 2006 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits!
Zwar habe ich mich hier sehhhhhhr lange nicht mehr Blicken lassen, möchte mich aber auf diesem Wege endlich mal wieder einmal melden.

Vielleicht wissen einige von euch über die neueste Eingebung des lieben Hamburger Senats in Sachen Bildungswesen: Realschulabschlussarbeiten auf Gymnasialniveau. Was auch immer das bedeuten soll, in eben dieser Realschulabschlussarbeit kam in der Abteilung Mathe eine Aufgabe zum Thema grafische Effekte dran.

Es ging darum, dass ein gleichseitiges Vieleck um einen bestimmten Winkel gedreht und dann so weit verkleinert wird, dass es genau ins Ursprungsvieleck hineinpasst - und das viele Male.

Klingt evtl. etwas kompliziert, aber ich füchte, ich kann es nicht besser beschreiben.

Im Laufe dieser Aufgabe sollte man nun auch den Verkleinerungsfaktor berechnen, um den man ein Quadrat verkleinern muss, damit es ins alte Quadrat passt. Er lautet 1/(sin alpha + cos alpha).

Langer Rede kurzer Sinn:

Ich wollte das Ganze tatsächlich am Computer grafisch umsetzen, drehe die Quadrate und erhalte eine Spirale. Das einzige Problem ist allerdings, dass eine Drehung ohne TFormFilter Die Quadrate zerstückelt, die Quadrate mit TFormFilter allerdings weiter im Innern meiner Spirale immer blasser werden und außerdem nicht gut an den Kanten des Alten Quadrats anliegen sondern sie überlappen.

Zur verdeutlichung des Effekts selbst und auch der Probleme, die dabei auftreten, hier nochmal der Code:

Code: [AUSKLAPPEN]

Graphics 1024, 768

Global width# = Input("Breite: ")
Global anz# = Input("Anzahl: ")
Global winkel# = Input("Winkel: ")
Global tform = Input("Tform (0/1): ")
Global direct$ = Input("Richtung? (l/r) ")

Global drehwinkel

If direct = "l" Then
drehwinkel = -winkel
Else
drehwinkel = winkel
EndIf

Global ff# = Sin(winkel) + Cos(winkel)
Global faktor# = 1/ff#

;;;;;;;;;;;;;;

Global image = CreateImage(width, width)
Global spiral = CreateImage(width, width)
MidHandle spiral

;;;;;;;;;;;;;;

TFormFilter tform

;;;;;;;;;;;;;;

SetBuffer ImageBuffer(image)
Rect 1, 1, width-2, width-2, 0

;;;;;;;;;;;;;;

SetBuffer ImageBuffer(spiral)

For i = 1 To Anz

MaskImage image, 0, 0, 0
MidHandle image
DrawImage image, width/2, width/2

ScaleImage image, faktor, faktor
RotateImage image, drehwinkel

Next

;;;;;;;;;;;;;;

SetBuffer BackBuffer()
Cls
DrawImage spiral, GraphicsWidth()/2, GraphicsHeight()/2

Flip
WaitKey()


Er ist nicht auskommentiert, sondern nur in einzelne Sinnabschnitte gegliedert. Wenn Fragen aufkommen, dann stellt sie ruhig. Die Variablen sind Global, damit das Programm ausbaufähig bleibt (am Ende soll sich die Spirale selbst auch noch drehen, damit es noch verwirrender aussieht^^).

Wer es testen möchte, dem empfehle ich, bei "Anzahl:" nicht zuu viel einzugeben, da sonst die Berechnung sehr lange dauern würde.
Ich benutze meist 5° und 18 Stück (somit ist das letzte Quadrat wieder parallel zum ersten).


Ich hoffe, ihr könnt mir einen Tipp geben, wie diese negativen Nebenwirkungen zu vermeiden sind.

mfg
Seoman

PS:
Per Forensuche habe ich zwar viel zum Thema Drehung gefunden, aber nichts, was diesem hier entspräche. Wenn ich einen Thread übersehen haben sollte, dann wäre es nett, mir den Link zu geben Smile
In Australien...

Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig Wink
  • Zuletzt bearbeitet von Seoman am Fr, Mai 26, 2006 9:47, insgesamt einmal bearbeitet
 

BIG BUG

BeitragDo, Mai 25, 2006 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, Dich auch mal wieder hier zu sehen.

Das Problem ist, dass durch jede Drehung Bildinformation verloren geht, da das Bild ja als Bitmap und nicht als Vektor gespeichert ist.

Es gibt hier zwei Lösungen:
1. Auf Bilder verzichten und Lines verwenden(entspräche dann einem Vektorbild)
2. Das Grundbild sichern und die Dreh-/Größenberechnungen aufsummieren und nur jeweils einmal auf dieses Grundbild anwenden.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Seoman

BeitragDo, Mai 25, 2006 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Für 1. bräuchte ich dann ja alle Punkte in der Spirale, die ich leider nicht habe (es mag sein, dass es möglich ist, sie mit einer Formel zu berechnen, aber ich habe mir daran die Zähne ausgebissen^^).

2. Ist allerdings eine Idee. Danke!
In Australien...

Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig Wink

Seoman

BeitragFr, Mai 26, 2006 9:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht (und hoffentlich) nur ein Denkfehler meinerseits, aber ich habe mit meinem neuen Code einige schöne zusätzliche Quadrate und Linien in die Mitte meiner Spirale gemalt...

Aktualisierte Codeteile:
Code: [AUSKLAPPEN]

Global ff# = Sin(winkel) + Cos(winkel)
Global faktor# = 1/ff
Global Ifaktor#

...


For i = 1 To Anz

SetBuffer ImageBuffer(spiral)
MaskImage image, 0, 0, 0
MidHandle image
DrawImage image, width/2, width/2


SetBuffer ImageBuffer(image)
Rect 1, 1, width-2, width-2, 0

Ifaktor = faktor ^ i

ScaleImage image, Ifaktor, Ifaktor
RotateImage image, drehwinkel*i

If KeyDown(1) Then
Exit
EndIf

Next


Was ist mein Fehler?
In Australien...

Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig Wink

stfighter01

BeitragFr, Mai 26, 2006 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst das image wieder rekonstruieren bevor du erneut rotation und skalierungsfaktor berechnest.
edit
damit meine ich, du musst natürlich auch ein createimage machen, da das bild sonst verkleinert wird.
/edit


/edit
zeichne es trotzdem mit linien.

für ein quadrat kannst du die eckpunkte leicht bestimmen.

y1 = sin(winkel +45°) * groesse * faktor
x1 = cos(winkel+45°) *groesse * faktor

y2 = sin(winkel +135°) * groesse * faktor
x2 = cos(winkel+135°) * groesse * faktor

y3 = sin(winkel +225°) * groesse * faktor
x3 = cos(winkel+225°) * groesse * faktor

y4 = sin(winkel +315°) * groesse * faktor
x4 = cos(winkel+315°) * groesse * faktor

die verbindest du einfach mit linexy

winkel und faktor berechnest du wie in deinem 2ten beispiel
/edit
Denken hilft!

Seoman

BeitragFr, Mai 26, 2006 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau diese Berechnungsmöglichkeit habe ich gesucht! Ich schaffe es auch, sie praktisch anzuwenden. Aber wriklich verstehen tu ich das, was du da machst leider nicht...

Ich weiß momentan leider nicht, wie ich jetzt die Drehrichtung wieder mit einbringen kann, was wohl am fehlenden Verständnis liegt. Könntest du evtl. den mathematischen Hintergrund erläutern? Dann kann ich damit nämlich noch ein wenig mehr anfangen Smile

Trotzdem schon mal vielen Dank,
Seoman
In Australien...

Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group