Punktewolke 3D darstellen und drehen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Punktewolke 3D darstellen und drehen

    Hallo zusammen,
    Ich habe wiedermal eine etwas für mich schwierige Aufgabe:
    Ich soll mehrere Punkte (X,Y,Z) also in 3D anzeigen und die Ansicht auch drehen und schieben können. (Ähnlich wie mit LapView...)
    Anzahl der Punkte 3.000.000!
    Kann das vb.net überhaupt?
    Vielen Dank
    Hab mir die Lib grade nochmal angeschaut. Lösbar wäre dein Problem damit, allerdings würde ich statt GDI eher Lockbits benutzen (sofern du einen Punkt aus der Punktewolke als einzelnen Pixel darstellen möchtest). Damit wäre das reine Zeichnen sogar recht schnell - 3Mio Zufallspunkte in 140ms, GDI brauch dafür mehrere Sekunden. Hier ist aber das Problem: die Lib benutzt GDI xD

    Du kannst aber glücklicherweise den Source der Lib einsehen. Da gibt es eine Private Methode "Get_Screen_Point", die einen 3D-Punkt auf 2D abbildet (okay, die Rückgabetypen passen nicht in diese Anschauung, hat aber so auch seine Vorteile). Wenn du diese Public deklarierst kannst du das GDI-Gezeichne aushebeln und selbst Zeichnen - idealerweise mit Lockbits. (Tipp: zeichne zuerst mit der langsamen Bitmap-Funktion SetPixel und tausche das später durch Lockbits aus. So lassen sicher Fehler einfacher finden)

    Die Zeit, die die Lib zum projizieren der 3Mio Punkte braucht (Fließkommarechnungen kosten leider etwas...) kommt natürlich zu den 140ms zum zeichnen der Punkte dazu. Ich vermute das wird alles noch unter 1 Sekunde bleiben.
    Dann kannst Du auch gleich mit C# und unsave arbeiten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich denke in dem Fall bringt der unsave-Kram keinen riesen Unterschied (oder doch?), weil nur die Lockbits-Routine etwas optimiert wird. Viel mehr könnte man mit Parallelisierung erreichen. Bei einem 4-Kern-Prozessor wäre bestimmt Faktor 3 schneller drin. Einfach die ForEach-Schleifen durch Parallel.ForEach-Schleifen (ab .NET 4.0 sind die glaubich dabei) ersetzten - das würde beim Lockbits-Part(GDI könnte das nicht) und beim berechnen der 3D-zu-2D-Projektionen funktionieren.
    Wenn's dann immer noch nicht schnell genug sein soll kann man die letzten Prozente mit unsave-Zeug raushauen. Dann kann man aber auch gleich anfangen den Projektionsalgo zu optimieren, da lassen sich sicher einige Singles/Doubles mit Bitshifting und Tricks durch Integers ersetzten/annähern. Weil die Anzahl der Projektionsvorgänge so groß wirken sich schon kleine Verbesserungen aus^^
    Ich hatte mir auch mal die Mühe gemacht, sowas mit ner ordentlichen Struktur zu implementieren.
    Falls es dich also interessiert, MathUtils bietet genau die Funktionalität, die du brauchst, und ist meiner Meinung nach etwas besser aufgebaut, als GDI3D.