/ / Wie finde ich die Anzahl der Sphäroide, die durch zwei parallele Ebenen oder Quader gebunden sind, und zeichne diese auf? [geschlossen] - r, Handlung, 3d, Geometrie, rgl

Wie finde ich die Anzahl der Sphäroide, die durch zwei parallele Ebenen oder Quader gebunden sind, und zeichne diese? [geschlossen] - r, Handlung, 3d, Geometrie, rgl

Ich suche eine Bibliothek oder einen anderen QuellcodeDas wird mir helfen, nicht schneidende Kugeln oder Sphäroide anzuzeigen, was nicht unbedingt ein Problem beim Packen von Behältern ist, aber es könnte sein. Jede dieser Kugeln kann auch einen weiteren Satz viel kleinerer Kugeln enthalten. Ich möchte dann eine Scheibe, dh zwei parallele Ebenen in einem Abstand voneinander oder einen Quader, durch diese "Welt" nehmen und berechnen, wie viele größere und kleinere Kugeln von der gegebenen Scheibe "erfasst" werden, und eine 3D erzeugen Grafik.

Obwohl ich viel Erfahrung in habeProgrammierung usw. 3D-Räume sind für mich neu und meine Geometrie etwas rostig. Ich habe mir das rgl-Paket für R + und D3.js angesehen, sehe aber keine offensichtliche Lösung. Ich habe StackOverflow durchsucht und es gibt den Beitrag "Würfelkugel-Schnittpunkt-Test?" Problem vielleicht, aber das CRAN-Paket StereoMorph lieferte auch keine Antworten.

Vorschläge, wo ich suchen sollte, sind willkommen. Ich bin auch nicht mit einer bestimmten Computersprache verheiratet.

Vielen Dank!

Antworten:

1 für die Antwort № 1

Eine Kugel ist definiert als:

[centerX,centerY,centerZ,radius]

und eine Ebene ist definiert als

[normalVectorX,normalVectorY,normalVectorZ,distance]

Entfernung ist die Entfernung vom Ursprung zumFlugzeug, wenn Sie entlang der Richtung des Normalenvektors fahren würden. Mit anderen Worten, wenn Sie jede Komponente des Normalenvektors mit der Entfernung multiplizieren, haben Sie irgendwo in der Ebene einen Punkt.

So testen Sie, ob sich eine Kugel auf der einen oder der anderen Seite der Ebene befindet:

Projizieren Sie das Kugelzentrum auf die Ebenennormale, addieren Sie den Radius der Kugel, und wenn diese Summe kleiner als der Ebenenabstand ist, hat sie sich nicht geschnitten.

CENTER = [centerX,centerY,centerZ]
NORMAL = [normalVectorX,normalVectorY,normalVectorZ]
isBelowHighPlane = dotProduct(CENTER,NORMAL)+radius < distance

Nehmen wir für die andere Ebene die "untere" Ebene, subtrahieren Sie den Radius und testen Sie, ob die Summe größer ist:

isAboveLowPlane = dotProduct(CENTER,NORMAL)-radius > distance

Wenn daher beide obigen Tests wahr sind, ist die Kugel enthalten.

HINWEIS: Wenn Ihre Ebene auf eine andere Weise definiert ist, z. B. durch drei Punkte in Raum A, B, C, können Sie die Normalen finden, indem Sie das Kreuzprodukt zweier beliebiger Seiten nehmen:

normalVector = normalize(crossProduct((B-A),(B-C)))

Und sobald Sie diesen normalen Vektor haben, können Sie den Abstand ermitteln, indem Sie den Vektor vom Ursprung zu einem dieser Punkte auf die Normalen projizieren:

distance = dotProduct(B,normalVector)

Beachten Sie, dass der Abstand möglicherweise negativ ist.

Die 3D-Funktionen, die Sie in einer beliebigen Sprache benötigen, sind:

dotProduct(), crossProduct(), und normalize()

Wenn Sie eine Verbindung von kleinen Kugeln zu habenWenn sie eine große Kugel enthalten und diese große Kugel entweder vollständig innen oder vollständig außen ist, können Sie sofort den Zustand aller kleinen Kugeln erkennen. Um jedoch zu testen, ob eine große Kugel vollständig ausgefallen ist, benötigen Sie zusätzliche Variationen des Tests:

isAboveHighPlane = dotProduct(CENTER,NORMAL)-radius > distance
isBelowLowPlane = dotProduct(CENTER,NORMAL)+radius < distance