Das Programm ist in C# geschrieben, hier mal der wesentliche Code:
PHP-Quellcode:
private void CalcAngle(ref CalcInfo img)
{
// Flächenmomente ermitteln
double Ixy = 0,
Ixx = 0,
Iyy = 0;
for (int y = 0; y < img.Height; y++)
{
for (int x = 0; x < img.Width; x++)
{
// Über alle Pixel des Bildes iterieren
if (img.rgbValues[y * img.Width + x] == img.color) // Falls der Pixel zum Objekt gehört
{
// Momente 2. Ordnung
Ixx += (y - img.CenterY) * (y - img.CenterY); // CenterXY beschreibt den Flächenmittelpunkt
Iyy += (x - img.CenterX) * (x - img.CenterX);
Ixy += (x - img.CenterX) * (y - img.CenterY);
}
}
}
// Winkel berechnen
double phi = Math.Atan2(2 * Ixy, Iyy - Ixx);
img.Angle = -0.5 * phi;
}
Vorher muss noch der Schwerpunkt berechnet werden. Der Winkel der errechnet wird, beschreibt die Neigung der ersten Hauptachse ("Längsachse") zur Waagerechten.
Zur Lage der Hauptachsen:
http://de.wikipedia.org/wiki/Flächenträgheitsmoment