<?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[Gleichungssystem:]]></title><description><![CDATA[<p>HI an alle!</p>
<p>ich habe folgendes problem. ich will mit c++ ein quadratisches gleichungssystem lösen.</p>
<p>und zwar ich will auf einer ebene 3 beliebige punkte auswählen und anhand dieser punkte den entsprechenden kreismittelpunkt berechnen.</p>
<p>mathematisch:<br />
geg:<br />
A(xa/ya)<br />
B(xb/yb)<br />
C(xc/yc)<br />
ges:</p>
<p>M(xm/ym)<br />
radius</p>
<p>gleichungssystem:</p>
<p>(xa-xm)<sup>2+(ya-ym)</sup>2=radius^2<br />
(xb-xm)<sup>2+(yb-ym)</sup>2=radius^2<br />
(xc-xm)<sup>2+(yc-ym)</sup>2=radius^2</p>
<p>auf dem blatt ist das kein problem nur weiß ich leider überhaupt nicht wie ich das ganze in meinen rechner als code hacken soll.</p>
<p>wäre sehr dankbar wenn mir jmd helfen könnte, da ich einfach nicht weiter komm</p>
<p>grüße<br />
Flipstar</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262383/gleichungssystem</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 15:07:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262383.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Mar 2010 09:36:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 09:36:36 GMT]]></title><description><![CDATA[<p>HI an alle!</p>
<p>ich habe folgendes problem. ich will mit c++ ein quadratisches gleichungssystem lösen.</p>
<p>und zwar ich will auf einer ebene 3 beliebige punkte auswählen und anhand dieser punkte den entsprechenden kreismittelpunkt berechnen.</p>
<p>mathematisch:<br />
geg:<br />
A(xa/ya)<br />
B(xb/yb)<br />
C(xc/yc)<br />
ges:</p>
<p>M(xm/ym)<br />
radius</p>
<p>gleichungssystem:</p>
<p>(xa-xm)<sup>2+(ya-ym)</sup>2=radius^2<br />
(xb-xm)<sup>2+(yb-ym)</sup>2=radius^2<br />
(xc-xm)<sup>2+(yc-ym)</sup>2=radius^2</p>
<p>auf dem blatt ist das kein problem nur weiß ich leider überhaupt nicht wie ich das ganze in meinen rechner als code hacken soll.</p>
<p>wäre sehr dankbar wenn mir jmd helfen könnte, da ich einfach nicht weiter komm</p>
<p>grüße<br />
Flipstar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864635</guid><dc:creator><![CDATA[Flipstar5]]></dc:creator><pubDate>Fri, 05 Mar 2010 09:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 09:51:25 GMT]]></title><description><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Umkreis" rel="nofollow">http://de.wikipedia.org/wiki/Umkreis</a></p>
<blockquote>
<p>Allgemein besitzt ein konvexes Polygon genau dann einen Umkreis, wenn die Mittelsenkrechten aller Seiten einander in einem Punkt schneiden. In diesem Fall ist der gemeinsame Punkt der Mittelpunkt des Umkreises.[..]Jedes Dreieck besitzt einen Umkreis</p>
</blockquote>
<p>Du brauchst keine quadratischen Gleichungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864641</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 05 Mar 2010 09:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 09:51:37 GMT]]></title><description><![CDATA[<p>Aus<br />
(xa-xm)<sup>2+(ya-ym)</sup>2=radius^2<br />
(xb-xm)<sup>2+(yb-ym)</sup>2=radius^2</p>
<p>folgt ja<br />
(xa-xm)<sup>2+(ya-ym)</sup>2=(xb-xm)<sup>2+(yb-ym)</sup>2</p>
<p>Das heißt: (xm,ym) ist genausoweit zu (xa,ya) entfernt wie (xb,yb). Wenn man diese Gleichung in Isolation betrachtet, dann ist die Lösungsmenge die <a href="http://www.mathepedia.de/Mittelsenkrechte_Umkreis.aspx" rel="nofollow">Mittelsenkrechte</a> der Strecke zwischen den beiden Punkten.</p>
<p>Dies kannst Du für ein anderes Punktepaar wiederholen. Der Schnittpunkt der zwei berechneten Mittelsenkrechten ist der gesuchte Kreismittelpunkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864642</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 09:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 09:55:31 GMT]]></title><description><![CDATA[<p>das problem ist nicht die mathematik bei dieser geschichte, sondern wie ich das ganze als funktion in meinem programm implementieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864644</guid><dc:creator><![CDATA[Flipstar5]]></dc:creator><pubDate>Fri, 05 Mar 2010 09:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 09:59:55 GMT]]></title><description><![CDATA[<p>Flipstar5 schrieb:</p>
<blockquote>
<p>das problem ist nicht die mathematik bei dieser geschichte, sondern wie ich das ganze als funktion in meinem programm implementieren kann.</p>
</blockquote>
<p>Woran scheitert es denn konkret? Der Plan sollte ungefähr so aussehen:<br />
- 3 Punkte abfragen<br />
- Punkte an eine Funktion übergeben<br />
- Diese Funktion implementiert die allgemeine Lösung der Formeln die du dir vorher ausgerechnet hast.<br />
- Funktion gibt gewünschte Werte zurück<br />
- ???<br />
- Profit!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864647</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Mar 2010 09:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 10:00:51 GMT]]></title><description><![CDATA[<p>Flipstar5 schrieb:</p>
<blockquote>
<p>das problem ist nicht die mathematik bei dieser geschichte</p>
</blockquote>
<p>Naja, offensichtlich war es Dir nicht bekannt, dass hier ein einfaches <em>lineares</em> Gleichungssystem rauskommt.</p>
<p>Flipstar5 schrieb:</p>
<blockquote>
<p>sondern wie ich das ganze als funktion in meinem programm implementieren kann.</p>
</blockquote>
<p>Woran hapert es denn? Kann doch nicht so schwer sein, zwei Mittelsenkrechte zu berechnen und dann den Schnittpunkt zu bestimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864648</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 10:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 10:03:32 GMT]]></title><description><![CDATA[<p>SeppJ genau das triffts...</p>
<p>und hier liegt das probelem:</p>
<p>Diese Funktion implementiert die allgemeine Lösung der Formeln die du dir vorher ausgerechnet hast.</p>
<p>wenn mir einer ein code-beispiel schreiben könnte wäre ich sehr sehr dankbar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864651</guid><dc:creator><![CDATA[Flipstar5]]></dc:creator><pubDate>Fri, 05 Mar 2010 10:03:32 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 10:06:48 GMT]]></title><description><![CDATA[<p>bitte seid nicht zu streng mit mir.<br />
ich bin was gleichungen in c++ angeht wirklich ein neuling...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864653</guid><dc:creator><![CDATA[Flipstar5]]></dc:creator><pubDate>Fri, 05 Mar 2010 10:06:48 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 10:21:03 GMT]]></title><description><![CDATA[<p>Hier mal ein Beispiel für ein anderes Problem.</p>
<p>Problemstellung:<br />
Löse die Gleichung <code>ax+b=0</code> .</p>
<p>Berechne selber allgemeine Lösung:<br />
<code>x=-b/a</code></p>
<p>Setze dies in einem Programm um:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using std::cout;
using std::cin;
using std::endl;

double solution(double a, double b)
{
  return -b/a;
}

int main()
{
  cout &lt;&lt; &quot;Dieses Programm löst ax+b=0 nach x auf.\nGeben Sie a an: &quot;;
  double a;
  cin &gt;&gt; a;
  cout &lt;&lt; &quot;Geben Sie b an: &quot;;
  double b;
  cin &gt;&gt; b;
  cout &lt;&lt; &quot;Daraus folgt x = &quot; &lt;&lt; solution(a,b) &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1864661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864661</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Mar 2010 10:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 10:22:01 GMT]]></title><description><![CDATA[<p>Tipp:</p>
<pre><code class="language-cpp">struct punkt {
  double x, y;
};

struct gerade {
  punkt p; // Ein Punkt der Geraden
  punkt r; // Richtungsvektor
};

gerade mittelsenkrechte(punkt const&amp; a, punkt const&amp; b)
{
  ...
}

punkt schnittpunkt(gerade const&amp; g1, gerade const&amp; g2)
{
  ...
}

punkt umkreismittelp(punkt const&amp; p1, punkt const&amp; p2, punkt const&amp; p3)
{
  gerade ms12 = mittelsenkrechte(p1,p2);
  gerade ms23 = mittelsenkrechte(p2,p3);
  gerade ms31 = mittelsenkrechte(p3,p1);
  gerade *g1, *g2;
  ...
  Lass g1 und g2 auf zwei der drei Mittelsenkrechten zeigen,
  die möglichst senkrecht aufeinander stehen, damit die
  Schnittpunkt-Berechnung schön genau wird.
  ...
  punkt ergebnis = schnittpunkt(*g1,*g2);
  return ergebnis;
}
</code></pre>
<p>Jetzt bist Du dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864662</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 10:22:01 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 13:24:35 GMT]]></title><description><![CDATA[<p>Mit struct oder class kann der Fragesteller noch nicht umgehen. Zum Verständnis scheint mir eine einfache Funktion <strong>double RechneMirDasAus(double x, double y, double z)</strong> zunächst oder überhaupt sinnvoll. Noch ein Hinweis: Der Begriff Gleichungssystem ist anders belegt. Aber das ist Mathematik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864737</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Fri, 05 Mar 2010 13:24:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 13:34:32 GMT]]></title><description><![CDATA[<p>Doch ich kann mit struct und class usw. umgehen, das ist kein problem. hab mich auch schon viel mit qt beschäftigt...</p>
<p>das problem ist wohl doch eher mathematisch.</p>
<p>ich dachte es gibt in c++ z.B eine möglichkeit durch eine funktion die senkrechte einer geraden zu berechnen oder den mittelpunkt einer linie, oder eine möglichkeit einen virtuellen graphen zu erstellen. ich wollte eher was in der richtung dass ich z.b 2 geradenfunktionenen (mathematisch) initialisieren kann und anschließen über irgendeine methoden den schnittpunkt ausrechnen lasse, sowas in der richtung habe ich gesucht.</p>
<p>mir ist aber klar geworden, dass ich komplezere rechnungen nur durch viele einfache einzelschritte durch meine klasse durchführen kann. ich glaube ich sollte mich nochmal mit vektoren beschäftigen, das ist nur leider sehr lange her!<br />
gtrotzdem VIELEN DANK an alle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864739</guid><dc:creator><![CDATA[Flipstar5]]></dc:creator><pubDate>Fri, 05 Mar 2010 13:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 13:58:50 GMT]]></title><description><![CDATA[<p>Die genannten Probleme lassen sich relativ leicht mit Vektoren lösen.</p>
<ul>
<li>Der Mittelpunkt zwischen zwei Punkten mit Ortsvektoren <strong>a</strong> und <strong>b</strong> befindet sich an der Position 1/2 * (<strong>a</strong> + <strong>b</strong>).</li>
<li>Einen senkrechten Richtungsvektor von (x,y) erhältst du durch (-y,x). Senkrechten zu einer Geraden gibt es allerdings unendlich viele, von daher sind zusätzliche Einschränkungen notwendig.</li>
</ul>
<p>C++ bietet keine Funktionalität für solche spezifischen Probleme. Am besten schreibst du dir eine Vektorklasse, falls du häufig mit solchen Rechnungen konfrontiert bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864743</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 05 Mar 2010 13:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 15:41:28 GMT]]></title><description><![CDATA[<p>Flipstar5 schrieb:</p>
<blockquote>
<p>das problem ist wohl doch eher mathematisch.</p>
<p>ich dachte es gibt in c++ z.B eine möglichkeit durch eine funktion die senkrechte einer geraden zu berechnen oder den mittelpunkt einer linie, oder eine möglichkeit einen virtuellen graphen zu erstellen. ich wollte eher was in der richtung dass ich z.b 2 geradenfunktionenen (mathematisch) initialisieren kann und anschließen über irgendeine methoden den schnittpunkt ausrechnen lasse, sowas in der richtung habe ich gesucht.</p>
</blockquote>
<p>so direkt gibt es das nicht, aber so ähnlich.</p>
<p>Flipstar5 schrieb:</p>
<blockquote>
<p>mir ist aber klar geworden, dass ich komplezere rechnungen nur durch viele einfache einzelschritte durch meine klasse durchführen kann.</p>
</blockquote>
<p>Nein, nicht unbedingt.</p>
<p>Flipstar5 schrieb:</p>
<blockquote>
<p>ich glaube ich sollte mich nochmal mit vektoren beschäftigen, das ist nur leider sehr lange her!</p>
</blockquote>
<p>.. das wäre allerdings Voraussetzung! Wenn Du Dir z.B. diesen <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1838131.html#1838131" rel="nofollow">Beitrag über homogene Koordinaten</a> durchliest und diese <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1108802.html#1108802" rel="nofollow">Vektor-Klasse</a> benutzt, dann weiter verstanden hast, wie man in homogenen Koordinaten die Gerade einer Mittelsenkrechten zweier Punkte bestimmt, dann kann man es im Grunde so hinschreiben, wie Du es Dir oben gewünscht hast (auf die Gefahr hin, Dich zu überfordern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &quot;Vector.h&quot; // s. http://www.c-plusplus.net/forum/viewtopic-var-p-is-1108802.html#1108802

// --   bestimmt den Vektor zu v bei dem der homogene Anteil ==1 ist
template&lt; typename T &gt;
basic_vector&lt; T &gt; homogen( const basic_vector&lt; T &gt;&amp; v )
{
    return v / Z( v );
}

// --   berechnet die Orthogonale zu v - mit dem homogenen Anteil ==0
template&lt; typename T &gt;
basic_vector&lt; T &gt; orthogonale( const basic_vector&lt; T &gt;&amp; v )
{
    return basic_vector&lt; T &gt;( -Y(v), X(v), 0 );
}

// --   berechnet die Mittelsenkrechte
template&lt; typename T &gt;
basic_vector&lt; T &gt; mittelsenkrechte( const basic_vector&lt; T &gt;&amp; a, const basic_vector&lt; T &gt;&amp; b )
{
    return ( a + b ) % orthogonale( a - b );
}

int main()
{
    using namespace std;
    Vector a( 3.0, 4.0, 1 );
    Vector b( 6.0, 9.0, 1 );
    Vector c( 13.0, 6.0, 1 );
    cout &lt;&lt; homogen( mittelsenkrechte( a, b ) % mittelsenkrechte( b, c ) ) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
<p>Edit: auf krümelkackers Hinweis hin (s.u.) Berechnung der Mittelsenkrechten (Zeile 23) vereinfacht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864756</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 05 Mar 2010 15:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 15:12:11 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// --   berechnet die Mittelsenkrechte
template&lt; typename T &gt;
basic_vector&lt; T &gt; mittelsenkrechte( const basic_vector&lt; T &gt;&amp; a, const basic_vector&lt; T &gt;&amp; b )
{
    return (( a + b ) / T(2))  %  orthogonale( b - a );
}
</code></pre>
</blockquote>
<p>Hier setzt Du aber voraus, dass a und b die gleiche homogene Komponente besitzen. Das müsste streng genommen vorher &quot;normalsiert&quot; werden -- sozusagen auf den gleichen Nenner gebracht werden.</p>
<p>Aber sonst ist das ja extrem elegant. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864775</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 15:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 15:14:00 GMT]]></title><description><![CDATA[<p>Nachtrag: Das Teilen durch T(2) ist ja eigentlich überflüssig, nicht? Die Sklalierung der Vektoren spielt ja keine Rolle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864776</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 15:14:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 15:36:20 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// --   berechnet die Mittelsenkrechte
...
</code></pre>
</blockquote>
<p>Hier setzt Du aber voraus, dass a und b die gleiche homogene Komponente besitzen. Das müsste streng genommen vorher &quot;normalsiert&quot; werden -- sozusagen auf den gleichen Nenner gebracht werden.</p>
</blockquote>
<p>das ist korrekt.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Aber sonst ist das ja extrem elegant. <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="🙂"
    /></p>
</blockquote>
<p>Danke <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="🙂"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Nachtrag: Das Teilen durch T(2) ist ja eigentlich überflüssig, nicht? Die Sklalierung der Vektoren spielt ja keine Rolle.</p>
</blockquote>
<p>Ja tatsächlich - gut erkannt. Da habe ich gar nicht dran gedacht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864795</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 05 Mar 2010 15:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 16:43:05 GMT]]></title><description><![CDATA[<p>.. ich setz' da noch einen drauf. Dazu muss ich aber die basic_vector-Klasse noch etwas aufrüsten.<br />
Ich führe einen Einheitsvektor eZ vom Typ eZ_type ein und definiere das Skalarprodukt und das Kreuzprodukt mit einem Vektor.</p>
<pre><code class="language-cpp">// Klasse für einen mathematischen Vektor in 3D
// siehe: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1108802.html#1108802
struct eZ_type {}; // Einheitsvektor in Z

namespace
{
    eZ_type eZ;
}

template&lt; typename T &gt;
class basic_vector :    boost::additive&lt; basic_vector&lt; T &gt;,
                        boost::multiplicative&lt; basic_vector&lt; T &gt;, T,
                        boost::modable&lt; basic_vector&lt; T &gt;,   // % -&gt; Kreuzprodukt
                        boost::modable&lt; basic_vector&lt; T &gt;, eZ_type   // % -&gt; Kreuzprodukt eZ
                        &gt; &gt; &gt; &gt;
{
public:
    typedef T value_type;
    // ... wie gehabt

    basic_vector&amp; operator%=( eZ_type )
    {
        const value_type tmp = m_x;
        m_x = -m_y;
        m_y = tmp;
        m_z = T(0);
        return *this;
    }
    friend basic_vector operator%( eZ_type, basic_vector v )
    {
        return -v %= eZ_type();
    }

    basic_vector operator-() const // das fehlte wohl noch im Original 
    {
        return basic_vector( -m_x, -m_y, -m_z );
    }

    friend T operator*( const basic_vector&amp; v, eZ_type ) { return v.m_z; }
    friend T operator*( eZ_type, const basic_vector&amp; v ) { return v.m_z; }

    // .. usw.
</code></pre>
<p>und dann vereinfacht sich die Berechnung des Umkreismittelpunktes zu</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &quot;Vector.h&quot; // s. http://www.c-plusplus.net/forum/viewtopic-var-p-is-1108802.html#1108802 + Erweiterung oben

// --   bestimmt den Vektor zu v bei dem der homogene Anteil ==1 ist
template&lt; typename T &gt;
basic_vector&lt; T &gt; homogen( const basic_vector&lt; T &gt;&amp; v )
{
    return v / (v * eZ);
}

// --   berechnet die Mittelsenkrechte
//      Bem.: die Klammerung von ez % (a - b) ist notwendig, da das Kreuzprodukt nicht assoziativ ist
template&lt; typename T &gt;
basic_vector&lt; T &gt; mittelsenkrechte( const basic_vector&lt; T &gt;&amp; a, const basic_vector&lt; T &gt;&amp; b )
{
    return ( a + b ) % (eZ % ( a - b ));
}

int main()
{
    using namespace std;
    Vector a( 3.0, 4.0, 1 );
    Vector b( 6.0, 9.0, 1 );
    Vector c( 13.0, 6.0, 1 );
    cout &lt;&lt; &quot;Umkreismittelpunkt von a,b,c: &quot; &lt;&lt; homogen( mittelsenkrechte( a, b ) % mittelsenkrechte( b, c ) ) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864834</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 05 Mar 2010 16:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 18:37:04 GMT]]></title><description><![CDATA[<p>Bei allem Respekt, ich finde, Du hast es mit der Überladung der Operatoren übertrieben. Dass Du % für ein Kreuzprodukt nimmst, habe ich mir denken können, aber auch nur, weil ich den Rechenweg kenne. Über das * als Skalarprodukt bin ich aber trotzdem wieder gestolpert. In 'nem Code Review hätte ich das angemeckert und <a href="http://en.wikipedia.org/wiki/Dot_product" rel="nofollow">dot</a>(x,y) und <a href="http://en.wikipedia.org/wiki/Cross_product" rel="nofollow">cross</a>(x,y) als Alternativen vorgeschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864898</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 18:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Fri, 05 Mar 2010 18:44:12 GMT]]></title><description><![CDATA[<p>...und die Funktion <code>mittelsenkrechte</code> hätte ich auch wieder angemeckert, weil nirgends ersichtlich ist, dass man ihr nur Punkte a/b geben darf, die die gleiche homogene Komponente haben. Das müsste entweder dokumentiert werden oder durch</p>
<pre><code class="language-cpp">a = homogen(a);
b = homogen(b);
</code></pre>
<p>korrekt behandelt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864903</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Mar 2010 18:44:12 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungssystem: on Sun, 07 Mar 2010 22:23:57 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Bei allem Respekt, ich finde, Du hast es mit der Überladung der Operatoren übertrieben. Dass Du % für ein Kreuzprodukt nimmst, habe ich mir denken können, aber auch nur, weil ich den Rechenweg kenne. Über das * als Skalarprodukt bin ich aber trotzdem wieder gestolpert. In 'nem Code Review hätte ich das angemeckert und <a href="http://en.wikipedia.org/wiki/Dot_product" rel="nofollow">dot</a>(x,y) und <a href="http://en.wikipedia.org/wiki/Cross_product" rel="nofollow">cross</a>(x,y) als Alternativen vorgeschlagen.</p>
</blockquote>
<p>Ich meine, dass es letztlich Geschmackssache oder Gewohnheit ist, ob man jetzt einen Operator überlädt oder eine Funktion benutzt. Das % für das Kreuzprodukt ist natürlich nicht optimal, aber in Ermangelung von Alternativen sozusagen der am besten passende Operator, der noch 'frei' war. <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1838806.html#1838806" rel="nofollow">Sebastian fand das % auch unpassend</a>, hatte aber andererseits keine Hemmung den <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1838993.html#1838993" rel="nofollow">operator/ für den Vektor im Nenner</a> zu überladen.<br />
Ich mag eben nicht so etwas in dieser Form hinschreiben: dot( cross( a, b ), c ); da ist mir die mehr mathematische Schreibweise (a%b)*c; lieber - aber wie gesagt, das ist Geschmackssache.</p>
<p>Übrigens wäre auch der Komma-Operator für das Skalarprodukt bzw. das innere Vektorprodukt geeignet, wie der von Dir angegebene Link zeigt, aber das wolltest Du mit sicher nicht mit dem Hinweis zeigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> .</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>...und die Funktion <code>mittelsenkrechte</code> hätte ich auch wieder angemeckert, weil nirgends ersichtlich ist, dass man ihr nur Punkte a/b geben darf, die die gleiche homogene Komponente haben. Das müsste entweder dokumentiert werden oder durch</p>
<pre><code class="language-cpp">a = homogen(a);
b = homogen(b);
</code></pre>
<p>korrekt behandelt werden.</p>
</blockquote>
<p>Ja ein bisschen ein kniffliges Problem. Deine vorgeschlagene Lösung ist zwar korrekt, aber irgendwie unschön, da man ja korrekterweise davon ausgehen könnte, dass a und b den selben homogenen Anteil haben. Und dann wäre das a = homogen(a); einfach überflüssig. Mir persönlich würde so etwas in der Form</p>
<pre><code class="language-cpp">// --   berechnet die Mittelsenkrechte
//      Bem.: die Klammerung von ez % (a - b) ist notwendig, da das Kreuzprodukt nicht assoziativ ist
template&lt; typename T &gt;
basic_vector&lt; T &gt; mittelsenkrechte( const basic_vector&lt; T &gt;&amp; a, const basic_vector&lt; T &gt;&amp; b )
{
    assert( abs( eZ*a - eZ*b ) &lt;= EPS ); // die Konstante EPS wäre in Abhängig der Anwendung zu bestimmen.
    return ( a + b ) % (eZ % ( a - b ));
}
</code></pre>
<p>besser gefallen.</p>
<p>Eine andere (vielleicht saubere) Lösung bestünde darin, einen zweiten Vektortyp einzuführen, deren homogener Anteil per Definition immer ==1 ist. D.h. die Funktion 'homogen()' würde so einen Typ als Returntyp haben und die beiden Parameter der Funktion mittelsenkrechte wären eben von diesem Typ.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865677</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 07 Mar 2010 22:23:57 GMT</pubDate></item></channel></rss>