Möglichst schneller Range check
-
Ich hab eine Methode, die sieht ungefähr so aus
void modify(int x,int y,int maxX, int maxY,int radius){ ... }Es gibt vier kombinationen der Parameter ->
x - radius && y - radius
x - radius && y + radius
x + radius && y - radius
x + radius && y + radiusDie werden in ein Array/Objekt (irrelevabt) geschrieben, das Problem ist, jedes der 4 Einträge soll nur dann geschrieben werden, wenn ein Range check statt gefunden hat, so muss x-radius > 0, x + radius < maxX und das gleiche für Y. Wenn ich nun aber jede Zeile so checke, hab ich das Problem, dass ich 4 mal ifs mit 2 Bedingungen habe und ich suche einen weg, dies irgendwie weg zu optimieren, leider kann ich den Methoden aufruf nicht beschränken um den Range check wegfallen zu lassen.
Gibt es da eine bessere Möglichkeit? Man kann die Ifs auch Schachteln, aber viel besser wird es dadurch ja nicht
-
Da läßt sich nicht viel optimieren, da die Abfragen jeweils von den Parametern abhängig sind, d.h. du hast keine Konstanten.
Du könntest höchstens die jeweiligen Summen bzw. Differenzen nur einmalig berechnen und in lokale Variablen speichern:const int x1 = x - radius; const int x2 = x + radius; const int y1 = y - radius; const int y2 = y + radius; if(x1 > 0 && y1 > 0) ... if(x1 > 0 && y2 < maxY) ... if(x2 < maxX && y1 > 0) ... if(x2 < maxX && y2 < maxY) ...Ein guter Compiler würde das aber wahrscheinlich im Release-Modus ebenfalls so optimieren.
Und bist du denn sicher, daß dies ein Bottle-Neck deines Programms ist?
-
kennst du die KreisGleichung?
x²+y²=r²
wenn der Kreis im KoordinatenSystem verschoben ist dann:
(x-x0)2+(y-y0)2=r2
-
@gorgoyle: was hat das jetzt mit der Funktion zu tun?
Er will mit der Funktion ja nur checken, ob die vier Kreissegmente (x+/-r, y+/-r) innerhalb bestimmter Werte (z.B. des Fensters) liegen.Und bei meiner Lösung könnte man jeweils die ersten beiden und die letzten beiden Abfragen auch noch schachteln.
-
darf ich das so verstehen: er will prüfen ob ein kreis innerhalb einer Box liegt?
da lässt sich wirklich nicht viel machen .. ausser vll.: => moment
const int x1 = x - radius; const int x2 = x + radius; const int y1 = y - radius; const int y2 = y + radius; //vergleiche sichern const bool c1 = x1>0; const bool c2 = y1>0; const bool c3 = x2<maxX; const bool c4 = y2<maxY; //bedingungen verschachteln if (c1) { if (c2) {...} if (c4) {...}} if (c3) { if (c2) {...} if (c4) {...}} //glaub nicht dass das performanter läuft denn wo sollen die register herkommen? :)gibt es ein performance-problem?
oder scheint dir diese Lösung nicht "schön"?
-
Th, Bottleneck nicht, ich habe mich nur gefragt, ob es einen besseren Weg gibt, den ich noch nicht kenne.
gorgoyle, radius wird in dem Zusammenhang nicht als Kreis benutzt, sondern dazu, ein Quadrat zu erzeugen, dass den Kreis umspannt, dieses Quadrat darf nur keine negativen Werte haben, als auch keine die über ein Maximum hinaus gehen
-
Wenn die Werte nicht negativ werden dürfen, würde ich unsigned-Werte vorschlagen. Dann brauchst du auch nur eine Abfrage auf x<sonstwas, da du ja nicht mehr auf <0 zu prüfen brauchst. Wenn ein negativer Wert rauskommen würde, dann gibts nen Overflow (oder sowas) und in deiner Zahl steht ein immens großer Wert drin, der bei der Prüfung auf x<sonstwas ja nicht durchkommt

edit: Oh Mist, ist hier glaubich nicht wirklich anwendbar, bzw bringt doch nix, weil du ja trotzdem x+r und x-r checken musst