Für die Vektorrechnung habe ich die Funktionen in einem Unterprogramm vektor.c zusammengefasst.
// Funktionen für die Vektor Rechnung // // Matthias Busse 1.10.2018 Version 1.0 // Inhalt: // vAdd(v1, v2, v3) : v1+v2=v3 // vSub(v1, v2, v3) : v1-v2=v3 // vMultF(v1, f, v2) : v1*f=v2 // f=vBetrag(v1) : |v1|=f // f=vSkalarprodukt(v1, v2) : v1 * v2=f // f=vWinkelGrad(v1, v2) : Winkel zwischen v1 und v2 in Grad // vVektorprodukt(v1, v2, v3) : v1 x v2 = v3 // vEinheitsvektor(v1, v2) : v1 / |v1| = v2, Länge=1 // vRichtungscosinusX(v1) : v1 Winkel zur X-Achse in Grad // vRichtungscosinusY(v1) : v1 Winkel zur Y-Achse in Grad // vRichtungscosinusZ(v1) : v1 Winkel zur Z-Achse in Grad // z | // | // | // ---------- y // / // x / void vAdd(float v1[3], float v2[3], float v3[3]) { // Vektoren Addieren v1+v2=v3 // Matthias Busse Version 1.0 vom 30.9.2018 v3[0]=v1[0]+v2[0]; v3[1]=v1[1]+v2[1]; v3[2]=v1[2]+v2[2]; } void vSub(float v1[3], float v2[3], float v3[3]) { // Vektoren Subtrahieren v1-v2=v3 // Matthias Busse Version 1.0 vom 30.9.2018 v3[0]=v1[0]-v2[0]; v3[1]=v1[1]-v2[1]; v3[2]=v1[2]-v2[2]; } void vMultF(float v1[3], float z, float v2[3]) { // Vektor multiplizieren mit Zahl v1*z=v2 // Matthias Busse Version 1.0 vom 30.9.2018 v2[0]=v1[0]*z; v2[1]=v1[1]*z; v2[2]=v1[2]*z; } float vBetrag(float v1[3]) { // Vektor Betrag (Länge) von v1 oder |v1|=z // Matthias Busse Version 1.0 vom 30.9.2018 float z; z=sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]); return z; } float vSkalarprodukt(float v1[], float v2[]) { // Vektoren Skalar multiplizieren v1 * v2 = z // |V1| * |V2| * cos winkel_dawischen = z // Wenn das Ergebis 0 ist, dann sind die Vektoren senkrecht zueinander // Matthias Busse Version 1.0 vom 30.9.2018 float z; z= (v1[0]*v2[0]) + (v1[1]*v2[1]) + (v1[2]*v2[2]); return z; } float vWinkelGrad(float v1[], float v2[]) { // Den Winkel in Grad zwischen zwei Vektoren berechnen // Matthias Busse Version 1.0 vom 30.9.2018 float z, w; z=vSkalarprodukt(v1, v2); w = z / vBetrag(v1) / vBetrag(v2); return acos(w)*57.296; // Rad zu Grad } void vVektorprodukt(float v1[3], float v2[3], float v3[3]) { // Vektorprodukt v1 x v2 = v3 // v3 steht senkrecht auf v1 und v2 // v3 Betrag |v3| ist die Fläche vom v1 und v2 Parallelogramm // Winkel zwischen v1 und v2 ist // |v1 x v2| = |v3| = |A| * |B| * sin winkel_dawischen // Matthias Busse Version 1.0 vom 30.9.2018 v3[0]= (v1[1]*v2[2]) - (v1[2]*v2[1]); v3[2]= (v1[0]*v2[1]) - (v1[1]*v2[0]); v3[1]= -1.0 * ((v1[0]*v2[2]) - (v1[2]*v2[0])); } void vEinheitsvektor(float v1[3], float v2[3]) { // Einheitsvektor v1 / |v1| = v2 // Ergibt den Vektor mit der Länge 1 // Matthias Busse Version 0.1 vom 01.10.2018 float betrag; betrag=vBetrag(v1); v2[0]=v1[0]/betrag; v2[1]=v1[1]/betrag; v2[2]=v1[2]/betrag; } float vRichtungscosinusX(float v1[3]) { // Der RichtungskosinusX bildet den Winkel zwischen dem Vektor und der X Achse // cos(w) = vx / |v| // Matthias Busse Version 1.0 vom 01.10.2018 float winkel; winkel=acos(v1[0]/vBetrag(v1)); return winkel*57.296; // Rad zu Grad } float vRichtungscosinusY(float v1[3]) { // Der RichtungskosinusY bildet den Winkel zwischen dem Vektor und der Y Achse // cos(w) = vy / |v| // Matthias Busse Version 1.0 vom 01.10.2018 float winkel; winkel=acos(v1[1]/vBetrag(v1)); return winkel*57.296; // Rad zu Grad } float vRichtungscosinusZ(float v1[3]) { // Der RichtungskosinusZ bildet den Winkel zwischen dem Vektor und der Z Achse // cos(w) = vz / |v| // Matthias Busse Version 1.0 vom 01.10.2018 float winkel; winkel=acos(v1[2]/vBetrag(v1)); return winkel*57.296; // Rad zu Grad }
Hier das Programm um die Vektor Funktionen zu testen.
Weiterlesen