Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249175 (10611)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Mathematiker gesucht
M.Heinemann
| Datum:15.02.02 11:42 (info@heinemaennchen.de) |
Ich hab da so ein Problem. Und zwar. ich zeichne eine Diagonale mit moveto 0,0 lineto 100,100 Um nun eine Simulation einer CNC Maschiene zu starten, müsste jeder einzelne Punkt dieser Diagonalen abgefahren werden. Wie lässt sich so etwas realisieren ??? Kann mir irgendjemand helfen. Vielen Dank im vorraus. Mfg M.Heinemann www.heinemaennchen.de
Uwe Beisler
| Datum:15.02.02 16:03 (uwe.beisler@t-online.de) |
Hallo, ich habe zwar nur den Hauptschulabschluß an Stelle eines Mathematikstudiums, aber ich denke so müßte es trotzdem gehen : Proc XYLinieRechnen 'Declare Xstart%, Xziel%, Ystart%, Yziel% 'Declare Xaktuell%, Yaktuell%, Xentfernung%, Yentfernung%, Xschrittweite!, Yschrittweite!, temp!, alt% Xaktuell%=Xstart% Yaktuell%=Ystart% Xentfernung%=sub(Xziel%,Xstart%) Yentfernung%=sub(Yziel%,Ystart%) Xschrittweite!=div(Xentfernung%,Yentfernung%) Yschrittweite!=div(Yentfernung%,Xentfernung%) print Xaktuell%,"-",Yaktuell% If lt(Xentfernung%,Yentfernung%) whilenot equ(Xaktuell%,Xziel%) alt% =Yaktuell% temp!=Yaktuell% while equ(Yaktuell%,alt%) temp!=add(temp!,Yschrittweite!) Yaktuell% = temp! endwhile print Xaktuell%,"/",Yaktuell% inc Xaktuell% endwhile else whilenot equ(Yaktuell%,Yziel%) alt% =Xaktuell% temp!=Xaktuell% while equ(Xaktuell%,alt%) temp!=add(temp!,Xschrittweite!) Xaktuell% = temp! endwhile print Xaktuell%,"/",Yaktuell% inc Yaktuell% endwhile endif print Xziel%,"-",Yziel% EndProc MfG Uwe
Frank Abbing
| Datum:15.02.02 16:19 (frankabbing@12move.de) |
Hallo, um das zu bewerkstelligen benötigst du einen Linienalgorhythmus, Bresenham ist wohl der schnellste, kommt er doch ohne Fließkomma-Zahlen aus. Bei J.Junke findest du so einen Algorhythmus, mit Profan geschrieben. Der hat mir auch schon mal gute Dienste geleistet: http://members.aol.com/JHunke2/Stadtpark.htm Gruß, Frank
Uwe Beisler
| Datum:15.02.02 16:55 (uwe.beisler@t-online.de) |
Hallo nochmal ! Kann es sein, daß ich die Aufgabe nicht verstanden habe ? Irgendwie packt mich jetzt der sportliche Ehrgeiz. Wenn Du mir sagst was z.B. bei moveto 23,21 lineto 46,27 rauskommen soll probiere ich es gerne nochmal. Uwe
Mischa Brandt
| Datum:15.02.02 17:37 |
Hallo! Ich habe eben eine kleine Funktion geschrieben, die Dein Problem hoffentlich löst. Die 'Syntax' ist denbar einfach: länge!=GetLinepoint(x%,y%,x2%,y2%,0,3) berechnet die tatsächliche Länge der Linie x!=GetLinepoint(x%,y%,x2%,y2%,Distanz%,1) berechnet die X-Koordinate für die Position auf der Linie, dabei mußt Du bei 'Distanz%' sozusagen die Schnittlänge angeben, ausgehend von den Quell-Koordinaten. y!=GetLinepoint(x%,y%,x2%,y2%,Distanz%,2) berechnet dei Y-Koordinate für..(siehe oben) Beispiel-Quellcode: Def @GetLinepoint(6) @If(Gt(@%(6),2),Sqrt(Add(Sqr(Sub(@%(1),@%(3))),\ Sqr(Sub(@%(2),@%(4))))),@If(Gt(@%(6),1),@If(Lt(@%(4),@%(2)),Sub(@%(2),\ Mul(Div(Abs(Sub(@%(2),@%(4))),Sqrt(Add(Sqr(Sub(@%(1),@%(3))),Sqr(Sub(@%(2),\ @%(4)))))),@%(5))),Add(@%(2),Mul(Div(Abs(Sub(@%(2),@%(4))),Sqrt(Add(Sqr(Sub(@%(1),\ @%(3))),Sqr(Sub(@%(2),@%(4)))))),@%(5)))),@If(Lt(@%(3),@%(1)),Sub(@%(1),\ Mul(Div(Abs(Sub(@%(1),@%(3))),Sqrt(Add(Sqr(Sub(@%(1),@%(3))),Sqr(Sub(@%(2),\ @%(4)))))),@%(5))),Add(@%(1),Mul(Div(Abs(Sub(@%(1),@%(3))),Sqrt(Add(Sqr(Sub(@%(1),\ @%(3))),Sqr(Sub(@%(2),@%(4)))))),@%(5)))))) Proc PointDraw Parameters x%,y%,x2%,y2% Declare zähler%,x!,y! UsePen 0,0,Rgb(0,100,100) Line x%,y%-x2%,y2% zähler%=1 Whilenot Gt(zähler%,GetLinepoint(x%,y%,x2%,y2%,0,3)) x!=GetLinepoint(x%,y%,x2%,y2%,zähler%,1) y!=GetLinepoint(x%,y%,x2%,y2%,zähler%,2) SetPixel x!,y!,Rgb(255,0,0) Inc zähler% sleep 5 Endwhile Endproc cls 0 Settruecolor 1 PointDraw 50,50,100,50 PointDraw 100,50,100,100 PointDraw 100,100,50,100 PointDraw 50,100,50,50 PointDraw 250,50,300,50 PointDraw 300,50,300,100 PointDraw 300,100,250,100 PointDraw 250,100,250,50 PointDraw 150,250,200,250 PointDraw 150,250,100,225 PointDraw 200,250,250,225 PointDraw 250,225,100,225 PointDraw 200,175,150,175 PointDraw 150,175,175,100 waitinput Gruß, Mischa
Uwe Beisler
| Datum:15.02.02 17:48 (uwe.beisler@t-online.de) |
Sorry, ist doch nicht so trivial wie ich gedacht habe. Ich habe mein Beispiel nur einmal mit ein paar krummen Zahlen getestet sonst hätte ich es wohl selbst gemerkt. Das peinlichste daran ist, daß ich schon seit Jahren Besitzer des noch ungelesenen "Computergrafik - Einführung durch Programmierung" bin. Uwe
Mischa
| Datum:16.02.02 00:52 |
Nachtrag zu meinem Beispiel: zähler%=1 ist unsinnig und muß, zumindest in dem Beispiel 0 sein Außerdem ist mir die funktion auch nicht präzise genug, denn selbst wenn ich @Round(x!,0) und @Round(y!,0) anwende, ist der Linienverlauf bei den Diagonalen nicht genau, bzw überdeckt nicht pixelgenau die Linie, die der Profan-Befehl gezeichnet hat. Das ist mit tödlicher Sicherheit immer noch ein Rundungsfehler und in jedem Fall nicht genau genug für eine CNC-Simulation, denke ich. Auf die optimale Lösung hat Frank ja schon hingewiesen. Die ist im übrigen auch ca 7 mal so schnell! (compiliert)
M.Heinemann
| Datum:16.02.02 10:36 (info@heinemaennchen.de) |
Sorry, das ich mich erst so spät melde. Aber mein TDSL-Modem ist abgeraucht. Na ja. Erstmal vielen Dank für eure Hilfe. Ich werd mich erstmal am Beispiel von Frank orientieren. Ich glaub, damit kann ich was anfangen. Aber wo ich schon mal hier bin: Nehmen wir mal an, ich möchte durch diese Simulation auch noch die Motoren ansteuern. Ich nehme erstmal die TVICPORT.DLL. Aber woher weiß ich, das der Motor der X bzw. Y Achse einen Schritt vor, bzw. zurück fahren muß ? Wäre nett, wenn ihr euch nochmal meldet. Danke. Mfg M.Heinemann www.heinemaennchen.de PS: Frank, darf ich deinen Quellcode auf meiner Site veröffentlichen ?
Frank Abbing
| Datum:16.02.02 14:49 (frankabbing@12move.de) |
Hallo, der Bresenham-Code stammt nicht von mir, sondern von J.Hunke. Ich hatte nur den originalen Code von Profan 4.5 nach Profan 7 umgeschrieben, um ihn für mich übersichtlicher und verständlicher zu machen. J.Hunke hat dann den 7er Code ebenfalls auf seine Homepage gestellt, das Copyright liegt aber bei ihm! Gruß, Frank
Frank Abbing
| Datum: 16.02.02 14:53 |
Hallo, "Aber woher weiß ich, das der Motor der X bzw. Y Achse einen Schritt vor, bzw. zurück fahren muß ?" Jedes SetPixel im Programmcode steht für eine Richtung (hoch, runter, links, rechts und 4 x diagonal). Das sollte also einfach sein, die Richtung festzustellen. Gruß, Frank

| Zurück zur Übersicht