Autor | Thema: Mathematiker gesucht | | 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
|
| | 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
|
| | 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
|
| | 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
|
| | 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
|
| | 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
|
| | 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)
|
| | 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 ?
|
| | 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
|
| | 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
|
|
|