Только dirA и dirB это координаты относительно p.
Так что так будет:
a.p = p0;
a.dirA = p1-p0;
b.p = p3;
b.dirB = p2-p3;
a.dirB и b.dirA не восстановить из этих данных.
А как сделать, что бы при нажатии ctrl+z происходила отмена последнего изменение?