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.
Das Unterprogramm wird mit #include „vektor.c“ eingebunden, da es im selben Verzeichnis liegt.
Die Ausgabe erfolgt auf der Konsole.

// Vektorrechnung, Funktionen Testprogramm
//
// Matthias Busse vom 1.10.2018

#include "vektor.c"

float va[3]={1,3,2}; // Vektor A mit x, y, z
float vb[3]={2,-1,4}; // x, y, z
float vc[3];
float f;

void setup() {
  Serial.begin(38400);
}

void loop() {
  Serial.print("Vektor A "); printVektor(va); 
  Serial.print("Vektor B "); printVektor(vb);
  Serial.println("Die Rechnungen :");
  vAdd(va, vb, vc);
  Serial.print(" A + B = "); printVektor(vc);
  vSub(va, vb, vc);
  Serial.print(" A - B = "); printVektor(vc);
  vMultF(va, 3.0, vc);
  Serial.print(" A * 3.0 = "); printVektor(vc);
  f=vBetrag(va);
  Serial.print("Betrag von A : |A| = "); Serial.println(f);
  f=vSkalarprodukt(va,vb);
  Serial.print("Skalarprodukt A * B = "); Serial.println(f);
  f=vWinkelGrad(va,vb);
  Serial.print("Winkel zwischen A und B = "); Serial.println(f);
  vVektorprodukt(va, vb, vc);
  Serial.print("Vektorprodukt A x B = "); printVektor(vc);
  vEinheitsvektor(va, vc);
  Serial.print("Einheitsvektor   "); printVektor(vc);
  f=vBetrag(vc); 
  Serial.print("Laenge = "); Serial.println(f);
  f=vRichtungscosinusX(va);
  Serial.print("Winkel A zur X-Achse = "); Serial.println(f);
  f=vRichtungscosinusY(va);
  Serial.print("Winkel A zur Y-Achse = "); Serial.println(f);
  f=vRichtungscosinusZ(va);
  Serial.print("Winkel A zur Z-Achse = "); Serial.println(f);
  Serial.print("Vektor A "); printVektor(va);
  Serial.println("-----------------------");
  delay(100000);
}

void printVektor(float v[]) {
  Serial.print("\tx:"); Serial.print(v[0]);
  Serial.print("\ty:"); Serial.print(v[1]);
  Serial.print("\tz:"); Serial.print(v[2]);
  Serial.println();
}

Und die Konsolen Ausgabe dazu

Vektor A 	x:1.00	y:3.00	z:2.00
Vektor B 	x:2.00	y:-1.00	z:4.00
Die Rechnungen :
 A + B = 	x:3.00	y:2.00	z:6.00
 A - B = 	x:-1.00	y:4.00	z:-2.00
 A * 3.0 = 	x:3.00	y:9.00	z:6.00
Betrag von A : |A| = 3.74
Skalarprodukt A * B = 7.00
Winkel zwischen A und B = 65.91
Vektorprodukt A x B = 	x:14.00	y:0.00	z:-7.00
Einheitsvektor   	x:0.27	y:0.80	z:0.53
Laenge = 1.00
Winkel A zur X-Achse = 74.50
Winkel A zur Y-Achse = 36.70
Winkel A zur Z-Achse = 57.69
Vektor A 	x:1.00	y:3.00	z:2.00
-----------------------

von Matthias Busse

Quelle: Wikipedia ,meine Formelsammlung und weitere.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.