转换绘图上下文的起源

时间:2015-02-16 17:18:35

标签: racket

我正在尝试转换dc<%>实例,以便将原点(0,0)设置为左下角。原则上,this question answers my question,但我正在努力理解它的工作原理的细节,以及为什么我看到我的行为。对于初学者,这是我正在使用的代码。请注意,我绘制的线条从左上角的(0,0)开始。

#lang racket
(require racket/draw)


;;; Begin our drawing
(define w 200)
(define h 200)
(define dc (new pdf-dc%
                [interactive #f]
                [use-paper-bbox #f]
                [width w]
                [height h]
                [output "./foo.pdf"]))

(send dc start-doc "file output")
(send dc start-page)

(send dc draw-line 0 0 150 150)

(send dc end-page)
(send dc end-doc)

Untransformed output

从那里开始,我相信我应该能够使用适当的转换矩阵向我的dc实例发送set-transformation消息。但是,适合的转换数据结构对我来说仍然是难以捉摸的。

documentation for set-transformation引用了get-transformation的文档。在这里,我了解到我需要传入一个包含初始变换矩阵的向量,我可以通过get-initial-matrix检索它,以及变换参数x origin,y origin,x scale,y scale和rotation。

我对此的天真的第一次攻击让我构建了如下的转换数据结构,通过get-initial-matrix为第一部分获取初始矩阵,然后翻转y比例:

#lang racket
(require racket/draw)

;;; Begin our drawing
(define w 50)
(define h 50)
(define dc (new pdf-dc%
                [interactive #f]
                [use-paper-bbox #f]
                [width w]
                [height h]
                [output "./foo.pdf"]))

(send dc start-doc "file output")
(send dc start-page)

;(send dc get-transformation)
;; returns '#(#(1.0 0.0 0.0 1.0 0.0 0.0) 0.0 0.0 1.0 1.0 0.0)

(send dc set-transformation
      (vector (send dc get-initial-matrix)
              0  0  ; x origin, y origin
              1  -1  ; x scale, y scale
              0))   ; rotation

(send dc draw-line 0 0 50 50)

(send dc end-page)
(send dc end-doc)

这导致了一个空的绘图,大概是在视线之外的某个地方被翻译过来。

阅读this other question上的评论,它表明我需要在y原点添加一个偏移量(即需要翻转比例并翻译原点)。我的下一次尝试添加了这个:

#lang racket
(require racket/draw)

;;; Begin our drawing
(define w 50)
(define h 50)
(define dc (new pdf-dc%
                [interactive #f]
                [use-paper-bbox #f]
                [width w]
                [height h]
                [output "./foo.pdf"]))

(send dc start-doc "file output")
(send dc start-page)

;(send dc get-transformation)
;; returns '#(#(1.0 0.0 0.0 1.0 0.0 0.0) 0.0 0.0 1.0 1.0 0.0)

(send dc set-transformation
      (vector (send dc get-initial-matrix)
              0  h  ; x origin, y origin
              1  -1  ; x scale, y scale
              0))   ; rotation

(send dc draw-line 0 0 50 50)

(send dc end-page)
(send dc end-doc)

这似乎将绘图元素带回到框架中,但我不是完全在原点:

Flipped and translated

在该图中,我注意到我的原点似乎仍然垂直移动了大约四分之一的绘图环境。我可以在我的y起源上添加另一个位(摘自完整示例):

(send dc set-transformation
      (vector (send dc get-initial-matrix)
              0  (+ (* 0.25 h) h)  ; x origin, y origin
              1  -1  ; x scale, y scale
              0))   ; rotation

这看起来还不错,但也许还有一点关闭:

Translated, flipped, and with added fudge-factor

链接SO线程中的最后一条注释表明我需要提供一个修改初始转换矩阵的函数。这对我来说没什么意义,因为我从文档中推断出初始变换矩阵是一个起点,而不是一个终点。此外,在这一点上,做一些似乎应该简单的事情似乎还有很多额外的努力,这似乎是逻辑,它将成为像集转换这样的函数的一部分。

对于这里冗长的问题背景感到抱歉,但我希望有人可以告诉我在哪些方面我很容易误解其他明显的问题。

0 个答案:

没有答案