Schar von Vektoren berechnen



  • Gegeben ist ein Vektor v von Punkt P1 zu P2 im Raum. Jetzt möchchte im am Ende dieses Vektors v, ausgehend von dessen Richtung, eine Schar von neuen Vektoren berechnen. Diese haben alle den Startpunkt in P2 und die Länge l. Die Endpunkte sollen so berechnet werden, dass die neuen Vektoren eine Art Kegel bilden. Dabei möchte ich den "Kegel" bzw. die Endpunkte der zu berechnenden Vektoren durch die Angabe eines "Öffnungs-Winkel" in Bezug auf den Vektor v berechnen.

    Weil diese Schar von Vektoren sehr oft berechnet werden muss (die Position und Richtung des Vektors v ändert sich), sollte das Ganze auch möglichst effizient sein. Wie berechne ich denn diesen "Kegel von Vektoren"?



  • du weißt aber schon, dass es unendlich viele solcher vektoren gibt? Woz brauchst du das? soll das später gezeichnet werden?

    auf alle fälle muss für die vektoren gelten: (Skalarprodukt)

    <a,v>va=cosα\frac{< \vec a,\vec v>}{|v||a|}=cos\alpha
    a ist dein ursprungsvektor, v ist die schar der vektoren.

    Weiterhin muss gelten |v| = l. Das sind zwei gleichungen, im 3d-raum wören es dann eine einparametrige lösung.

    Weiterhin könntest du die höhe des kegels aus dem winkel und der lönge des vektors bestimmen, darüber durch verlängerung von a den mittelpunkt berechnen, den radius bekommst du auch durch höhe und winkel raus. Damit könntest du dann den grund-Kreis im 3d-raum als parameterdarstellung beschreiben.

    kommt eben drauf an, was du dann damit machen willst.



  • also, ein paar angaben mehr dürfen es schon sein.

    bleibt der winkel zwischen deinem "Öffnungs-Winkel" α und v immer konstant ?
    müssen die vektoren bei jeder positionsänderung/winkeländerung von v neu berechnet werden ?
    ist die berechnung aller möglichen( bedingt durch die auflösungsgenauigkeit des rechners ) vektoren nötig ?
    soll der kegel gezeichnet werden ? usw....

    im prinzip brauchst du nur den endpunkt von v, α und die länge lm.
    lm soll hier die länge vom endpunkt des vektors v bis zum mittelpunkt des kreiskegels sein.
    also lm = l*cos(α)
    der rest lässt sich, wie schon von maxi beschrieben, aus den daten ausrechnen.

    ändert sich der endpunkt von v um dx,dy,dz, so ändert sich ja auch nur der endpunkt von lm ( und die endpunkte deiner schar von vektoren ), bei konstantem α
    usw...
    🙂



  • Hab mal kurz eine Skizze erstellt.

    Die Punkte P1 und P2 sind Messwerte einer Flugbahn. Am Punkt P2 soll eine bestimmte Anzahl von Vektoren mit der Länge l und dem Öffnungswinkel alpha "kegelförmig" berechnet werden. Anhand des Punktes P2 und den errechneten Endpunkten der Vektoren, wird nun überprüft, ob sich das Objekt bereits näher als die Distanz l zur einer unebenen Oberfläche befindet oder nicht [1]. Pro Messert der Flugbahn müssen mehrere solche Kegel berechnet werden, also mit unterschiedlichem alpha.

    Zur Berechung:
    h=cos(α)lh=\cos(\alpha)*l
    h=rP2+vvh\vec{h}=\vec{r}_{P2} + \frac{\vec{v}}{\mid\vec{v}\mid }*h

    r=sin(α)lr=\sin(\alpha)*l
    Und nun über den Radius r\vec{r} des Grundkreises die gesuchten Endpunkte (bestimmte Anzahl n) berechnen. Den Radius kann man vermutlich irgendwie über das Kreuzprodukt bestimmen?

    Das Ganze sollte so effizent wie möglich berechnet werden...
    Hoffe jetzt ist es etwas verständlicher...

    [1] Sobald ein Endpunkt eines Vektors unterhalb der Oberfläche ist, endet die Berechnung. Die hier beschriebene Berechnung wird übrigens erst dann ausgeführt, wenn sich das Objekt innerhalb einer Bounding-Box befindet. Die Flugbahn ist nicht linear.



  • wäre es nicht eine alternative dir einmal eine schar von vektoren für einen standardkegel zu bauen und diesen dann jedes mal einfach entsprechend zu transformieren? dadurch bräuchtest du dir über die effizienz beim erstellen des kegels wenig gedanken machen, da es sowieso nur einmal geschieht.

    Gruß
    Jakob



  • Die Richtung von v\vec{v} ändert natürlich jeweils. Aber die Länge l ist immer konstant.

    Dann könnte ich für einen Referenzvektor vref\vec{v}_{ref}, der z.B. senkrecht nach unten zeigt, alle Kegel für die Öffnungswinkel von z.B. 0-90 Grad berechnen.

    Dann müsste ich zur Laufzeit den Vektor v\vec{v} zum Referenzvektor vref\vec{v}_{ref} verschieben und das Skalarprodukt ausrechnen. Der erhaltene Winkel δ\delta müsste dann zum eigentlichen Öffnungswinkel α\alpha addiert werden um die passende Schar von vorgänig berechneten Vektoren zu erhalten. Diese Vektoren muss ich dann noch zum Endpunkt von v\vec{v} verschieben. Right?



  • poiz schrieb:

    Dann könnte ich für einen Referenzvektor vref\vec{v}_{ref}, der z.B. senkrecht nach unten zeigt, alle Kegel für die Öffnungswinkel von z.B. 0-90 Grad berechnen.

    😮 alle ? 😮
    naja, wenn du soviel zeit und arbeitsspeicher hast, nur zu 😉



  • Ok, ich berechne z.B. die Kegel bzw. Endpunkte für die Öffnungswinkel 10,20,...,90 Grad. Besser so oder versteh' ich etwas falsch?

    Vielleicht kann mir jemand zuerst, also vor den Ganzen optimierungen, die eigentliche Berechnung aus meinem 2.Posting erklären?

    poiz schrieb:

    [snip]

    Zur Berechung:
    h=cos(α)lh=\cos(\alpha)*l
    h=rP2+vvh\vec{h}=\vec{r}_{P2} + \frac{\vec{v}}{\mid\vec{v}\mid }*h

    r=sin(α)lr=\sin(\alpha)*l
    Und nun über den Radius r\vec{r} des Grundkreises die gesuchten Endpunkte (bestimmte Anzahl n) berechnen. Den Radius kann man vermutlich irgendwie über das Kreuzprodukt bestimmen?
    [snip]



  • wenn es dir darum geht, einen abstand A zwischen dem punkt p2 und dem punkt p einer oberfläche auszurechnen, warum dieser umstand über den kegel ?

    den abstand bekommst du doch einfach über den betrag der differenz der vektoren p und p2
    🙂


Anmelden zum Antworten