Плоское уравнение из 3 точек, не возвращающее правильные значения

#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) ?