[Xy-pic] arrow head direction

Ross Moore ross at ics.mq.edu.au
Tue Sep 6 03:58:20 CEST 2005


Hello Frank,

On 06/09/2005, at 1:54 AM, r8yjke202 at sneakemail.com wrote:

> Hello,
>
> my way to draw automata is to define the state positions and then  
> to draw the transitions, p.ex.:
>
> \[
> \xy
> %states
> (0,30)*{q_0}*\xycircle(3.5,3.5){-}="q0";
> (30,30)*{q_1}*\xycircle(3.5,3.5){-}="q1";
> (30,0)*{q_2}*\xycircle(3.5,3.5){-}="q2";
> %final state
> (0,0)*{q_3}*\xycircle(3.0,3.0){-}*\xycircle(3.5,3.5){-}="q3";
> %initial
> (-5,30)*+{} = "i";
> \ar @( l, r) "i"; "q0" <2pt>
> %transitions
> \ar @( r, l) "q0"; "q1" <2pt> ^{\txt{$a$}}
> \ar @(dr,ul) "q0"; "q2" <2pt>
> \ar @( d, u) "q1"; "q2" <2pt> ^{\txt{$b$}}
> \ar @(dl,ur) "q1"; "q3" <2pt>
> \ar @( l, r) "q2"; "q3" <2pt> ^{\txt{$c$}}
> \ar @(ul,dr) "q2"; "q0" <2pt>
> \ar @( d, u) "q3"; "q0" <2pt> ^{\txt{$d$}}
> \ar @(ur,dl) "q3"; "q1" <2pt>
> \endxy
> \]
>
> The problem is, that in three cases the arrow head points to the  
> wrong direction (q1->q3, q2->q0, q3->q1):
>

This problem is triggered by your use of modifiers such as  @(dl,ur)
which redundantly specify the in/out directions of the arrows.
These are redundant with straight arrows, since the direction that
you specify are the natural directions deducible from the source and  
target
of the arrows.
However, by specifying these directions, you are also requesting that  
Xy-pic
draws a *curve* rather than using its straight-line methods. This  
results
in a nicely drawn curve with hundreds/thousands of individual points  
plotted.
In you case they all happen to lie on a straight line, so Xy-pic does  
lots
of extra calculations over what would normally be required for placing
straight line segments; this results in taking a longer time and more  
memory.

Nevertheless, getting the direction wrong for the arrow-head is must  
be a bug
(of sorts) in Xy-pic's curve coding, which seems to become apparent  
only in
this special case of a curve which is really straight.


By leaving out those  @(...) modifiers, the following code gives a  
better
result:

%transitions
\ar  "q0"; "q1" <2pt> ^{\txt{$a$}}
\ar  "q0"; "q2" <2pt>
\ar  "q1"; "q2" <2pt> ^{\txt{$b$}}
\ar  "q1"; "q3" <2pt>
\ar  "q2"; "q3" <2pt> ^{\txt{$c$}}
\ar  "q2"; "q0" <4pt>
\ar  "q3"; "q0" <2pt> ^{\txt{$d$}}
\ar  "q3"; "q1" <2pt>


But if you really do want to use curves, then try putting in a
small amount of real curvature; viz,

%transitions
\ar @/^5pt/  "q0"; "q1" <2pt> ^{\txt{$a$}}
\ar  @/^5pt/  "q0"; "q2" <2pt>
\ar @/^5pt/  "q1"; "q2" <2pt> ^{\txt{$b$}}
\ar  @/^5pt/  "q1"; "q3" <2pt>
\ar @/^5pt/  "q2"; "q3" <2pt> ^{\txt{$c$}}
\ar  @/^5pt/ "q2"; "q0" <4pt>
\ar @/^5pt/  "q3"; "q0" <2pt> ^{\txt{$d$}}
\ar  @/^5pt/ "q3"; "q1" <2pt>


> http://img197.imageshack.us/img197/1327/wrong7wl.png
>
> Changing the position of q1 and q2 slightly (+1pt to the right)  
> leads to the right behaviour:
>
> http://img277.imageshack.us/img277/6443/right2sb.png
>
> So, is this a bug or a failure in my code?

The coding is awkward, but it does show up a possible bug in a situation
that normally isn't needed.


Thanks for the report,


     Ross Moore


>
> Greetings,
>
> Frank.
>
> _______________________________________________
> xy-pic mailing list
> http://tug.org/mailman/listinfo/xy-pic
>

------------------------------------------------------------------------
Ross Moore                                         ross at maths.mq.edu.au
Mathematics Department                             office: E7A-419
Macquarie University                               tel: +61 +2 9850 8955
Sydney, Australia  2109                            fax: +61 +2 9850 8114
------------------------------------------------------------------------




More information about the xy-pic mailing list