title: Rotate point around vector 3d
body: <p>I want to rotate a P3 (that is somewhere near) around a vector (that intersects P1 and P2) by x degrees.</p>
  
  <p>P1 and P2 are 2 points that are intersected by vector(line) e from image. I've researched and searched a lot and found some good materials, but my trigonometry skills are so poor. I need this for PAWN (small), here i have some code, but doesn't really work as intended. If anyone can help me, i'll be very thankful :)</p>
  
  <p>Image link: <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Euler_AxisAngle.png/220px-Euler_AxisAngle.png" rel="nofollow">http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Euler_AxisAngle.png/220px-Euler_AxisAngle.png</a></p>
  
  <p>P1 / P2 / P3 = (x,y,z)</p>
  
  <pre><code>float vec[3];
  SubtractVectors(P1, P2, vec);
  
  float newp[3];
  float rotation[4][4];
  SetupMatrix(90.0, vec, rotation);
  MultiplyMatrix(P3, rotation, newp);
  </code></pre>
  
  <p>//---------------------------------</p>
  
  <pre><code>stock void MultiplyMatrix(float input[3], float rotation[4][4], float output[3])
  {
      float input2[4];
      input2[0] = input[0];
      input2[1] = input[1];
      input2[2] = input[2];
      input2[3] = 1.0;
  
      float output2[4];
      for(int i = 0 ; i &lt; 4 ; i++)
      {
          for(int j = 0 ; j &lt; 4 ; j++)
          {
              output2[i] += rotation[i][j] * input2[j];
          }
      }
  
      output[0] = output2[0];
      output[1] = output2[1];
      output[2] = output2[2];
  }
  
  stock void SetupMatrix(float angle, float vector[3], float rotation[4][4])
  {
      float L = (vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
      angle = angle * M_PI / 180.0;
      float u2 = vector[0] * vector[0];
      float v2 = vector[1] * vector[1];
      float w2 = vector[2] * vector[2];
  
      rotation[0][0] = (u2 + (v2 + w2) * Cosine(angle)) / L;
      rotation[0][1] = (vector[0] * vector[1] * (1 - Cosine(angle)) - vector[2] * SquareRoot(L) * Sine(angle)) / L;
      rotation[0][2] = (vector[0] * vector[2] * (1 - Cosine(angle)) + vector[1] * SquareRoot(L) * Sine(angle)) / L;
      rotation[0][3] = 0.0; 
  
      rotation[1][0] = (vector[0] * vector[1] * (1 - Cosine(angle)) + vector[2] * SquareRoot(L) * Sine(angle)) / L;
      rotation[1][1] = (v2 + (u2 + w2) * Cosine(angle)) / L;
      rotation[1][2] = (vector[1] * vector[2] * (1 - Cosine(angle)) - vector[0] * SquareRoot(L) * Sine(angle)) / L;
      rotation[1][3] = 0.0; 
  
      rotation[2][0] = (vector[0] * vector[2] * (1 - Cosine(angle)) - vector[1] * SquareRoot(L) * Sine(angle)) / L;
      rotation[2][1] = (vector[1] * vector[2] * (1 - Cosine(angle)) + vector[0] * SquareRoot(L) * Sine(angle)) / L;
      rotation[2][2] = (w2 + (u2 + v2) * Cosine(angle)) / L;
      rotation[2][3] = 0.0; 
  
      rotation[3][0] = 0.0;
      rotation[3][1] = 0.0;
      rotation[3][2] = 0.0;
      rotation[3][3] = 1.0;
  }
  </code></pre>