Войти
ПрограммированиеФорумОбщее

Летящая сфера и горизонтальная плоскость

Страницы: 1 2 Следующая »
#0
21:09, 23 мар. 2021

Сфера с заданным радиусом летит из точки A в точку B. На своем пути она может пересечь горизонтально лежащий прямоугольник разделенный на клетки с шагом 1. Нужно определить какие клетки при полете пересечет сфера.

Изображение

#1
(Правка: 21:43) 21:27, 23 мар. 2021

Сечение - эллипс. Центр эллипса - точка пересечения прямой с плоскостью. Эксцентриситет эллипса - единица, деленная на синус угла между прямой и плоскостью. Ориентация эллипса - аналогично ориентации прямой относительно плоскости.

UPD, ой, не, наврал насчет эксцентриситета. Не соображу сразу
UPD2. Эксцентриситет - просто косинус угла. А синус - отношение малой полуоси к большой.

#2
0:10, 24 мар. 2021

Dmitry_Milk
Т.е. для общего  уравнения эллипса
\(\frac{ x^{2}}{ a^{2}} + \frac{ y^{2}}{ b^{2}}= 1\)

Будет так \(\frac{b}{ a}= sin(alpha)\) и \(\frac{\sqrt{a^{2} - b^{2}}}{ a} = cos(alpha)\) ?

#3
16:01, 24 мар. 2021

Если из первого уравнения выразить b и подставить во второе, то получится a^2 = a^2. Видимо получается не совсем так.

#4
(Правка: 18:01) 17:47, 24 мар. 2021

AlexeyLarin
Фактически тебе нужно пересечение капсулы (цилиндр с двумя полусферами на концах) с клетками плоскости
Или в 2D пересечение эллипса (сечение цилиндра плоскостью) с клетками
Строишь эллипс
Строишь ограничивающий его прямоугольник (одна сторона вдоль большой оси эллипса)
Смотришь в какую клетку попала одна вершина (просто берешь floor(X,Y)/размер клетки)
Идешь от нее вдоль стороны методом Брезенхэма, т.е. к следующему ближайшему пересечению с OX или OY, так до конца стороны, потом следующую сторону итд
Осталось проверить полученные клетки против эллипса или сферы

oor(x)+1}, Y=={floor(y),floor(y)+1}
Проверка квадрата против цилиндра/сферы - проверить его ближайшую вершину
c+ex*fabs(dot(ex,d))+ey*fabs(dot(ey,d)) на вхождение в цилиндр/сферу
Здесь c - центр квадрата, ex,ey-вектора его сторон, d-нормированное направление из центр квадрата в центр сферы/перпендикуляр на ось цилиндра

Получается все же громоздко, может лучше проверять против окружностей в центрах клеток

У тебя все вопросы по геометрии. Что пишешь-то?

#5
20:15, 24 мар. 2021

Рендерферма кроликов
> Что пишешь-то?
Обработку коллизий. Конкретно тут - что-то типа sphere cast.

#6
(Правка: 21:10) 21:03, 24 мар. 2021

Вот дистанция до плоскости:

+ Показать

WorldPos - любая точка в пространстве
WorldNormal- нормаль в сторону плоскости
PlaneCenter - центр плоскости
PlaneNormal - нормаль плоскости

Потом рэйкаст в точку на плоскости:

+ Показать

Можно пройтись по ребрам цилиндра и пульнуть все лучики от ребер в плоскость.
По координатам найдете пересечение.

#7
9:48, 25 мар. 2021

Просто же: если высота сферы совпала с высотой плоскости, то позиция сферы минус позиция плоскости. Если результат больше плоскости, или отрицательный, значит не попали. А так получили искомый результат.

#8
11:30, 25 мар. 2021

eDmk
У плоскости только одна нормаль xD
DistanceToPlane := Dot(Pos-AnyPlanePoint, PlaneNormal);

#9
11:38, 25 мар. 2021

AlexeyLarin
Нет, проще:
Строишь эллипс
Строишь ограничивающий его прямоугольник (одна сторона вдоль большой оси эллипса)
Смотришь в какую клетку попала одна вершина (просто берешь floor(X,Y)/размер клетки)
Идешь от нее вдоль стороны методом Брезенхэма, т.е. к следующему ближайшему пересечению с линией сетки, параллельной OX или OY, так до конца стороны, потом следующую сторону итд
Получая пересечение с линией сетки, составляешь уравнение для эллипса и находишь две точки пересечения - все углы сетки между ними внутри и два ближайших угла снаружи - это углы пересеченных клеток плоскости
Могу расписать код - но это уже работа

#10
14:36, 25 мар. 2021

Рендерферма кроликов
>У плоскости только одна нормаль xD
Это да, а вот сфера может лететь по любой другой нормали.

Тут все дело в индивидуальном случае:
1. В вашем - распределение функции от нуля и до бесконечности.
2. В моей - функция ограничена (например координатами 2-х плоскостей).

#11
15:11, 25 мар. 2021

eDmk
> Это да, а вот сфера может лететь по любой другой нормали
Лолшто? Не по номали, а направлению и причем оно тут? Надо найти интервал времени, пока сфера пересекает плоскость, ну и дальше написал выше

#12
16:09, 25 мар. 2021

Рендерферма кроликов
> Строишь эллипс
> Строишь ограничивающий его прямоугольник (одна сторона вдоль большой оси
> эллипса)
> Смотришь в какую клетку попала одна вершина (просто берешь floor(X,Y)/размер
> клетки)
> Идешь от нее вдоль стороны методом Брезенхэма, т.е. к следующему ближайшему
> пересечению с линией сетки

Что-то слишком много. Предлагаю пойти по такому пути - поскольку нам достоверно известно, что сечение - эллипс, и известен наклон большой полуоси и эксцентриситет, мы можем мысленно исказить плоскость так, чтоб эллипс превратился в круг. Фактически это простое линейное преобразование, линейно сжимающее плоскость вдоль большой полуоси эллипса во столько раз, во сколько большая полуось больше маленькой, и еще для простоты - сдвинуть все это дело так, чтоб окружность оказалась в центре координат.

При этом клетки, покрывающие плоскость, превратятся в параллелепипеды. Но сами клетки даже не важны, важны лишь их стороны, которые на не искаженной плоскости имеют уравнения x = N и y = M (где N и M - целое), а на искаженной плоскости примут уравнения прямых общего вида на плоскости kh1*x + kh2*y = kh3*N и kv1*x + kv2*y = kv3*M (сходу не соображу про коэффициенты, но пораскинув мозгами найти их можно). Далее остается найти диапазоны целочисленных N таких, чтоб образованные с их помощью прямые пересекали окружность, то есть проходили от центра координат на расстоянии не более R (радиус летящего шара, он же малая полуось эллипса, он же радиус окружности на "искаженной" плоскости).

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

#13
16:42, 25 мар. 2021

Dmitry_Milk
Нет, клетки превратятся в ромбы, т.к проекция директриссы сферы не обязательно параллельна Ox/Oy. Лучше рассмотреть повернутый прямоугольник, нормально по скорости

#14
16:46, 25 мар. 2021

Рендерферма кроликов
> Надо найти интервал времени
САБЖ: Нужно определить какие клетки при полете пересечет сфера, т.е. найти точки пересечения.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее