Breite einer Fläche bestimmen



  • Tachchen.

    Ich habe Flächen zur Auswahl (Linie,Rechteck,Ellipse) und kann diese nach belieben breit machen.

    Diese Flächen möchte ich nun rotieren lassen (360°)(dies ist bereits von der verwendeten API selbst gelöst) und gerne wissen wie breit von der Vorderansicht (wenn Flächen eine Höhe hätten) diese wären.

    Komplizierte Winkelrechnung ist wohl nicht ganz angebracht, da er das sehr schnell berchnen soll.

    Wie bekommt man die Länge vom ässersten Punkt links, zum äussersten Punkt rechts bei einem Winkel X herraus?



  • hab jetzt keine ahnung, welche flächen anfangs wie sind und um welche achsen gedreht wird.

    vielleicht isses das hier, was du meinst?
    nimm mal deine hand und halte sie vor dich mit den fingern nach oben und der handfläche zu dir. du siehst die volle handbreite.

    jetzt dreh die hand um 45 grad um die hochachse. du siehst 70% der handbreite. dreh noch 45 grad weiter, daß jetzt der daumen zu dir zeigt. du siehst 0% der handbreite.

    allgemeine formel: du siehst cos(drehwinkel) der handbreite.
    achte drauf, daß der drehwinkel in c++ als bogenmaß angegeben wird, also 0 bis pi statt 0 grad bis 180 grad.



  • nehmen wir das Rechteck:

    Wenn du dein Rechteck von der Breitseite siehst ist die scheinbare Breite B* gleich der tatsächlichen Breite B. Bei einem Winkel von 90° ists die Höhe des Rechtecks H. Dazwischen ists ein bisschen von Höhe und Breite, je nach Winkel. Dass das was mit Sinus und Cosinus sein muss sieht man ja wenn mans sich aufzeichnet, und da Sinus(0)=0 und cos(0)=1 und das umgekehrte bei 90° ergibt sich für die scheinbare Breite:
    B* = B |cos φ| + H |sin φ|

    Die Linie kannst du als entartetes Rechteck sehen mit einer Höhe von 0



  • Danke für eure schnelle Hilfe!

    pumuckl Formel scheint ihren Dienst hervorragend zu erledigen. Danke!
    Gibt es eventuell eine _schnellere_ Version ohne rechenintensives sin/cos?

    Gegeben ist lediglich Breite, Höhe und Winkel.



  • eine exakte formel gibt es nicht, die schneller ginge.
    Aber eine gute Näherung wäre eine Reihenentwicklung:
    sinx=n=0(1)nx2n+1(2n+1)!\sin x = \sum_{n=0}^{\infty}(-1)^n \frac{x^{2n+1}}{(2n+1)!}

    cosx=n=0(1)nx2n(2n)!\cos x = \sum_{n=0}^{\infty}(-1)^n \frac{x^{2n}}{(2n)!}
    Nimm die ersten 3 Glieder und du bist schon ziemlich nah dran:

    sinxxx36+x5120\sin x \approx x - \frac{x^3}{6} + \frac{x^5}{120}

    cosx1x22+x424\cos x \approx 1 - \frac{x^2}{2} + \frac{x^4}{24}

    (der Fehler liegt beidemale unter 2%, wenn x < pi/2)
    Du müsstest dann nur noch deine Winkel runterrechnen, damit der Fehler nicht zu groß wird.



  • Wau danke. Werd ich mal vergleichen.



  • Du kannst dir aber auch für sinus und cosinus je eine Tabelle anlegen.
    Bei einer Tabelle mit 50 Werten müstest du auch bei 2 % sein bei 256 Werten bei 0.4 % und du braucht keine Reihenwntwickluing (5 Multiplikation, 2 Divisionen (kann man durch 2 Multiplikationen mit dem Kehrwert ersetzen) und 2 Additionen) sondern nur eine einfache Multiplikation.

    Willst dun genauer werden machst du zwischen 2 Werten noch eine lineare Interpolation, oder erhöhst die Anzahl der Tabelleneinträge.

    Du kannst sinus und Cosinus durch eine Tabelle für den Bereich +-∏/2 abbilden und dann mit einem Offset arbeiten


Anmelden zum Antworten