<?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[Punkte einer Linie im Koordinatensystem errechnen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin gerade dabei, mit nem Kumpel ne CNC Fräse zu bauen. Dazu muss ich alle Punkte einer Linie zwischen zwei Koordinaten errechnen. Die Daten will ich dann in einem 2 Mehrdimensionale Array speichern. Die Werte benötige ich mit 3 Nachkommastellen.<br />
Die X Werte sollen bei dem Array in der 1. Zeile gespeichert werden.<br />
Beispiel:</p>
<pre><code>Linie zwischen (0|0) und (1|1)
float punkte[][] = {0.000,0.001,0.002,0.003,usw.,0.01,usw.,0.999},    //x Werte
                   {0.000,0.001,0.002,0.003,usw.,0.01,usw.,0.999};    //y Werte
Das ist natürlich ein einfaches Beispiel. Es sollen dann Werte wie z.B.:
X 15.002  Y 9.982
X 18.329  Y 24.691
berechnet werden.
</code></pre>
<p>Könnt ihr mir helfen? Wie macht man das am besten?</p>
<p>MfG<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272303/punkte-einer-linie-im-koordinatensystem-errechnen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 00:09:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272303.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Aug 2010 16:20:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:20:23 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin gerade dabei, mit nem Kumpel ne CNC Fräse zu bauen. Dazu muss ich alle Punkte einer Linie zwischen zwei Koordinaten errechnen. Die Daten will ich dann in einem 2 Mehrdimensionale Array speichern. Die Werte benötige ich mit 3 Nachkommastellen.<br />
Die X Werte sollen bei dem Array in der 1. Zeile gespeichert werden.<br />
Beispiel:</p>
<pre><code>Linie zwischen (0|0) und (1|1)
float punkte[][] = {0.000,0.001,0.002,0.003,usw.,0.01,usw.,0.999},    //x Werte
                   {0.000,0.001,0.002,0.003,usw.,0.01,usw.,0.999};    //y Werte
Das ist natürlich ein einfaches Beispiel. Es sollen dann Werte wie z.B.:
X 15.002  Y 9.982
X 18.329  Y 24.691
berechnet werden.
</code></pre>
<p>Könnt ihr mir helfen? Wie macht man das am besten?</p>
<p>MfG<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940028</guid><dc:creator><![CDATA[lord-maricek]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:20:23 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:24:25 GMT]]></title><description><![CDATA[<p>Was willst du jetzt wissen? Wie man ein Array erstellt? Wie man Werte interpoliert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940031</guid><dc:creator><![CDATA[Doookk]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:32:06 GMT]]></title><description><![CDATA[<p>Alle Punkte der Geraden durch (0|0) und (1|1) sind<br />
<code>(0|0) + x * (1|1)</code></p>
<p>Alle Punkte der Geraden durch A und B sind<br />
<code>A + x * (B-A)</code></p>
<p>Wie man sich leicht denken kann, sind das beliebig viele Punkte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940033</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:32:29 GMT]]></title><description><![CDATA[<p>Aso sorry, hab ich nicht genau geschrieben.<br />
Ich möchte wissen, wie man am besten alle Werte zwischen diesen 2 Punkten erstellt.<br />
Alle Punkte bis auf eine Genauigkeit von 3 Nachkommastellen.<br />
Also: P1 = (0|0), P2 = (1|1)<br />
Alle Punkte dazwischen:<br />
(0,001|0,001)<br />
(0,002|0,002)<br />
usw.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940034</guid><dc:creator><![CDATA[lord-maricek]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:46:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class point{
// ... 
float x, y;
}

void f()
{
  point A(0,0), B(1,1);
  point AB = B-A;
  vector&lt;point&gt; linie;
  float f = 0.001F / std::max(AB.x, AB.y);
  for(float x=0; x &lt;= 1; x+=f)
    linie.push_back(A + x*AB);
}
</code></pre>
<p>Ist nicht getestet und nicht besonders durchdacht (zB wird man wahrscheinlich nicht genau bei B ankommen).<br />
Für die Klasse point sind Konstruktor und +,*,- Operatoren angenommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940039</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Sat, 14 Aug 2010 16:49:16 GMT]]></title><description><![CDATA[<p>Ok, danke schonmal.<br />
Ich habe gerade den Bresenham Algorithmus gefunden. Ich habe leider weder in Mathe noch beim Programmieren damit gearbeitet.<br />
<a href="http://www.codekeep.net/snippets/e39b2d9e-0843-4405-8e31-44e212ca1c45.aspx" rel="nofollow">http://www.codekeep.net/snippets/e39b2d9e-0843-4405-8e31-44e212ca1c45.aspx</a><br />
Da hat jemand eine Funktion dafür geschrieben, aber leider gibt, werden die Punkte da auch nur in int berechnet und nicht in float. Weiß jemand, wie ich die Funktiom umschreiben kann, damit ich alle Punkte auf 3 Nachkommastellen bekomme?<br />
Also (0.001|0.001),(0.002|0.002) usw.?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940042</guid><dc:creator><![CDATA[lord-maricek]]></dc:creator><pubDate>Sat, 14 Aug 2010 16:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to Punkte einer Linie im Koordinatensystem errechnen on Mon, 16 Aug 2010 12:53:12 GMT]]></title><description><![CDATA[<p>lord-maricek schrieb:</p>
<blockquote>
<p>Ok, danke schonmal.<br />
Ich habe gerade den Bresenham Algorithmus gefunden. Ich habe leider weder in Mathe noch beim Programmieren damit gearbeitet.</p>
</blockquote>
<p>Du könntest einfach in 1/1000 rechnen. Ich nehme an, die Einheit der Längen ist mm, so müsstest Du halt in μm rechnen.</p>
<p>Es ist aber hier gar nicht nötig; der Bresenham Algorithmus wurde entwickelt um Graphik schneller zu machen. Deine CNC-Fräse wird nie so schnell sein, dass ein 0815-PC von heute da nicht mitkommt, auch wenn er für jeden μm einen neuen Wert berechnen musst. Auch ist der Bresenham Algorithmus nicht dafür geeignet eine CNC-Fräse zu steuern, da die absolute Schrittweite sich mit der Schrittrichtung um bis zu 41% ändern würde. Das ist sicher nicht erwünscht.<br />
Besser Du bleibst bei float (oder besser Datentyp double) und rechnest weiter in mm.</p>
<p>brotbernd hat Dir schon die notwendigen Informationen gegeben. Hilfreich ist eine Klasse Point bzw. <a href="http://de.wikipedia.org/wiki/Vektor" rel="nofollow">Vektor</a> (im mathematischen Sinne), Beispiele für <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1108802.html#1108802" rel="nofollow">Vektor in C++</a> gibt es genug, dann sähe das etwa so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iomanip&gt; // setprecision
#include &lt;cmath&gt; // std::sqrt

class Vektor
{
public:
    Vektor() : m_x(0), m_y(0) {}
    Vektor( double x, double y ) 
        : m_x(x), m_y(y) 
    {}
    Vektor&amp; operator+=( const Vektor&amp; b )
    {
        m_x += b.m_x; m_y += b.m_y;
        return *this;
    }
    Vektor&amp; operator-=( const Vektor&amp; b )
    {
        m_x -= b.m_x; m_y -= b.m_y;
        return *this;
    }
    Vektor&amp; operator*=( double fac )
    {
        m_x *= fac; m_y *= fac;
        return *this;
    }
    Vektor&amp; operator/=( double div )
    {
        return *this *= 1/div;
    }

    // --   Länge
    friend double abs( const Vektor&amp; v )
    {
        return std::sqrt( v.m_x * v.m_x + v.m_y * v.m_y );
    }
    // --   Access
    friend double X( const Vektor&amp; v ) { return v.m_x; }
    friend double Y( const Vektor&amp; v ) { return v.m_y; }

    // --   Ausgabe
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Vektor&amp; v )
    {
        return out &lt;&lt; &quot;(&quot; &lt;&lt; v.m_x &lt;&lt; &quot;|&quot; &lt;&lt; v.m_y &lt;&lt; &quot;)&quot;;
    }
private:
    double m_x, m_y;
};

Vektor operator+( Vektor a, const Vektor&amp; b )
{
    return a += b;
}
Vektor operator-( Vektor a, const Vektor&amp; b )
{
    return a -= b;
}
Vektor operator*( Vektor v, double fac )
{
    return v *= fac;
}
Vektor operator*( double fac, Vektor v )
{
    return v *= fac;
}
Vektor operator/( Vektor v, double div )
{
    return v /= div;
}

int main()
{
    using namespace std;
    const double schrittweite = 1./1000; // 1/1000 mm
    Vektor start( 15.002, 9.982 );
    Vektor ende( 18.329, 24.691 );

    Vektor richtung = ende - start;
    int anzSchritte = int( abs( richtung ) / schrittweite + 0.5 ); // + 0.5 dient der korrekten Rundung
    Vektor schritt = richtung / anzSchritte; // ein Schritt mit der Länge 'schrittweite'
    cout &lt;&lt; fixed &lt;&lt; setprecision(3); // sorgt dafür, dass die double mit 3 Nachkommastellen geschrieben werden
    int i = 0;
    for( Vektor pos = start; i &lt;= anzSchritte; ++i, pos = start + i*schritt )
    {
        cout &lt;&lt; pos &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>Ich habe die komplette Implementierung von Vektor auch gepostet, da ist jetzt auch nichts besonderes dabei. Du solltest zunächst versuchen zu verstehen, was im main passiert.<br />
Wichtig bei der Realisierung ist noch, dass Du keine Fließkommazahlen aufsummierst, weil das sonst zu Rundungsfehlern führt. Deshalb auch der int in der Schleife.</p>
<p>Die Ausgabe ist:</p>
<pre><code>(15.002|9.982)
(15.002|9.983)
(15.002|9.984)
(15.003|9.985)
(15.003|9.986)
(15.003|9.987)
(15.003|9.988)
(15.004|9.989)
(15.004|9.990)
(15.004|9.991)
...
(18.327|24.682)
(18.327|24.683)
(18.327|24.684)
(18.328|24.685)
(18.328|24.686)
(18.328|24.687)
(18.328|24.688)
(18.329|24.689)
(18.329|24.690)
(18.329|24.691)
</code></pre>
<p>Das sollte das sein, was Du gewünscht hast.</p>
<p>Gruß<br />
Werner</p>
<p>@Edit: Referenz bei operator= vergessen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940092</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 16 Aug 2010 12:53:12 GMT</pubDate></item></channel></rss>