Rechtecke drehen



  • hmm sollte in Klasse 10 eines Gymnasiums(oder 11) besprochen werden 😉



  • matrix ?? affine transformation??



  • Kann mir jetz jemand helfen, zu evils info ich bin 12. klasse TG und bin in IT wir hatten es noch NICHT.
    also kann mire einer den befehl oder so geben? im normalen c++

    Mfg Christi



  • In "normalen" C++ gibt es keine Grafikunterstützung.

    Wenn ich das recht verstanden habe passt das am ehesten zum Builder(Borland) oder in die Spileprogramierung

    /EDIT/
    Wenn du's mit VCL machen willst C++Builder, für openGL/DirectX in die Spieleprogramierung



  • Also ich hab den C++Builder.
    Nun hat jemand einen Vorschlag wie ich es ganz einfach machen kann?



  • wei sieht den den das quatrat aus?? 4 linen? oder Solide (gefüllt)??

    normalerweise müsste du das quatatz als Matrix aus pixel sehen, welch du mit affine transforamtionen (rotationsmatrix) drehen kannst...



  • also ich hab es mir so gedacht:
    ich nehme ein rechteck und die koordinaten davon (wie das geht weiß ich auch nicht), wenn ich dann beispielsweise auf einen button klick dreht sich das rechteck um 10 grad.
    wie das nun gehen sol weiß ich au net.
    mfg



  • Aus meiner Delphi-Zeit (Da hatte ich diese TShapes) fällt mir dazu ein: Eckpunkte neu berechnen -> neu Zeichnen.

    Dürfte mit etwas Trigonometrie kein allzugroßes Problem sein.

    Kann TShapes matrizen? wäre mir neu

    /EDIT/
    Alternativ natürlich über Matrizen uä dann brauchst du aber warscheinlich openGL oä



  • Ich weiss zwar nich wie das nun in C++ läuft aber in meiner Delphi zeit hab ich das mit nem Canvas gezeichnet und per Pytagoras die Strecke berechnet. Dann ne while-Schleife zählen lassen, wodrin ich die Pixel immer entsprechend der Linie geändert habe.



  • Pille456 schrieb:

    Ich weiss zwar nich wie das nun in C++ läuft aber in meiner Delphi zeit hab ich das mit nem Canvas gezeichnet und per Pytagoras die Strecke berechnet. Dann ne while-Schleife zählen lassen, wodrin ich die Pixel immer entsprechend der Linie geändert habe.

    Noch jemand mit Delphi-Vergangenheit 🙂

    Sollte auf diese Weise gehen, ich weiß nur gerade nicht mehr so genau was der unterschied zwischen Canvas und Shape war. (Canvas ist vll das Element der GUI-Elemente, auf des Gezeichnet werden kann und Shape explizit um irgendwelche Bilder zu zeichnen?)



  • nimmst die eckpkte deines rechteckts:

    ( breite/2  |  höhe/2 )
    (-breite/2  |  höhe/2 )
    ( breite/2  | -höhe/2 )
    (-breite/2  | -höhe/2 )
    

    multiplizierst die mit der rotationsmatrix, und addierst noch n positionsvektor druf:

    /  cos a   sin a \
    (x'|y')=(x | y) * |                  |  + (xAutoPos | yAutoPos)
                       \ -sin a   cos a /
    

    dann kriegste die transformierten eckpunkte. Verbinde die einfach mit linien, für die anwendung wirds wohl ausreichen...

    [mein beileid: das macht man tatsächlich erst in der 13. (echt ZUM KOTZEN) aber was solls, dafür gibts in der schule ja so geile fächer wie ethik und geschichte 😡 ] (jez nix gegen Christi, reg mich nur über das #Ä@e schulsystem auf 😞 )

    Wenn du's nicht um den mittelpunkt drehen willst, dann guck doch einfach in deinem mathebuch (analytische geometrie/lineare algebra, sowas in die richtung...) unter "affinen abbildungen" nach, da wirds bestimmt n paar beispiele gebn 👍

    edit:
    *bin selber gerade mit der schule fertiggeworden, hab jetzt das recht mich aufzuregen, kann eh keiner mehr was machn 😃

    edit2:

    Alternativ natürlich über Matrizen uä dann brauchst du aber warscheinlich openGL oä

    openGL? n bissl overkill für so ne aufgabe, für matrizen braucht man multiplikationen und additionen und <math.h> für sin cos...
    Der spruch mit "10 types of people" ist geil 👍



  • zu deiner beruhigung sei gesagt: ich hab in der schule nicht gelernt was eine matrix ist...

    außerdem denke ich, dass eine matrix die um einen bestimmten winkel rotiert hier nicht viel bringen wird. es soll sich ja entlang eines funktionsgraphen bewegen.
    wie genau soll das dann aussehen? soll das rechteck tangential zum graphen sein!?



  • soll das rechteck tangential zum graphen sein!?

    das hab ich angenommen, wo würde denn sonst das problem liegen?
    Falls es jetzt nicht ausreicht, dass das rechteck den graphen in einem punkt berührt, und stattdessen das "rollen auf zwei rädern" (bzw zwei ecken) simuliert werden muss, wird die ganze sache schon um einiges komplizierter, dann muss man jedes mal den graphen mit einem kreis schneiden lassen, um zunächst mal zu schauen, wo das zweite rad überhaupt sein soll, und erst dann berechnen, wie stark das fahrzeug zu neigen ist. Um die drehung kommt man aber in beiden fällen nicht herum.



  • das hab ich angenommen, wo würde denn sonst das problem liegen?

    ich auch, wie genau das dann aussehen soll wurde noch nicht so wirklich beschrieben...

    aber genau dann ist die drehung um einen winkel nur ein umweg.

    wenn ich die schnittpunkte mit dem graphen hab, oder eben den berührpunkt und die tangente (1.ableitung), dann hab ich sofort mal eine seite des rechteckes.
    so, jetzt brauch ich mir nur den "normalvektor" davon bestimmen (steigungsdreick umdrehen) und kann alle punkte die ich brauch berechnen. jetzt noch die punkte verbinden und fertig. ganz ohne den lahmen sin und cos und arctan...



  • mkay, zugegebn, hab mich n bissl falsch ausgedrückt (<math.h> braucht man in der tat nicht für sin cos, sondern nur für sqrtf)... 🙄

    die berechnung von dem eigentlichen winkel wäre wirklich extrem umständlich und rechenintensiv (arctan, danach cos sin usw.)
    Diese berechnung ist zum glück gar nich notwendig, denn die cosinus und sinuswerte, die man in die matrix einsetzen muss, lassen sich wunderbar direkt aus der steigung bestimmen (hier ausnahmsweise deutsche begriffe, für bessere verständnis):

    float hypothenuseDesSteigungsdreiecks=sqrtf(steigung*steigung+1.0f)
    //Kosinus=ankathete durch hypothenuse
    float cosAlpha=1.0f/hypothenuseDesSteigungsdreiecks; 
    //Sinus=gegenkathete durch hypothenuse
    float sinAlpha=steigung/hypothenuseDesSteigungsdreiecks;
    

    einmal wurzelziehen müsstest du sowieso, dot, um die länge deines normalvektors zu normieren.



  • einmal wurzelziehen müsstest du sowieso, dot, um die länge deines normalvektors zu normieren.

    wenn ich mir vorher das verhältnis von höhe und breite des rechteckes ausrechne, muss ich das nicht 😃



  • verstehe ich nicht... :p du weisst, dass dein rechteck sagen wir ma einen seitenverhältnis von 3zu4 hat.
    Dein steigungsvektor (1.0 | steigung) , und somit auch dein normalenvektor (-steigung | 1.0) haben die länge sqrtf(steigung*steigung+1.0f). Ohne zu normieren kannst du daraus natürlich ein recheckt basteln, das dieselben seitenverhältnisse hat, indem du den einen vektor mit 4 und den anderen mit 3 multiplizierst. aber die seiten werden doch je nach steigung unterschiedlich lang sein, und das ist nich erwünscht.



  • ich bezog mich drauf, dass eine seite des rechteckes bekannt ist (also 2 endpunkte gegeben sind -> variante mit den rädern)...

    aber wie gesagt, ohne nähere info wie es denn jetzt eigentlich aussehen soll, kann man da nicht viel dazu sagen...



  • Erst mal Danke für eure hilfe, vorallem an Andrey. (ich verstehe dich^^) Nur noch ein Problem Rechtecke bach ihren Eckpunkte zeichnen hatten wir no net, kann mir da llt au no jemand helfen (sollte ja net zu schwer seinb).
    Mfg Christi



  • mit den befehlen, mit den du grad arbeitest, kannst du auch kein gedrehtes gefülltes rechteck zeichnen, ich hab eigentlich vorgeschlagen, einfach die vier eckpunkte einzeln zu transformieren und diese danach mit einfachen strichen (linien) zu verbinden, also von A nach B von B nach C von C nach D usw... (dann hast du nur den rechteckrand)

    {
    obwohl, wenn du schon die transformationsmatrix hast, kannste grad n ganzen pixelarray (ganzes bild von einem auto) nehmen, und punkt für punkt transformieren und hinzeichnen. Solange das gezeichnete auto kleiner oder genausogros ist, wie das ausgangsbild, brauchst du keinen rasterizer, es werden auch so (so gut wie?) keine löcher im gedrehten bild entstehen [nicht besonders elegant, wird wahrscheinlich hässlich und pixelig aussehen, aber wenn du's schön machen willst, kannst du entweder OpenGL lernen oder dir nen eigenen mini-rasterizer schreiben, der ein rechteck texturieren kann (ist echt voll overkill für die aufgabe=> machs pixel für pixel) ]
    };


Anmelden zum Antworten