Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249175 (10611)
  Suchen
 Zurück zur Übersicht
 AutorThema: Mathematiker gesucht
M.Heinemann
Datum:15.02.02 11:42 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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