#c #math #raytracing #plane
#c #математика #трассировка лучей #плоскость
Вопрос:
В рамках эксперимента Raytracer, над которым я работаю на уроках средней школы, мне нужно сделать так, чтобы я мог получить 4 части плоского уравнения из 3 разных точек. Под 4 частями я подразумеваю в уравнении Ax By Cz = D, мне нужно найти A, B, C и D. Я понимаю математику, стоящую за этим, как ее относительно простую векторную математику, но мой код, похоже, не работает.
Функция, которую я использую для построения объекта Plane из 3 точек, выглядит следующим образом:
Plane::Plane(Vec3 A, Vec3 B, Vec3 C)
{
//Getting both vectors
Vec3 AB = B - A;
Vec3 AC = C - A;
//Cross Product
Vec3 cr = AB.cross(AC);
a = cr.getX();
b = cr.getY();
c = cr.getZ();
d = a * A.getX() b * B.getY() c * C.getZ();
}
В этом случае Vec3 — это просто векторный класс, который содержит (x, y, z), а имена функций говорят сами за себя (я надеюсь).
Пример того, что оно выводит: Если я помещу векторы (-3, 0, 1), (2, 3, 0), и (0, 2, 3) в этом я получаю следующие результаты
A = 8
B = -13
C = 1
D = -60
A, B и C в этом являются правильными, а D — нет.
Я не совсем уверен, что не так с кодом, поскольку иногда он будет корректно выводить данные по определенным векторам, иногда исправлять части, а иногда вообще ничего не исправлять, что наводит меня на мысль, что это математическая ошибка. Приветствуется любая помощь.
Комментарии:
1. Вы будете рады услышать, что вам не нужна ничья помощь, чтобы разобраться в этом, просто инструмент, который у вас уже есть: ваш отладчик! Это именно то, для чего нужен отладчик. Оно запускает вашу программу по одной строке за раз и показывает вам, что происходит. Знание того, как использовать отладчик, является обязательным навыком для каждого разработчика C , без исключений. С помощью вашего отладчика вы сможете быстро находить все ошибки в этой и всех будущих программах, которые вы пишете, без необходимости просить кого-либо о помощи. Вы уже пробовали использовать свой отладчик? Если нет, то почему бы и нет? Что вам показал ваш отладчик?
2. @SamVarshavchik Мне определенно нужно выяснить, как использовать отладчик; честно говоря, я даже не осознавал, что это такое. Спасибо за помощь! Думаю, мне еще многому предстоит научиться, прежде чем я действительно смогу назвать себя хорошим программистом.
3. Вы используете
A
иa
для обозначения разных вещей, а затем используетеA
, когда вы имеете в видуa
. Это не причина вашей ошибки, но это очень плохая привычка.
Ответ №1:
Поскольку в вашем примере значения для A, B и C получены правильно, в первую очередь следует обратить внимание на вычисление D.
При вычислении d
вы используете части трех разных векторов. Это не то, что написано в уравнении для D
. Вы хотите использовать три части из одного вектора.
d = a * A.getX() b * A.getY() c * A.getZ();
Это должно работать для любого из трех векторов.
Комментарии:
1. Это определенно полезно, но это не решает всю проблему. Возможно, мой вопрос был плохо сформулирован. Если бы я должен был использовать другой набор векторов (основной, на котором я заметил эту проблему, — это (-3, 0, 0), (0, 3, 0), (0, 0, 3)) тогда оно полностью вернет A, B и C, что делает D неправильным. Я не уверен, почему. Возможно, это проблема с моим векторным классом?
2. @NetherMan: Какие результаты вы получаете с этим {A, B, C}? С помощью ручки и бумаги я получаю a =-9, b = 9, c = 9, d = 27, что правильно.
3. @Beta вы не представляете, насколько я разочарован в себе прямо сейчас. По-видимому, калькулятор, который я использовал для вычисления этих чисел, неверен, потому что это число, которое я получал все время. Это означает, что два раза, когда я переписывал всю эту часть, я делал это из-за неисправного калькулятора. Спасибо.
4. Почему бы просто не выразить эту строку a
d = dot(cr, A)
?