Du musst ja nicht jedesmal, wenn Du einen Punkt analysierst, die ganze Bitmap durchgehen.
1. Ermitteln der Positionen aller Punkte und aufteilen in Schwarz/Weiß.
2. Ermitteln aller Abstände zwischen zwei Punkten (weiss ->schwarz)
3. Ermitteln der Zielwerte Min/Max/Avg für jeden weissen Punkt
Erster Durchlauf: O(h*b). h,b = Dimension des Bitmaps.
Zweiter und dritter Durchlauf: O(n*m). n= Anzahl der gefundenen weissen Punkte, m=schwarze Punkte
Ist n*m überschaubar, gehts eins-fix-drei, Im theoretischen Worstcase jedoch O((h*b)^2). Die Frage lautet jedoch: Was ist der realistische Worstcase?
Selbst bei einigen Tausend Punkten solltest Du in überschaubarer Zeit hinkommen.
Code:
For x := 0 to bitmap.width - 1 do
For y:= 0 to bitmap.height - 1 do
case Bitmap.pixel[x,y] of
White : WhitePoints.Add(x,y):
Black : BlackPoints.Add(x,y):
Foreach Point W in WhitePoints do begin
Foreach Point B in BlackPoints do
W.Distances.Add(Distance(W,B));
Output ('White Point ', W, 'Min=', W.Distance.Min, 'Max=', W.Distances.Max, 'Avg=',W.Distances.Avg);
end