<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Möglichst schneller Range check]]></title><description><![CDATA[<p>Ich hab eine Methode, die sieht ungefähr so aus</p>
<pre><code class="language-cpp">void modify(int x,int y,int maxX, int maxY,int radius){
...
}
</code></pre>
<p>Es gibt vier kombinationen der Parameter -&gt;<br />
x - radius &amp;&amp; y - radius<br />
x - radius &amp;&amp; y + radius<br />
x + radius &amp;&amp; y - radius<br />
x + radius &amp;&amp; y + radius</p>
<p>Die 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 &gt; 0, x + radius &lt; 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.<br />
Gibt es da eine bessere Möglichkeit? Man kann die Ifs auch Schachteln, aber viel besser wird es dadurch ja nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199984/möglichst-schneller-range-check</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 23:47:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199984.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Dec 2007 13:01:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 13:01:07 GMT]]></title><description><![CDATA[<p>Ich hab eine Methode, die sieht ungefähr so aus</p>
<pre><code class="language-cpp">void modify(int x,int y,int maxX, int maxY,int radius){
...
}
</code></pre>
<p>Es gibt vier kombinationen der Parameter -&gt;<br />
x - radius &amp;&amp; y - radius<br />
x - radius &amp;&amp; y + radius<br />
x + radius &amp;&amp; y - radius<br />
x + radius &amp;&amp; y + radius</p>
<p>Die 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 &gt; 0, x + radius &lt; 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.<br />
Gibt es da eine bessere Möglichkeit? Man kann die Ifs auch Schachteln, aber viel besser wird es dadurch ja nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417534</guid><dc:creator><![CDATA[Fragment]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 13:40:16 GMT]]></title><description><![CDATA[<p>Da läßt sich nicht viel optimieren, da die Abfragen jeweils von den Parametern abhängig sind, d.h. du hast keine Konstanten.<br />
Du könntest höchstens die jeweiligen Summen bzw. Differenzen nur einmalig berechnen und in lokale Variablen speichern:</p>
<pre><code class="language-cpp">const int x1 = x - radius;
const int x2 = x + radius;
const int y1 = y - radius;
const int y2 = y + radius;

if(x1 &gt; 0 &amp;&amp; y1 &gt; 0)
  ...

if(x1 &gt; 0 &amp;&amp; y2 &lt; maxY)
  ...

if(x2 &lt; maxX &amp;&amp; y1 &gt; 0)
  ...

if(x2 &lt; maxX &amp;&amp; y2 &lt; maxY)
  ...
</code></pre>
<p>Ein guter Compiler würde das aber wahrscheinlich im Release-Modus ebenfalls so optimieren.<br />
Und bist du denn sicher, daß dies ein Bottle-Neck deines Programms ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417555</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 13:56:58 GMT]]></title><description><![CDATA[<p>kennst du die KreisGleichung?</p>
<p>x²+y²=r²</p>
<p>wenn der Kreis im KoordinatenSystem verschoben ist dann:</p>
<p>(x-x<sub>0</sub>)<sup>2</sup>+(y-y<sub>0</sub>)<sup>2</sup>=r<sup>2</sup></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417563</guid><dc:creator><![CDATA[gorgoyle]]></dc:creator><pubDate>Sun, 09 Dec 2007 13:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 14:12:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14585">@gorgoyle</a>: was hat das jetzt mit der Funktion zu tun?<br />
Er will mit der Funktion ja nur checken, ob die vier Kreissegmente (x+/-r, y+/-r) innerhalb bestimmter Werte (z.B. des Fensters) liegen.</p>
<p>Und bei meiner Lösung könnte man jeweils die ersten beiden und die letzten beiden Abfragen auch noch schachteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417569</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 09 Dec 2007 14:12:37 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 14:45:51 GMT]]></title><description><![CDATA[<p>darf ich das so verstehen: er will prüfen ob ein kreis innerhalb einer Box liegt?</p>
<p>da lässt sich wirklich nicht viel machen .. ausser vll.: =&gt; moment</p>
<pre><code>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&gt;0;
const bool c2 = y1&gt;0;
const bool c3 = x2&lt;maxX;
const bool c4 = y2&lt;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? :)
</code></pre>
<p>gibt es ein performance-problem?<br />
oder scheint dir diese Lösung nicht &quot;schön&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417585</guid><dc:creator><![CDATA[gorgoyle]]></dc:creator><pubDate>Sun, 09 Dec 2007 14:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 14:33:03 GMT]]></title><description><![CDATA[<p>Th, Bottleneck nicht, ich habe mich nur gefragt, ob es einen besseren Weg gibt, den ich noch nicht kenne.</p>
<p>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</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417589</guid><dc:creator><![CDATA[Fragment]]></dc:creator><pubDate>Sun, 09 Dec 2007 14:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to Möglichst schneller Range check on Sun, 09 Dec 2007 14:53:15 GMT]]></title><description><![CDATA[<p>Wenn die Werte nicht negativ werden dürfen, würde ich unsigned-Werte vorschlagen. Dann brauchst du auch nur eine Abfrage auf x&lt;sonstwas, da du ja nicht mehr auf &lt;0 zu prüfen brauchst. Wenn ein negativer Wert rauskommen <em>würde</em>, dann gibts nen Overflow (oder sowas) und in deiner Zahl steht ein immens großer Wert drin, der bei der Prüfung auf x&lt;sonstwas ja nicht durchkommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
edit: Oh Mist, ist hier glaubich nicht wirklich anwendbar, bzw bringt doch nix, weil du ja trotzdem x+r und x-r checken musst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417601</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 09 Dec 2007 14:53:15 GMT</pubDate></item></channel></rss>