TFormFilter beim Drehen einiger Quadrate
Übersicht

![]() |
SeomanBetreff: TFormFilter beim Drehen einiger Quadrate |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
In Australien...
Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig ![]() |
- Zuletzt bearbeitet von Seoman am Fr, Mai 26, 2006 9:47, insgesamt einmal bearbeitet
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
![]() |
Seoman |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Trotzdem schon mal vielen Dank, Seoman |
||
In Australien...
Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig ![]() |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group