In einer Matrix den Schwrpunkt bestimmen (Ideee?)

Hallo,

Ich wollte mal demnächst eine Grafikroutine programmieren und breuchte eine Routine zur Schwerpunktbestimmung in einer Matrix:

Zum besseren verständnis:

Eine Matrix sieht folgendermaßen aus:

01000
01100
01000

als Ergebniss wollte ich dann gerne eine Matrix die den Schwerpunkt aller " 1" 'en in obriger Martix zusammenfasst in einen Punkt ähnlich diesem hier:

00000
01000
00000

Es reicht mir wenn ich das Prinzip zur zusammenfassung verstehe…

(PS.: Ich wollte eine Rutine in C++ basteln)

Ich danke schon mal im Vorraus (Nick)

Tjo da wurden schon Dissertationen drüber geschrieben. Du kannst Dir ja mal das PDF Dokument durchlesen
http://www.sts.tu-harburg.de/~mi.skusa/Studienarbeit…

das geht zwar über 3D, bringt jedoch auch Querverweise auf diese Seite (diese Publikationen sind auch im 2D Bereich, jedoch auf Englisch)
http://kogs-www.informatik.uni-hamburg.de/~frantz/pu…

Wie Du anhand der Ausführungen (ich habe sie nur überflogen) ist es nicht so einfach diese Funktionen zu programmieren - okay hier geht es um den medizinischen Bereich mit Graustufen, d. h. auch die einzelnen Werte der Matrix sind ausschlaggebend, das weiß ich jetzt nicht, wie es bei deiner Aufgabe ist, da Du ja nur mit 0/1 gearbeitet hast.
Eine Möglichkeit wäre Spalte für Spalte und Zeile für Zeile zu gewichten, problematisch ist, dass aber die anliegenden Spalten, bzw. Zeilen ja auch „Gewicht“ erzeugen. Ich denke da nochmal drüber nach, vielleicht fällt mir ja noch was besseres ein.

Lösung?
so ich habe mich jetzt mal etwas damit beschäftigt und würde eine Lösung mit Hilfe des Satzes von Pythagoras anstreben, in der Vektorisierung bin ich nicht so fit.

Dein Beispiel ist leider etwas „eindeutig“.

Jedes Feld hat ja ein „Gewicht“ zu tragen, je mehr Felder in einem Bereich besetzt sind, desto mehr Gewicht wird hier erzeugt. Beispielhaft könnte man von einem Tuch ausgehen, auf dem Kugeln verteilt sind. Jede Kugel beult das Tuch an seiner Stelle aus, je mehr Kugeln sich irgendwo anhäufen, desto mehr wird das Tuch durchgedrückt (somit würden alle Kugeln an diese Stelle laufen).

Wie soll man es nun berechnen, wo diese Stelle ist. Ich habe es mir mal bildlich aufgezeichnet und bin so auf den Satz von Pythagoras gekommen, der sagt ja aus, dass das Quadrat der Hypothenuse gleich der Summe der Quadrate der Katheten ist (c²= a² + b²).

Somit habe ich im Endeffekt für jede Position auf der Matrix „Dreiecke“ angelegt, die ich ja gewichten musste. Sicherlich kommen bei den Dreiecken auch Berechnungen wie c² = 0² + 0² raus, aber das tat der Lösung wohl keinen Abbruch.
Wie bin ich auf Entfernungen / Gewichtung gekommen. Ich habe einfach die Entfernung x/y = Zeile/Spalte berechnet und folgende Werte erhalten:

 9.1137 11.5858 10.3497 7.5213 3.9961 
10.1716 13.0000 12.1716 8.5279 4.6755 
 9.1137 11.5858 10.3497 7.5213 3.9961

Diese Wertetabelle findest Du auch nochmal auf http://www25.brinkster.com/nastydream/matrix2.htm

Eine 8x8 Matrix mit zufällig generierten Feldern findest Du unter
http://www25.brinkster.com/nastydream/matrix.htm

Ob der ermittelte Schwerpunkt jetzt stimmt, das habe ich noch nicht prüfen können. Gegebenfalls findest Du ja noch bessere Lösungswege in den bereits geposteten Links.

Gruß
Christian

so ich habe mich jetzt mal etwas damit beschäftigt und würde
eine Lösung mit Hilfe des Satzes von Pythagoras

Leider kann ich nicht so ganz nachvollziehen woher die Werte der Tabelle kommen.
Könntest Du mir vielleicht anhand des obersten linken Wertes (9,1…) erklären, wie Du darauf gekommen bist???

Danke schonmal…

(NICK)

Lösung?
Ich habe die Routine jetzt nochmals geändert und dadurch kommen andere Werte heraus:

17,200792856081230 20,787272170572166 18,980406387751745 15,482605577751233 12,275597653173958 
18,186912597118443 21,601281509114308 19,775223804844458 16,453743238047263 13,505046212075653 
17,200792856081230 20,787272170572166 18,980406387751745 15,482605577751233 12,275597653173958

auf den Wert in (1,1) komme ich wie folgt:
(1|1) - (1|2) = (0|1)
(1|1) - (2|2) = (1|1)
(1|1) - (2|3) = (1|2)
(1|1) - (3|2) = (2|2)

Die Vektorwerte habe ich in der Berechnung fett gekennzeichnet:
sqrt((3- 0 )^2 + (5- 1 )^2) + sqrt((3- 1 )^2 + (5- 1 )^2) + sqrt((3- 1 )^2 + (5- 2 )^2) + sqrt((3- 2 )^2 + (5- 1 )^2)
= sqrt(3^2 + 4^2) + sqrt(2^2 + 4^2) + sqrt(2^2 + 3^2) + sqrt(1^2 + 4^2)
= sqrt(25) + sqrt(20) + sqrt(13) + sqrt(17)
= 5,000000000000000 + 4,472135954999579 + 3,605551275463989 + 4,123105625617661
= 17,200792856081229235758978460907

Du kannst es Dir auch nochmal genau auf http://www25.brinkster.com/nastydream/matrix1.htm ansehen, dort sind die Berechnung für alle Felder aufgeführt.

Gruß
Christian

Es geht auch einfacher…
Hallo,

Ich denke das ganze ist eigentlich viel zu kompliziert gedacht, ich habe mir noch einmal die ganze Sache durch den Kopf gehen lassen und folgende „EINFACHE“ Lösung gefunden:

Man Nummeriert die Spalten und Zeilen einfach durch oben Links in der Matrix ist Zeile 1 und Spalte 1
und unten Rechts ist Zeile 4 und Spalte 4

Martix:

Spalte 1 2 3 4
Zeile 1 0 1 0 0
Zeile 2 1 1 1 0
Zeile 3 1 1 0 0
Zeile 4 0 0 0 0

Nun kommt man auf den Schwerpunkt aller Spalten, in dem man alle gesetzen Spalten addiert und durch die Anzahl gesetze Spalten dividiert

Bsp (s. oben)

Schwerpunkt Spalte:

(1*2)+(1*1)+(1*2)+(1*1) Dividiert durch 4 gestezte Spalten ergibt 1,5
Schwerpunkt Zeile:

(1*2)+(1*3)+(1*1)+(1*2) Dividiert durch 4 gestezte Spalten ergibt 2

Also ist der Schwerpunkt auf Position Zeile 2 und Spalte 1,5 (kann ja gerundet werden)

MFG (Nick)

Hi Nick,

wie wär’s, wenn Du, anstatt Dir irgendwelches Zeug auszudenken, einfach die physikalische Definition des Schwerpunktes zugrundelegen würdest? Eine solche gibt es nämlich und als Maschinenbautechniker könntest Du sie sogar kennen.

Wenn Du n Lötpunkte auf die x-Achse lötest (Massen m[i], Positionen x[i], i = 1…n), dann ist der Schwerpunkt xS der ganzen Chose gegeben durch

 Summe x[i] m[i] 
xS = ----------------- (Summation über i := 1...n)
 Summe m[i] 

Ich hoffe, Du kannst das korrekt auf Dein Matrix-Problem übertragen. Wenn noch was unklar ist, poste hier.

Gruß
Martin