Aufteilung Kreis in Segmente < Technische Inform. < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 17:14 Mi 26.10.2005 | Autor: | popcorn5 |
Hallo,
ich hoffe ich schreibe diesen Beitrag ins richtige Forum, wenn nicht verzeiht mir.
Ich erkläre kurz worum es geht: Ich möchte ein Programm in Perl* schreiben dass mir einen Kreis in einzelne Segmente aufteil und mir die Schnittpunkte in einem Koordinatensystem einfügt (X- und Y-Achse).
*Perl=Programmiersprache (Practical Extraction and Reporting Language).
Grund: Es handelt sich hierbei um Teil einer Computergestützten Steuerung eines CNC-Plasmaschneiders mit dem 2D Blechteile in allen möglichen Formen ausgeschnitten werden. Es sollen Zwei verschiedene CAD-Programme für die Eingabe der Schneidbilder verwendet werden.
Eines davon ist ziemlich alt (20 Jahre ca.) und verfügt über die funktion einen Kreis in Form eines fertigen Befehls an die Maschine zu übergeben die ich leider auch nicht abschalten kann. Nun soll auf einen neueren Maschinentyp umgestellt werden. Die neue Maschine kennt aber keine Befehle um Kreise zu schneiden sondern kann nur gerade Strecken abfahren.
Ich möchte nun diesen Kreis in ein Vieleck verwandeln (sodass dieser Optisch wieder rund aussieht).
Ich habe dazu einmal eine Zeichnung angefertig: Klick
Mir sind immer der Radius und der Winkel bekannt. Der Winkel entscheidet sich durch die grösse des Teils, je grösser desto kleiner die Unterteilung.
Ich hab hier jetzt mal 45° als Beispiel gemacht. Und der Radius könnte 200mm betragen. Start ist immer ganz oben (12Uhr).
Um das ganze umzusetzen brauche ich a(X-Achse), b(Y-Achse) und c(länge des Abschnitts). Ich habe schon unzählige Stunden über Formelbüchern und im Internet verbracht aber nichts annäherndes gefunden und wäre sehr dankbar wenn mir jemand eine Lösung bzw. Lösungsansatz gibt.
Ich hoffe ich habe alles verständlich erklärt.
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Danke schon mal vorab.
Mfg Matthias
|
|
|
|
Hallo Matthias,
Leider weiß ich nicht, welche Zeichenmöglichkeiten deine Maschine hat (kann sie z.B. auch schräge Linien zeichnen, oder kennt sie nur die Richtungen "links"-"rechts"-"oben"-"unten"?).
Generell läßt sich ein Ursprungskreis durch [mm] $x^2 [/mm] + [mm] y^2 [/mm] = [mm] r^2$ [/mm] in einem kartesischen [mm] $x,y\texttt{-Koordinatensystem}$ [/mm] beschreiben, denn alle Punkte, die auf der Kreislinie liegen, sind gleichweit (um [mm] $r\!$) [/mm] vom Ursprung entfernt. Durch den Pythagoras-Satz kann man dies formal (s.o.) ausdrücken.
Aus der obigen Gleichung, erhält man, wenn man nach [mm] $y\!$ [/mm] umformt, zwei Gleichungen:
$y = [mm] \sqrt{r^2-x^2}$
[/mm]
und
$y = [mm] -\sqrt{r^2-x^2}$
[/mm]
Als Funktionen interpretiert beschreibt die erste Funktion einen Halbkreis, der sich von [mm] $x_0 [/mm] = -r$ bis [mm] $x_1 [/mm] = r$ vom Iten bis zum IIten Quadranten erstreckt (erstelle eine Wertetabelle und siehe selbst).
Die zweite Funktion beschreibt analog den unteren Halbkreis.
Wie wäre es also, wenn Du ein Programm schreibst, daß folgendermaßen vorgeht:
1. Gehe [mm] $r\!$ [/mm] Einheiten in beliebige Richtung vom Startpunkt. Wenn angekommen: Markiere Startpunkt (wurde vorher abgespeichert) als Ursprung (0,0); Setze Koordinatensystem so, daß die neue Position die Koordinaten (1,0) erhält.
2. Sei [mm] $d\!$ [/mm] eine Schrittweite für die Strecke der Länge 2 Einheiten (von (1,0) bis (-1,0) ). (Also z.B. $d = [mm] 0.001\!$.) [/mm] Setze $K := [mm] 1\!$. [/mm] Setze den Stift auf die zu bearbeitende Fläche.
3. Solange [mm] $K\!$ [/mm] nicht -1:
3.1 Erniedrige [mm] $K\!$ [/mm] um [mm] $d\!$; [/mm] Setze [mm] $K\!$ [/mm] in erste Funktion [mm] $f_1$ [/mm] ein; Gehe zu neuer Position [mm] $\left(K|f_1(K)\right)$.
[/mm]
3.2 Gehe zu 3.
4. Analog zu 3. aber diesmal gehst Du zurück zu 1 und benutzt die zweite Funktion als "Lieferant von Koordinaten".
5. Aktuelle Position = Position bei Schritt 1. [mm] $\Rightarrow$ [/mm] Stift hochheben; Gehe exakt den gleichen Weg zurück, den Du bei Schritt 1. gegangen bist.
6. STOP.
Ich denke außerdem, daß Du noch die Funktionen [mm] $f_1$ [/mm] und [mm] $f_2$ [/mm] geeignet approximieren müßtest, um den Fehler so gering wie möglich zu halten. Dies ist aber sehr stark von den Eigenheiten deiner Maschine abhängig.
Viele Grüße
Karl
[P.S. Benutze den Algorithmus auf eigene Gefahr! ]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:55 Do 27.10.2005 | Autor: | popcorn5 |
@Karl Pech: Danke für die rasche Antowort.
Zur Maschine: Es ist ein CNC-Plasmaschneider, sowas ähnliches wie ein Laser aber schneller, genauer und kann dickeres Material schneiden. http://www.sterlingfabrication.com/cncplasma.jpg ist eine solche maschine.
Ich kann damit sehrwohl auch diagonalen fahren. ich muss dafür nur eine relative bewegung in X und Y an die Maschine senden und schon fahre ich diagonalen. Der Befehl auf Deutsch würde lauten Fahre X 100 rechts und X 250 unten ergibt eine Diagonale mit ca 270mm länge. Sonst wäre das was ich vorhabe auch gar nicht möglich.
Dein Lösungsansatz geht zwar komplett in die andere richtig die ich bislang verfolgt habe aber offenbar kann ich damit was anfangen.
Ich werde mich die nächsten Stunden erstmal genauer damit befassen, dann kann ich mehr dazu sagen.
danke erstmal ;)
|
|
|
|
|
Ich kenne mich in Perl zwar nicht aus, aber ich schätze mal sie wird dich nicht so wesentlich von anderen Programmiersprachen unterscheiden.
Also mein Vorschlag wäre des Kreis mithilfe von Trigonomettrischen Funktionen auszudrücken.
Start soll 12 Uhr sein
dann ist
x=R*sin( [mm] \alpha)
[/mm]
[mm] y=R*cos(\alpha)
[/mm]
nun kannst du mit einer Zählschleife sehr kleine Winkelstücke von 0 bis 360 Grad oder wahlweise im Bogenmaß durchlaufen.
und aus 2 Ermittelten Wertepaaren kannst du dann eine winzige Teilstrecken konstruieren. Je mehr Teilstücke du nimmst, desto genauer wird dein Kreis.
Davon mal abgesehen ist der Zusammenhang schön einfach. In der Physik werden Kreisbewegungen auch meist mit den Trigonometrischen Funktionen beschrieben und es Rechnet sich damit einfach einfacher.
|
|
|
|