Schlagwort-Archive: Vektor

Arduino Funktionen zur Vektor Rechnung

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