/ / Ako zistiť počet sféroidov ohraničených dvoma rovnobežnými rovinami alebo kvádrom a tieto vykresliť? [zatvorené] - r, zápletka, 3d, geometria, rgl

Ako nájsť počet sféroidov viazaných dvomi rovnobežnými rovinami alebo kvádrovými a vykresliť ich? [uzavretý] - r, pozemok, 3d, geometria, rgl

Hľadám knižnicu alebo iný zdrojový kódto mi pomôže zobraziť nepretínajúce sa gule alebo sféroidy, čo nemusí byť nutne problém s balením koša, ale mohlo by to byť. Každá z týchto gúľ môže vo vnútri obsahovať aj ďalšiu sadu oveľa menších gúľ. Potom by som chcel týmto „svetom“ previesť plátok, tj. Dve rovnobežné roviny vzdialené od seba alebo kváder, a vypočítať, koľko väčších ako aj menších gúľ je daným plátom „zachytených“, a vygenerovať 3D grafický.

Aj keď mám veľa skúseností vprogramovanie atď. 3D priestory sú pre mňa nové a moja geometria je trochu hrdzavá. Pozrel som sa do balíka rgl pre R + aj D3.js, ale nevidím zrejmé riešenie. Hľadal som cez StackOverflow a je tu príspevok „Test križovatky Cube sphere?“, Ale celkom ma nedostane to, čo hľadám. Nie som si istý, či to spadá pod problém „kolízie“ alebo skôr do stereológie problém možno, ale balík CRAN StereoMorph tiež nepriniesol žiadne odpovede.

Akékoľvek návrhy, kam by som sa mal pozrieť, sú vítané. Nie som tiež ženatý so žiadnym konkrétnym počítačovým jazykom.

Vďaka!

odpovede:

1 pre odpoveď č. 1

Sféra je definovaná ako:

[centerX,centerY,centerZ,radius]

a rovina je definovaná ako

[normalVectorX,normalVectorY,normalVectorZ,distance]

Vzdialenosť je vzdialenosť od začiatku dorovine, ak by ste sa mali pohybovať v smere normálneho vektora. Inými slovami, ak vynásobíte každú zložku normálového vektora vzdialenosťou, budete mať bod niekde v rovine.

Ak chcete vyskúšať, či sa guľa nachádza na jednej alebo na druhej strane roviny:

Stred gule premietnite na normálu roviny, pridajte polomer gule a ak je tento súčet menší ako vzdialenosť roviny, potom sa nepretínal.

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

Pre druhú rovinu, povedzme „nižšiu“ rovinu, odčítajte polomer a vyskúšajte, či je súčet väčší:

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

Preto, ak sú obidve vyššie uvedené testy pravdivé, sféra je obsiahnutá.

POZNÁMKA: Ak je vaša rovina definovaná iným spôsobom, napríklad tromi bodmi v priestore A, B, C, môžete nájsť normálu tak, že vezmeme krížový súčin ľubovoľných dvoch strán:

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

Akonáhle máte tento normálny vektor, môžete nájsť vzdialenosť premietnutím vektora z počiatku do ktoréhokoľvek z týchto bodov na normál:

distance = dotProduct(B,normalVector)

Upozorňujeme, že vzdialenosť môže byť negatívna.

3D funkcie, ktoré potrebujete v akomkoľvek jazyku, ktorý si vyberiete, sú:

dotProduct(), crossProduct(), a normalize()

Ak máte nejaké spojenie z malých gúľ doobsahujú veľkú guľu a táto veľká guľa je úplne alebo úplne mimo, potom môžete okamžite poznať stav všetkých malých gúľ. Ak však chcete vyskúšať, či je veľká guľa úplne mimo, budete potrebovať ďalšie variácie testu:

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