以下は、次の言語のこの関数の基本的な実装です。

#include <math.h>

struct matrix3 {
  フロートX [3] [3];
};

struct point3 {
  フロートX、Y、Z;
};

struct matrix3 matrixfromnormal（struct point3垂直）{
  struct matrix3の結果;

  float length = sqrt（normal.x * normal.x + normor.y * normor.y + normor.z * normal.z）;
  float invlength = 1.0f / length;

  result.x [0] [0] = normal.x * invlength;
  result.x [0] [1] = normal.y * invlength;
  result.x [0] [2] = normal.z * invlength;

  result.x [1] [0] = -normal.y * invlength;
  result.x [1] [1] = normal.x * invlength;
  result.x [1] [2] = 0;

  result.x [2] [0] = -normal.z * invlength;
  result.x [2] [1] = 0;
  result.x [2] [2] = normal.x * invlength;

  返品結果;
}



この実装は、入力ベクトルがゼロに等しくなく、ゼロベクトルではないことを示唆していることに注意してください。使用の場合に可能な場合、これらのケースを処理するために追加のコードを追加する必要がある場合があります。
Вот базовая реализация этой функции на языке С:

#include <math.h>

struct matrix3 {
  float x[3][3];
};

struct point3 {
  float x, y, z;
};

struct matrix3 MatrixFromNormal(struct point3 normal) {
  struct matrix3 result;

  float length = sqrt(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z);
  float invLength = 1.0f / length;

  result.x[0][0] = normal.x * invLength;
  result.x[0][1] = normal.y * invLength;
  result.x[0][2] = normal.z * invLength;

  result.x[1][0] = -normal.y * invLength;
  result.x[1][1] = normal.x * invLength;
  result.x[1][2] = 0;

  result.x[2][0] = -normal.z * invLength;
  result.x[2][1] = 0;
  result.x[2][2] = normal.x * invLength;

  return result;
}



Обратите внимание, что эта реализация предполагает, что входной вектор нормали не равен нулю и не является нулевым вектором. Вам может потребоваться добавить дополнительный код для обработки этих случаев, если они возможны в вашем случае использования.