§ Уравнение сферы
Сегодня рассмотрю как вычислить пересечение шара и линии, заданной параметрически.Известно, что уравнение сферы задается как . Здесь r - радиус сферы. Также, уравнение линии задается как . Здесь A - начальная позиция, а вектор - это вектор направления прямой.
Чтобы найти точку пересечения, надо x, y, z вставить в уравнение шара:
§ Раскрытие скобок
Теперь необходимо раскрыть скобки:Приведем общие множители, и получится:
Теперь известны следующие коэффициенты:
Коэффициент С можно вычислить только один раз на фрейм.
Итого, получается квадратное уравнение:
§ Решение квадратного уравнения
Чтобы решить квадратное уравнение, необходимо сначала найти дискриминант:В зависимости от того, какой будет дискриминант, такое будет количество решений:
- D < 0, решений нет, линия не имеет точки пересечения со сферой
- D = 0, решение только одно
- D > 0, решений два
§ Код
P - точка камеры, org - центр сферы, r - радиус.void render_sphere(vec3 P, vec3 org, float r) { vec3 A = {P.x - org.x, P.y - org.y, P.z - org.z}; float c = A.x*A.x + A.y*A.y + A.z*A.z - r*r; for (int y = -100; y < 100; y++) for (int x = -160; x < 160; x++) { vec3 AB = { (float)x/160, (float)y/160, 1.0 }; float a = AB.x*AB.x + AB.y*AB.y + AB.z*AB.z; float b = 2*(A.x*AB.x + A.y*AB.y + A.z*AB.z); float D = b*b - 4*a*c; pset(160 + x, 100 - y, D > 0 ? 0xffffff : 0); } }