Az alábbi ábrán látható, hogy ha egy tárgy dőlésszögét már 2 irányban akarjuk meghatározni, akkor az előző oldalon tárgyalt esethez képest kicsit bonyolultabb a helyzet (a gyorsulásmérő a G gravitációs gyorsulás X, Y és Z tengely irányú komponensét méri).

De amint az alábbi képeken és a videón is látható, két atan2() függvényt alkalmazva megoldható a probléma.


(a videóhoz kattints a képre)

Processing kód:
- /*  Dolesszogmeres 2 tengely iranyaban  */ 
- import processing.serial.*;       
- int graphPosition = 0;           // teglalap kezdeti pozicioja 
- int[] vals = new int[3];         // gyorsulasmero altal mert ertekek 
- int[] maximum = new int[3];      // maximalis ertek 
- int[] minimum = new int[3];      // minimalis ertek 
- int[] mid = new int[3];        // kozepertek 
- float[] attitude = new float[3]; // szamolt dolesszog ertekek 
- float position;                   
-   
- Serial myPort;                  
- boolean madeContact = false;    
-   
- void setup ()  
- { 
-   smooth(); 
-   frameRate(30); 
-   size(400, 400, P3D);  
-   fill(204); 
-   background(255); 
-   // a kalibracioval mert maximum, minimum es kozepertekek 
-   maximum[0] = 540; 
-   minimum[0] = 180; 
-   mid[0] = 335; 
-    
-   maximum[1] = 530; 
-   minimum[1] = 170; 
-   mid[1] = 335; 
-    
-   maximum[2] = 530; 
-   minimum[2] = 170; 
-   mid[2] = 335; 
-    
-   position = width/2; 
-   PFont myFont = createFont(PFont.list()[2], 18); 
-   textFont(myFont); 
-    
-   myPort = new Serial(this, Serial.list()[2], 9600); 
-   myPort.bufferUntil('\n'); 
-   
-   fill(204); 
- } 
-   
- void draw ()  
- { 
-   background(255); 
-   translate(width / 2, height / 2, -width); 
-   if (madeContact == false)  
-   { 
-     myPort.write('m'); 
-   } 
-   
-   setAttitude(); 
-   tilt(); 
- } 
-   
- void setAttitude()  
- { 
-   for (int i = 0; i < 2; i++)  
- { 
-     attitude[i] = atan2(mid[2] - vals[2], mid[i] - vals[i]); 
-   } 
- } 
-   
- void tilt()  
- { 
-   rotateX(attitude[1] - PI/16); 
-   rotateY(attitude[0] - PI/2-0.1); 
-   
-   noStroke(); 
-   rect(-200, -100, 400, 200); 
-   stroke(0); 
-   strokeWeight(3); 
-   line(0, 0, -250, 0, 0, 250); 
-   stroke(100); 
-   line(0, 150, 0, 0, -150, 0); 
-   line(250, 0, 0, -250, 0, 0); 
- } 
-   
- void serialEvent(Serial myPort)  
- {  
-   madeContact = true; 
-   String myString = myPort.readStringUntil('\n'); 
-   
-   if (myString != null)  
- { 
-     myString = trim(myString); 
-     int sensors[] = int(split(myString, ',')); 
-     if (sensors.length >= 3)  
- { 
-       vals[0] = sensors[0]; 
-       vals[1] = sensors[1];    
-       vals[2] = sensors[2]; 
-       delay(100); 
-       myPort.write('m'); 
-     } 
-   } 
- } 
 
	    
		Értékeléshez bejelentkezés szükséges!