Hi,
ich habe zwei Linien, welche durch die Koordinaten vdata.point1/vdata.point2 und vdata.point2/vdata.point3 definiert werden:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
static float get_angle(const struct laser_point *laserPoint)
{
float this_length,v_lenght;
float ll,d;
float vecX1,vecX2,vecY1,vecY2;
vecX1=(float)(vdata.point1.x-vdata.point2.x);
vecY1=(float)(vdata.point1.y-vdata.point2.y);
this_length=sqrtf((vecX1*vecX1)+(vecY1*vecY1));
vecX2=(float)(vdata.point2.x-vdata.point3.x);
vecY2=(float)(vdata.point2.y-vdata.point3.y);
v_lenght=sqrtf((vecX2*vecX2)+(vecY2*vecY2));
ll = this_length*v_lenght;
if(ll!=0.0)
{
d=(vecX1*vecX2 + vecY1*vecY2) / ll;
return acosf(d);
}
return 1.57079637F;
}
|
Mit der Funktion oben berechne ich den Winkel zwischen diesen beiden Linien. Meine Frage wäre: lässt sich da noch was in Bezug auf die Geschwindigkeit optimieren?
Der Zwischenschritt mit den Variablen vecX1, vecX2, vecY1, vecY2 dient der Übersichtlichkeit und wird vom Compiler wegoptimiert. Das Ganze läuft auf einem Embedded Device, welches maximal 32 Bit float unterstützt, deswegen gibt es hier keine doubles. Mir würden aktuell nur noch vorberechnete Tabellen für sqrtf() und acosf() einfallen, was aber auf Grund des möglichen Wertebereiches und der geforderten Genauigkeit nicht in Frage kommt.
Gibt es sonst noch Optimierungsmöglichkeiten, die ich gerade nicht sehe?
Danke!