Существует метод для явного создания перпендикулярного вектора.
Поиск компонентов с наибольшей и второй величинами.
Обменяйте эти компоненты и отменяйте самые большие.Сделать наименьший компонент ноль.Например, если для вектора V |y|>=|x|>=|z|
, то вектор P=(-y, x, 0)
перпендикулярен (отметьте произведение точек).
Чтобы сделать произвольный перпендикуляр, сгенерируйте также B = V x P
, нормализуйте P
и B
и сделайтекомбинация
R = L * P * Cos(t) + L * B * Sin(t)
, где t
- случайный угол в диапазоне 0..2*Pi
, а L
- длина, обеспечивающая угол отклонения tan(fi) = L / |V|
Теперь отклоненный вектор равен (с длиной, равнойисточник один).
D = (V + R) * |V|/|V+R|
Распределение неравномерно, если fi
равномерно в диапазоне углов конуса.Кажется, преобразование ниже должно обеспечить равномерное распределение:
L = V * tan(Sqrt(random(0..1))*FiCone)