Algorithm for computer control of a digital plotter
-
unter folgender Adresse kann man sich den Artikel "Algorithm for computer control of a digital plotter" von Jack Bresenham downloaden: http://www.research.ibm.com/journal/sj/041/ibmsjIVRIC.pdf
Seite 29 bereitet mir jedoch Probleme:
"To find the form of (4), Boolean variables X, Y, and Z, corresponding to dx, dy, and |dx|-|dy|, are introduced. As shown in Table 1, these variables assume the value 0 or 1, depending on whether or not the correspondent is negative. To determine the assignment of m1, the function
F(Y, Y, Z) = (XZ, YZ, XZ, YZ),
found by inspection of Table 1, is introduced. Correspondence between values assumed by F and the assignment of m1 is indicated by columns headed F and m1. Similarly,
G(X, Y) = (XY, XY, XY, XY)
is used in conjunction with the G- and m2-columns of Table 1 to make the appropriate assignment to m2."
Ich verstehe nicht ganz was Bresenham mit Funktion F und G will. Vor allem verstehe nicht was er da gleichsetzen will und was diese Formeln überhaupt bedeuten sollen
-
Vertexwahn schrieb:
"To find the form of (4), Boolean variables X, Y, and Z, corresponding to dx, dy, and |dx|-|dy|, are introduced. As shown in Table 1, these variables assume the value 0 or 1, depending on whether or not the correspondent is negative. To determine the assignment of m1, the function
F(Y, Y, Z) = (XZ, YZ, XZ, YZ),
Das hast du falsch abgeschrieben. Da steht
.Ich verstehe nicht ganz was Bresenham mit Funktion F und G will. Vor allem verstehe nicht was er da gleichsetzen will und was diese Formeln überhaupt bedeuten sollen
Was sie bedeuten kann ich dir sagen, es sind einfach Funktionen mit 3 bzw. 2 Argumenten. Diese Argumente sind "boolesch" in dem Sinne, dass sie nur 0 oder 1 sein können. , das ist also die Negation. AB ist einfach die Multiplikation, die man aber im Booleschen Sinne auch als Und-Verknüpfung auffassen kann.
-
ich verstehe nicht ganz was mir diese Funktionen (F und G) bringen - wenn ich weiß das F(1,0,0)=(0,0,0,1) ist dann sagt das doch auch nichts darüber aus welchen wert ich m1 bzw. m2 zuweisen muss ...?
-
Doch, schau dir die Tabelle 1 auf der vorhergehenden Seite an.
-
ich sehe anhand der Tabelle, das für F(1,0,0) als Bewegungrichtungen M7 und M3 zu wählen sind
warum sollt ich jetzt auch noch ermitteln welches vierer Tupel ich meinem dreier Tupel zuweisen kann - was macht das für einen Sinn?
-
Vertexwahn schrieb:
ich sehe anhand der Tabelle, das für F(1,0,0) als Bewegungrichtungen M7 und M3 zu wählen sind
Nein, du schließt aus (1,0,0) dass M7 und M8 zu wählen sind.
warum sollt ich jetzt auch noch ermitteln welches vierer Tupel ich meinem dreier Tupel zuweisen kann - was macht das für einen Sinn?
Sollst du doch gar nicht. Der Weg über F und G ist lediglich eine einfache(?) Möglichkeit, die Bewegungsrichtung zu bestimmen, ohne in die Tabelle zu gucken.
-
> Der Weg über F und G ist lediglich eine einfache(?) Möglichkeit, die Bewegungsrichtung zu bestimmen, ohne in die Tabelle zu gucken.
verstehe ich nicht wie das gehen soll - kannst du mal ein Beispiel machen
z. b. hab ich F(1, 0, 0) daraus kann ich dann ausrechen F(1, 0, 0) = (0, 0, 0, 1)
wie kann ich jetzt auf die Bewegungsrichtung schließen ...?
-
Tja, ich hatte hinter das "einfach" mit Absicht ein Fragezeichen gesetzt. Was daran einfacher sein soll ist mir auch nicht so recht klar, da man m1 und m2 auch bequem direkt aus X,Y,Z bestimmen kann. Das sind ja praktisch 3 Bits, also nehm ich eine Tabelle mit 8 Einträgen und fertig. Er führt den Nutzen von F und G ja leider auch nicht weiter aus. Da in diesen Tupeln immer genau eine 1 vorkommt, könnte es vielleicht für eine Hardware-Implementation gedacht sein (Spekulation).
-
mmh - ich schreib dem Bresenham einfach mal ne E-Mail
-
Eine weitere Frage: Wie kommt Bresenham überhaupt auf die Tabelle - kann man sich die einfach so aus den Fingern saugen - oder muss ich mir um 100% sicher zu sein, dass Bresenham keine Fehler gemacht hat für jeden Oktanten eine Skizze machen und alles nachrechnen?
ich vermute, dass er einfach für jeden Oktanten eine Skizze angefertigt hat und Gemeinsamkeiten untersucht hat und dabei auf diese Form gestoßen ist.
-
Ich nehme an das die Funktionen F und G verwendet werden für die interne Bewegungskodierung des Plotters
> This paper is based on "An incremental algorithm for digital plotting"
mal sehen ob ich den Artikel irgendwo finden kann - vielleicht klärt sich dann das Problem
Das soll der Code von Bresenham sein:
000 JOB ENTER PLOT POINTS FROM 1407 CTL 4411 ORG 501 * * TRAVEL SUBROUTINE * TRAVEL SBR LEAVE&3 ZA ZEROA,ALPHA ZA XTRGT,DELX ZA YTRGT,DELY S XPR,DELX S YPR,DELY MCW XTRGT,XPR MCW YTRGT,YPR ZA DELX,DELA ZA DELY,DELB MZ *&8,DELA NEED MAGNITUDE SO A B BITS MZ *&1,DELB * DETERMINE OCTANT C DELA,DELB BM DELXN,DELX BM DELYN,DELY MN PXPY,D45 BH D00PY D00PX MN PX,D00 SETDEL ZS DELA,DEL A DELA DELA NOW DOUBLED-SEE DRIVING LOOP A DELB NOW DOUBLED-SEE DRIVING LOOP B TALPHA DELXN BM DELXYN,DELY MN NXPY,D45 BH D00PY D00NX MN NX,D00 B SETDEL DELYN MN PXNY,D45 BL D00PX D00NY MN NY,D00 B DELAY D00PY MN PY,D00 DELAY MN DELY,DELA DELA S/B DELY SAVE PLUS MCW MN DELX,DELB DELB S/B DELX MCW B SETDEL DELXYN MN NXNY,D45 BL D00NX B D00NY * PLOTTER DRIVING LOOP D00GO MCW %T0,D00,S MOVE RELATIVE ZERO DEGREES TALPHA C ALPHA,DELA LEAVE BE 0 0 DUMMY A TWOA,ALPHA NOTE DELA HAS BEEN DOUBLED A DELB,DEL NOTE DELB PREVIOUSLY DOUBLED BM D00GO,DEL MCW %T0,D45,S S DELA,DEL NOTE DELA PREVIOUSLY DOUBLED B TALPHA * CONSTANTS ALPHA DCW #6 YTRGT DCW #6 DESIRED Y COORDINATE XTRGT DCW #6 DESIRED X COORDINATE DELY DCW #6 Y2 MINUS Y1 DELX DCW #6 X2 MINUS X1 YPR DCW #6 PRESENT Y COORDINATE XPR DCW #6 PRESENT X COORDINATE DELB DCW #6 DEPENDENT VARIABLE DIFF DELA DCW #6 INDEPENDENT VARIABLE DIFF DEL DCW #6 DECISION DIFFERENCE D00 DA 1X1,G RELATIVE 0 DEGREE MOVE D45 DA 1X1,G RELATIVE 45 DEGREE MOVE PX DCW @3@ 0 DEGREE CODE PXPY DCW @2@ 45 DEGREE CODE PY DCW @1@ 90 DEGREE CODE NXPY DCW @8@ 135 DEGREE CODE NX DCW @7@ 180 DEGREE CODE NXNY DCW @6@ 225 DEGREE CODE NY DCW @5@ 270 DEGREE CODE PXNY DCW @4@ 315 DEGREE CODE ZEROA DCW &0 TWOA DCW &2 * * END OF TRAVEL SUBROUTINE * * --CALLING SEQUENCE-- * 1. ZA DESIRED X COORDINATE, XTRGT * 2. ZA DESIRED Y COORDINATE, YTRGT * 3. B TRAVEL * * XPR,YPR ARE UPDATED * TRAVEL EXECUTED * CONTROL RETURNED TO INSTR AFTER *B TRAVEL* BEGINX LCA MXGX,47 SW 27,MSGX-1 MCE XPR,33 MCW &XTRGT,PLACE&6 TYPE LCA @}@,48 MCW %T0,21,W CS 8 LCA @}@,8 BIN VIN,Q B *-8 VIN MCW %T0,1,R SBR PLACE&3 BIN TYPE,* BCE PLACE&7,1,} MA @I9H@,PLACE&3 BM VMINUS,1 MCW @?@,PLACE BWZ VPLUS,1,B SW 1 PLACE ZA 0,0 BW BEGINY,MSGX-1 B TRAVEL B BEGINX VMINUS MCW @!@,PLACE VPLUS SW 2 B PLACE BEGINY LCA MSGY,47 SW 27 CW MXGX-1 MCE YPR,33 MCW &YTRGT,PLACE&6 B TYPE MSGX DCW @X NOW 0 -, ENTER NEXT X@ MSGY DCW @Y NOW 0 -, ENTER NEXT Y@ END BEGINX
ob ich da richtig liege mit meiner vermutung weiß ich net - kann aus dem code und den kommentaren nicht wirklich viel rauslesen
-
Geht das auch in C/C++
Ich zumindest baue Häuser nicht mit den einzelnen Molekülen zusammen.
-
> Geht das auch in C/C++
Der C/C++ Standard unterstützt halt mal keine Plotter - traurig aber wahr
Der Code entstand in den 60ern - da hatte man es noch nicht so mit C++ - das ich diesen Code präsentiere hat nur folgenden Sinn:
Ich hoffe jemand kann da rauslesen wie der Plotter intern die Bewegungen kodiert - das war doch die Vermutung von Bashar das die Bewegung M1 als (1, 0, 0, 0) kodiert ist - oder so....dieses Programm gibts halt nicht in C++ und das ist auch gar nicht das Ziel - mich interessiert nur was die Funkton F und G bewirken - sonst nichts