Zum Inhalt springen

algorithmus: voxel ermitteln/bestimmen/suchen


ecutioner

Empfohlene Beiträge

Hallo :)

Ich will einen Algorithmus schreiben, der mir sagt ob einen Punkt (x y z) im drei-demensionalenraum sich innerhalb vier Linien bzw. innerhalb einer Pyramide befindet. s. Anhang/bild.

jede Linie ist beschrieben durch ihre Voxelnposition d.h ich habe 4 Arrays, wo in jede Array die voxeln von der linie gespeichert sind.

z.B [X1 Y1 Z1] % voxel-array für linie 1

X1(1)= 0 Y1(1)=0 Z1(1)=0

X1(2)= 0 Y1(2)=1 Z1(2)=1

...

...

...

X1(70)= 75 Y1(70)=75 Z1(70)=75

hat jmd eine Idee wie ich das Algorithmus realisieren kann?

im schlimmsten fall muss ich alle voxeln, die sich innerhalb der pyramide befinden, ermitteln und in einem array speichern. und dann über diesen Array iterieren, ich weiß aber trotzdem nciht wie ich die voxeln ermitteln soll :( und diese methode wird auch höchstwahrscheinlich zeit und rechenaufwändig sein.

ich hoffe ich habe mich gut ausgedrückt. Ich bin für jede Idee dankbar.

danke im Vorraus.

post-75483-14430448829059_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da Du ja im realen keinen unendlichen Vektorraum hast, sondern dieser durch die 3 Geraden und die max. Höhe / Breite / Tiefe des Bildraumes begrenzt sind, kannst Du das als konvexes Polygon auffassen und musst nur prüfen, ob ein Punkt innerhalb des Polygons liegt. Je nach Anwendung braucht man das auch nicht in R^3 berechnen, sondern kann das nach R^2 projizieren und mit die Berechnung mit baryzentrischen Koordinaten durchführen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Junge Junge,

das ist mal was wo man länger über das Vorgehen als über die Formulierung nachdenken muss, und der flashpixx hat sich auch schon was überlegt :)

Aus mathematischer Sicht denke ich, dass flashpixx da richtig liegt und Du mit der Projekttion deiner Geraden rechnen kannst.

Die Genauigkeit bei der Rechnung sollte meiner Meinung aber deutlich geringer als vermutet sein, da Du das ganze ja bestimmt auf einem Bildschirm darstellen willst un es so nur auf 1 Pixel Genauigkeit ankommt da, 0,1 Pixel ja nicht darstelllbar sind.

Bei dieser Aussage gehe ich davon aus, dass Du, wie bei Voxel wohl üblich, keine Farbkorrekturen der Pixel à là AA machen willst. (ich kenn mich da aber nur "Bild-Leser" mäßig aus)

Link zu diesem Kommentar
Auf anderen Seiten teilen

IDa Du ja im realen keinen unendlichen Vektorraum hast, sondern dieser durch die 3 Geraden und die max. Höhe / Breite / Tiefe des Bildraumes begrenzt sind, kannst Du das als konvexes Polygon auffassen und musst nur prüfen, ob ein Punkt innerhalb des Polygons liegt. Je nach Anwendung braucht man das auch nicht in R^3 berechnen, sondern kann das nach R^2 projizieren und mit die Berechnung mit baryzentrischen Koordinaten durchführench will einen Algorithmus schreiben, der mir sagt ob einen Punkt (x y z) im drei-demensionalenraum sich innerhalb vier Linien bzw

Prinzipiell hast Du recht, dass sich zwar das dreidimensionale für den Anwendungsfall in ein zweidimensionales Problem überführen lässt. Nur ist dann die Frage, ob es nicht einfacher ist, es für den dreidimensionalen Raum auszurechnen und in die Ebene zu projezieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

als erstes muss ich euch für die schnelle antwort danken und entschuldige mich für das späte antwort.

Also es geht um volumentomographie. Man will versuchen die Bildgebende verfahren in der Medizin zu verbessern und vor allem zu beschleunigen um z.B chemikalische abläufe in irgendeiine Gewebe zu beobachten.

solche abläufe können so schnell sein dass jede milli-sekunde gold wert ist. Von jedem Voxel der vom Strahl getroffen wird muss das volumen berechnet werden Bsp.: Vges= V/2 wenn der Voxel in der mitte getroffen wird usw. damit der "volumenberechner" kein zeit, mit Voxeln die nicht vom Strahl getroffen werden, verliert, soll dieser algorithmus helfen zu sagen welche Voxeln vom körper genau vom LichStrahl getroffen werden, dieser algorithmus ist so zusagen nur ein puzzelstück.

zum Alg.:

ich hab mich mit flashpixx´s Methode befasst, und muss echt sagen das war ein sehr sehr guter denkanstoß.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, wunderbar ... sowas ist eh mein Brotberuf ... mache SW-Entwicklung im PACS Bereich (komplett alles von Netzwerkkommunikation über Userinterface bis zum 3D Volume Renderer)

Willst du alle Voxel innerhalb der Pyramide verarbeiten oder

brauchst du nur einen Test um festzustellen, ob ein Voxel innerhalb der Pyramide liegt ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Von jedem Voxel der vom Strahl getroffen wird muss das volumen berechnet werden Bsp.: Vges= V/2 wenn der Voxel in der mitte getroffen wird usw. damit der "volumenberechner" kein zeit, mit Voxeln die nicht vom Strahl getroffen werden, [...]

ich verweise hier einmal auf entsprechende Algorithmen aus der Computergraphik im Bereich Rendering. Da Du eine feste Strahlenquelle hast, die im Grunde aussendet und Du hier Schnitte berechnen musst, kannst Du je nach Voraussetzung auch nur die Punkte berechnen, die überhaupt relevant sind, d.h. z.B. Punkte die "verdeckt" sind fallen schon mal raus. Entsprechende Datenstrukturen sind kd-Trees, um sehr effizient zu testen, ob überhaupt berechnet werden muss.

Zusätzlich solltest Du Dir auch überlegen, welche Zusammenhänge existieren, denn gerade wenn man im Bereich eines Raytracings arbeitet, würde sich eine direkte Parallelisierung des Datenraumes ergeben, wobei man Performance via Pipelining des GPUs, CPU Parallelisierung (MPI, MPICH2) oder beides in Kombination (OpenCL) erreichen kann.

[...] verliert, soll dieser algorithmus helfen zu sagen welche Voxeln vom körper genau vom LichStrahl getroffen werden, dieser algorithmus ist so zusagen nur ein puzzelstück.

Das ist im Grunde nur entsprechendes Raytracing. Denn Du hast einen Strahl und willst wissen, ob ein Schnitt mit einem Objekt bzw. dessen Oberfläche vorliegt. Wobei hier natürlich direkt sich eine entsprechende Diskretisierung des Objektes ergeben muss.

ich hab mich mit flashpixx´s Methode befasst, und muss echt sagen das war ein sehr sehr guter denkanstoß.

Dieser erste Ansatz beruht im Grunde nur auf den konvexen Mengen und eben deren Definition bezüglich Strecken innerhalb. Je nach Anwendung und Datengrundlage wäre auch zu überlegen, ob man eben zu Algorithmen bezügl. der Konvexe Hülle ? Wikipedia greift.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du alle Voxel verarbeiten möchtest:

Der Mittelstrahl der Pyramide dient als bestimmung der Hauptrichtung (X, Y oder Z), dann bestimmst du den Schnittpunkt der Pyramide mit jeder Voxel-Ebene normal zur Hauptrichtung und verarbeitest die Voxel wie in einem 2D Array (Randvoxel brauchen ein bißl Sonderbehandlung), sollte in Summe doch recht flott gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@M.A.Knapp: Würde ich bei größeren Datenmengen nicht mehr so naiv machen. Ich würde da dann wohl zu kd-Tree mit Frustrum-Culling bzw zum testen inverse-frustrum-clulling gegen die Splittingplane verwenden. Lässt sich auch sehr schön via SIMD parallelisieren

Hängt von der Größe der Daten ab ... wenns nur ein 1024^3 x 16bit Volumen ist, dann geht sicher eine Brute-Force Methode - alle Voxel der Pyramide zu verarbeiten - auch noch recht schnell.

Ist die Frage, ob der Overhead für einen Octree geringer ist, als wenn man eine jede Voxel-Ebene mit 4 Strahlen schneidet, da man, wenn man die Schnittpunkte der Pyramide mit einer Voxelebene kennt, kann man relativ leicht die Positition der anderen Voxel im 2D berechnen.

Bearbeitet von M.A.Knapp
Link zu diesem Kommentar
Auf anderen Seiten teilen

Willst du alle Voxel innerhalb der Pyramide verarbeiten oder

brauchst du nur einen Test um festzustellen, ob ein Voxel innerhalb der Pyramide liegt ?

Nein ich brauche nur einen Test um festzustellen, ob ein Voxel innerhalb der Pyramide liegt?

ich verweise hier einmal auf entsprechende Algorithmen aus der Computergraphik im Bereich Rendering. Da Du eine feste Strahlenquelle hast, die im Grunde aussendet und Du hier Schnitte berechnen musst, kannst Du je nach Voraussetzung auch nur die Punkte berechnen, die überhaupt relevant sind, d.h. z.B. Punkte die "verdeckt" sind fallen schon mal raus.

welchen Algorthmus "aus der Computergraphik im Bereich Rendering" meinst du genau??

Die Strahlenquelle ist nicht fest sondern variable. die Position bekommt der Alg. als input/parameter.

Mit "verdeckt" meinst du schon punkte die voll bestrahlt werden oder? die braucht man aber auch, sie werden dann in eine andere liste gespeichert.

Das ist im Grunde nur entsprechendes Raytracing. Denn Du hast einen Strahl und willst wissen, ob ein Schnitt mit einem Objekt bzw. dessen Oberfläche vorliegt. Wobei hier natürlich direkt sich eine entsprechende Diskretisierung des Objektes ergeben muss.

ich habe ein anderes verfahren benutzt und zwar der Bresenham 3d algorithmus. Ich kenne nämlich den endpunkt bzw. ich weiß wo der licht endet (dioden-chip) das endpunkt/endposition ist bekannt. Ausserdem ist das licht, was beispielsweiße von der röntgenröhre rauskommt, kein wirkliches strahl ehe eine "fläche" z.B pyramidenstrahl oder kegelstrahl.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe ein anderes verfahren benutzt und zwar der Bresenham 3d algorithmus.

Das ist ein Algorithmus um eine Linie zwischen zwei Punkten zu zeichnen, d.h. eigentlich um sie als diskrete Punkte zu zeichnen, sprich es ist ein Rasterisierungsalgorithmus

Ausserdem ist das licht, was beispielsweiße von der röntgenröhre rauskommt, kein wirkliches strahl ehe eine "fläche" z.B pyramidenstrahl oder kegelstrahl.

Deswegen mein Hinweis auf Frustrum-Culling, denn dies ist genau das Verfahren, was diesem exakt entspricht. Du hast einen Ausgangspunkt und mit der Entfernung von diesem entwickelt sich das ganze direkt pyramidal. In Verbindung mit kd-Trees ist das Verfahren sehr effizient bezugl. der Schnittpunktberechnung zwischen Frustrum und einem Objekt.

Mit "verdeckt" meinst du schon punkte die voll bestrahlt werden oder? die braucht man aber auch, sie werden dann in eine andere liste gespeichert.

Dies entspricht einer weiteren Traversierung des kd-Trees, da innerhalb des Trees Objekte, die zuerst durch den Strahl geschnitten werden, als erstes geliefert werden.

Wenn die Objekte innerhalb des Trees für alle Strahlenpositionen gleich sind und sich immer nur die Strahlenposition verändert, dann musst Du nur einmal den Tree aufbauen und kannst bei entsprechender Umsetzung als Multithread oder CPU-orientiert den Baum mit mehreren Strahlenquellen verarbeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...