2016-10-24 1 views
0

Я ищу библиотеку или другой исходный код, который поможет мне отображать непересекающиеся сферы или сфероиды, не обязательно проблему упаковки корзины, но это может быть так. Каждая из этих сфер может также содержать еще один набор гораздо меньших сфер внутри. Затем я хотел бы взять срез, т. Е. Две параллельные плоскости на расстоянии друг от друга или кубоид через этот «мир», и рассчитать, сколько больших, а также более мелких сфер «захвачено» данным срезом, и создать 3D графический.Как найти количество сфероидов, связанных двумя параллельными плоскостями или кубоидом, и построить их?

Хотя у меня много опыта в программировании и т. Д. 3D-пространства для меня новы, а моя геометрия немного ржавая. Я просмотрел пакет rgl для R +, а также D3.js, но не вижу очевидного решения. Я искал через StackOverflow и есть тест пересечения сферы куба? но это не совсем меня, что я ищу. Не уверен, что это подпадает под проблему «столкновения» или, скорее, проблема с стереологией, но пакет CRAN StereoMorph также не дал никаких ответов.

Любые предложения относительно того, где я должен искать, приветствуются. Я также не соглашаюсь на какой-либо конкретный компьютерный язык.

Спасибо!

ответ

1

Сфера определяется как:

[centerX,centerY,centerZ,radius] 

и плоскость определяется как

[normalVectorX,normalVectorY,normalVectorZ,distance] 

Расстояние расстояние от начала координат до плоскости, если вы должны были путешествовать по направлению нормальный вектор. Другими словами, если вы умножаете каждую компоненту нормального вектора на расстояние, вы будете иметь точку где-то на плоскости.

Чтобы проверить, если сфера находится на одной стороне самолета или другого:

Project центр сферы на плоскости, нормальной, добавьте радиус сферы, и если эта сумма меньше, чем на плоскости расстояние , то он не пересекается.

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

Для другой плоскости, позволяет сказать «нижней» плоскость, вычтите радиус и испытание, если сумма больше:

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

Таким образом, если оба вышеуказанных испытания истинны сферой является содержатся.

ПРИМЕЧАНИЕ: Если плоскость определяется другим способом, например, с тремя точками в пространстве A, B, C, вы можете найти нормальный, беря декартово произведение любых двух сторон:

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

И как только у вас есть, что нормальный вектор, вы можете найти расстояние проецируя вектор от начала координат до любого из этих точек на нормаль:

distance = dotProduct(B,normalVector) 

Примечания, расстояние может быть отрицательным.

Так 3d необходимые функции на любом языке, вы выбираете:

dotProduct(), crossProduct() и normalize()

Если у вас есть какая-то связь с маленьких шариков к их содержащей большой сфере, и что большая сфера либо полностью или полностью, то вы можете мгновенно узнать состояние всех малых сфер. Тем не менее, чтобы проверить, полностью ли отключена большая сфера, вам потребуются дополнительные изменения:

isAboveHighPlane = dotProduct(CENTER,NORMAL)-radius > distance 
isBelowLowPlane = dotProduct(CENTER,NORMAL)+radius < distance 
Смежные вопросы