После выполнения сложной серии поворотов и переводов я хочу вернуть текущее направление на «Север», указывающее вверху страницы. Как я могу это сделать?Поверните на север
Очевидный ответ - следить за тем, какое направление я указываю при каждом переводе, но это похоже на большую работу. Я хочу что-то вроде «0 rotateto», которое оставляет меня в текущем местоположении, но указывает на абсолютный верх страницы; Аналогичным образом, «90 rotateto» будет указывать правильно.
Я также хочу знать, как перейти к определенной точке на странице после серии поворотов и переводов. Другими словами, я ищу инструкцию «абсолютного moveto», которая перемещается в определенную точку, а не относительно текущих переведенных координат.
Моя цель - создать черепаху в стиле логотипа. Две команды, которые распознает черепаха, - это setpos (которая перемещается в абсолютное положение) и setorientation (которая вращается в абсолютном направлении). Я пытаюсь понять, как реализовать эти команды в PostScript.
EDIT 1:
Благодаря LUSER Droog, но что-то все-таки не так. Моя библиотека включает команды черепахи, показанные ниже, с их эквивалентами PostScript; rotateto и setpos являются определением вы дали ранее, is_penup глобальной переменную первоначально устанавливается истина, и я еще не рассматривал позы и ориентацию, которые сообщают текущее абсолютное положение х и ориентацию черепахи:
init -- %!
/rotateto { ... } bind def
/setpos { ... } def
newpath
306 396 moveto % center 8.5x11 portrait
0 setgray 2 setlinewidth
penup -- % set global variable is_penup to true
pendown -- % set global variable is_penup to false
forward n -- if is_penup then 0 n rmoveto currentpoint translate
else 0 n rlineto currentpoint translate
backward n -- if is_penup then 0 n neg rmoveto currentpoint translate
else 0 n neg rlineto currentpoint translate
right n -- n neg rotate
left n -- n rotate
setpos x y -- x y setpos
setorientation n -- n rotateto
done -- stroke newpage
pos -- get current absolute x y position
orientation -- get current absolute orientation
Пример, который рисует два квадрата, показан ниже; квадрат команда записывает четыре строки длины 50, каждый из которых сопровождается 90 градусов поворота направо:
init
pendown
setpos 100 100
square 50
setpos 400 400
right 45
square 25
done
Но это не работает. Ни одна из команд setpos не выполняется. Есть два квадрата, а второй квадрат наклонен на 45 градусов, но оба начинаются в центре страницы. Я боюсь, что каждый раз, когда я говорю, перевод текущей точки, я вмешиваюсь в то, что вы делаете в своей команде setpos.
Можете ли вы предложить какие-либо предложения?
EDIT 2:
я решил не беспокоиться о возвращении текущего положения и ориентации на схему; это слишком много работы для моей текущей цели, хотя это может быть полезно когда-нибудь в будущем. Окончательная версия моего кода схемы показана ниже. Отправить - обычная утилита, turtle-init определяет библиотеку черепах в PostScript, далее следует черепаховая библиотека Scheme, затем примерная программа, которая рисует два квадрата. Все работает отлично.
(define (send x . xs)
(cond ((null? xs) (display x) (newline))
(else (display x) (display " ") (apply send xs))))
(define (turtle-init)
(for-each send '(
"%!"
"/defmat matrix defaultmatrix def"
"/fix { currentpoint translate } def"
"/rotateto { matrix rotate"
" dup 4 matrix currentmatrix 4 2 getinterval"
" putinterval setmatrix } def"
"/setpos { defmat transform itransform moveto fix } def"
"/left { rotate } def"
"/right { neg rotate } def"
"/is-pendown false def"
"/penup { /is-pendown false def } def"
"/pendown { /is-pendown true def } def"
"/done { stroke showpage } def"
"/init { initgraphics 306 396 moveto fix 0 setgray 2 setlinewidth } def"
"/forward { 0 exch is-pendown { rlineto } { rmoveto } ifelse fix } def"
"/backward { 0 exch is-pendown { rlineto } { rmoveto } ifelse fix } def")))
(define (turtle-penup) (send "penup"))
(define (turtle-pendown) (send "pendown"))
(define (turtle-forward n) (send n "forward"))
(define (turtle-backward n) (send n "backward"))
(define (turtle-right n) (send n "right"))
(define (turtle-left n) (send n "left"))
(define (turtle-setpos x y) (send x y "setpos"))
(define (turtle-setorientation n) (send n "rotateto"))
(define (turtle-done) (send "stroke showpage"))
(define (square n)
(do ((i 4 (- i 1))) ((zero? i))
(turtle-forward n) (turtle-right 90)))
(define (squares)
(turtle-init)
(turtle-pendown)
(turtle-setpos 100 100)
(square 50)
(turtle-setpos 400 400)
(turtle-right 45)
(square 25)
(turtle-done))
(with-output-to-file "squares.ps"
(lambda() (squares)))
Это все появляются в моем blog некоторое время в январе; Я еще не уверен в точной дате.
Спасибо!
EDIT 3:
Я вернулся и прочитать документацию для логотипа черепахи, и обнаружил, что setpos чтит текущее состояние пера; таким образом, если перо не работает, setpos пишет строку из старой позиции в новую позицию.Я изменил setpos, чтобы иметь правильное поведение:
/setpos { defmat transform itransform is-pendown
{ lineto } { moveto } ifelse fix } def
Я также изменил черепаха иниц так, что он на самом деле вызывает инициализации вместо того, чтобы просто его определения. Не много пользы, если вы никогда не называете это.
Как вы переводите с Кембриджа на Польский на обратный польский? Вы выводите постскриптум из другой программы? –
Библиотека будет написана на Схеме. Перевод на PostScript не сложно. Однако вывод PostScript, который я хочу перевести, вызывает проблемы. – user448810
Какой-то Лисп кажется хорошим выбором. Если можно, сообщите нам ссылку, когда она работает. :) –