<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # PyCairo 中的變換 > 原文: [https://zetcode.com/gfx/pycairo/transformations/](https://zetcode.com/gfx/pycairo/transformations/) 在 PyCairo 圖形編程教程的這一部分中,我們將討論變換。 仿射變換由零個或多個線性變換(旋轉,縮放或剪切)和平移(移位)組成。 幾個線性變換可以組合成一個矩陣。 旋轉是使剛體繞固定點移動的變換。 縮放比例是一種放大或縮小對象的變換。 比例因子在所有方向上都是相同的。 平移是一種變換,可以使每個點在指定方向上移動恒定的距離。 剪切是一種將對象垂直于給定軸移動的變換,該值在軸的一側比另一側更大。 數據來源:(wikipedia.org,freedictionary.com) ## 平移 以下示例描述了一個簡單的平移。 ```py def on_draw(self, wid, cr): cr.set_source_rgb(0.2, 0.3, 0.8) cr.rectangle(10, 10, 30, 30) cr.fill() cr.translate(20, 20) cr.set_source_rgb(0.8, 0.3, 0.2) cr.rectangle(0, 0, 30, 30) cr.fill() cr.translate(30, 30) cr.set_source_rgb(0.8, 0.8, 0.2) cr.rectangle(0, 0, 30, 30) cr.fill() cr.translate(40, 40) cr.set_source_rgb(0.3, 0.8, 0.8) cr.rectangle(0, 0, 30, 30) cr.fill() ``` 該示例繪制一個矩形。 然后,我們進行平移并再次繪制相同的矩形幾次。 ```py cr.translate(20, 20) ``` `translate()`函數通過變換用戶空間原點來修改當前變換矩陣。 在我們的例子中,我們在兩個方向上將原點移動了 20 個單位。 ![Translation operation](https://img.kancloud.cn/15/f4/15f4e5ec19c72a16dc4bbff60bcb17d1_252x226.jpg) 圖:平移 operation ## 剪切 在以下示例中,我們執行剪切操作。 剪切是沿特定軸的對象變形。 此操作沒有剪切方法。 我們需要創建自己的變換矩陣。 注意,可以通過創建變換矩陣來執行每個仿射變換。 ```py def on_draw(self, wid, cr): cr.set_source_rgb(0.6, 0.6, 0.6) cr.rectangle(20, 30, 80, 50) cr.fill() mtx = cairo.Matrix(1.0, 0.5, 0.0, 1.0, 0.0, 0.0) cr.transform(mtx) cr.rectangle(130, 30, 80, 50) cr.fill() ``` 在此代碼示例中,我們執行一個簡單的剪切操作。 ```py mtx = cairo.Matrix(1.0, 0.5, 0.0, 1.0, 0.0, 0.0) ``` 此變換將 y 值剪切為 x 值的 0.5。 ```py cr.transform(mtx) ``` 我們使用`transform()`方法執行變換。 ![Shearing operation](https://img.kancloud.cn/24/55/2455ab6ab371f86a4b8c091ad7bc8671_252x226.jpg) 圖:抖動 operation ## 縮放 下一個示例演示了縮放操作。 縮放是一種變換操作,其中對象被放大或縮小。 ```py def on_draw(self, wid, cr): cr.set_source_rgb(0.2, 0.3, 0.8) cr.rectangle(10, 10, 90, 90) cr.fill() cr.scale(0.6, 0.6) cr.set_source_rgb(0.8, 0.3, 0.2) cr.rectangle(30, 30, 90, 90) cr.fill() cr.scale(0.8, 0.8) cr.set_source_rgb(0.8, 0.8, 0.2) cr.rectangle(50, 50, 90, 90) cr.fill() ``` 我們繪制三個`90x90px`的矩形。 在其中兩個上,我們執行縮放操作。 ```py cr.scale(0.6, 0.6) cr.set_source_rgb(0.8, 0.3, 0.2) cr.rectangle(30, 30, 90, 90) cr.fill() ``` 我們將矩形均勻縮放 0.6 倍。 ```py cr.scale(0.8, 0.8) cr.set_source_rgb(0.8, 0.8, 0.2) cr.rectangle(50, 50, 90, 90) cr.fill() ``` 在這里,我們以 0.8 的系數執行另一個縮放操作。 如果看圖片,我們可以看到第三個黃色矩形是最小的一個。 即使我們使用了較小的比例因子。 這是因為變換操作是累加的。 實際上,第三個矩形的縮放比例為 0.528(`0.6x0.8`)。 ![Scaling operation](https://img.kancloud.cn/3f/e6/3fe6f2a4511c62e275e98b69ce74ebde_252x226.jpg) 圖:縮放 operation ## 隔離變換 變換操作是累加的。 為了將一個操作與另一個操作隔離開,我們可以使用`save()`和`restore()`方法。 `save()`方法復制圖形上下文的當前狀態,并將其保存在保存狀態的內部棧中。 `restore()`方法將把上下文重新建立為保存狀態。 ```py def on_draw(self, wid, cr): cr.set_source_rgb(0.2, 0.3, 0.8) cr.rectangle(10, 10, 90, 90) cr.fill() cr.save() cr.scale(0.6, 0.6) cr.set_source_rgb(0.8, 0.3, 0.2) cr.rectangle(30, 30, 90, 90) cr.fill() cr.restore() cr.save() cr.scale(0.8, 0.8) cr.set_source_rgb(0.8, 0.8, 0.2) cr.rectangle(50, 50, 90, 90) cr.fill() cr.restore() ``` 在示例中,我們縮放了兩個矩形。 這次我們將縮放操作相互隔離。 ```py cr.save() cr.scale(0.6, 0.6) cr.set_source_rgb(0.8, 0.3, 0.2) cr.rectangle(30, 30, 90, 90) cr.fill() cr.restore() ``` 我們通過將`scale()`方法放在`save()`和`restore()`方法之間來隔離縮放操作。 ![Isolating transformations](https://img.kancloud.cn/38/d2/38d280b87bd7b2ce9dcd8127f8ea0087_252x226.jpg) 圖:隔離轉換 現在,第三個黃色矩形大于第二個紅色矩形。 ## 甜甜圈 在下面的示例中,我們通過旋轉一堆橢圓來創建復雜的形狀。 ```py #!/usr/bin/python ''' ZetCode PyCairo tutorial This program creates a 'donut' shape in PyCairo. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' from gi.repository import Gtk import cairo import math class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Donut") self.resize(350, 250) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_draw(self, wid, cr): cr.set_line_width(0.5) w, h = self.get_size() cr.translate(w/2, h/2) cr.arc(0, 0, 120, 0, 2*math.pi) cr.stroke() for i in range(36): cr.save() cr.rotate(i*math.pi/36) cr.scale(0.3, 1) cr.arc(0, 0, 120, 0, 2*math.pi) cr.restore() cr.stroke() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() ``` 我們將進行旋轉和縮放操作。 我們還將保存和還原 PyCairo 上下文。 ```py cr.translate(w/2, h/2) cr.arc(0, 0, 120, 0, 2*math.pi) cr.stroke() ``` 在 GTK 窗口的中間,我們創建了一個圓。 這將是我們橢圓的邊界圓。 ```py for i in range(36): cr.save() cr.rotate(i*math.pi/36) cr.scale(0.3, 1) cr.arc(0, 0, 120, 0, 2*math.pi) cr.restore() cr.stroke() ``` 我們沿著邊界圓的路徑創建了 36 個橢圓。 我們使用`save()`和`restore()`方法將每個旋轉和縮放操作相互隔離。 ![Donut](https://img.kancloud.cn/4d/ac/4dac34bdcb9e37620742cfc3deaff77b_352x276.jpg) 圖:多納圈 ## 星星 下一個示例顯示了一個旋轉和縮放的星星。 ```py #!/usr/bin/python ''' ZetCode PyCairo tutorial This is a star example which demonstrates scaling, translating and rotating operations in PyCairo. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' from gi.repository import Gtk, GLib import cairo class cv(object): points = ( ( 0, 85 ), ( 75, 75 ), ( 100, 10 ), ( 125, 75 ), ( 200, 85 ), ( 150, 125 ), ( 160, 190 ), ( 100, 150 ), ( 40, 190 ), ( 50, 125 ), ( 0, 85 ) ) SPEED = 20 TIMER_ID = 1 class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.init_vars() def init_ui(self): self.darea = Gtk.DrawingArea() self.darea.connect("draw", self.on_draw) self.add(self.darea) self.set_title("Star") self.resize(400, 300) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def init_vars(self): self.angle = 0 self.scale = 1 self.delta = 0.01 GLib.timeout_add(cv.SPEED, self.on_timer) def on_timer(self): if self.scale < 0.01: self.delta = -self.delta elif self.scale > 0.99: self.delta = -self.delta self.scale += self.delta self.angle += 0.01 self.darea.queue_draw() return True def on_draw(self, wid, cr): w, h = self.get_size() cr.set_source_rgb(0, 0.44, 0.7) cr.set_line_width(1) cr.translate(w/2, h/2) cr.rotate(self.angle) cr.scale(self.scale, self.scale) for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() ``` 在此示例中,我們創建一個星形對象。 我們將對其進行平移,旋轉和縮放。 ```py points = ( ( 0, 85 ), ( 75, 75 ), ( 100, 10 ), ( 125, 75 ), ( 200, 85 ), ... ``` 從這些點將構造星形對象。 ```py def init_vars(self): self.angle = 0 self.scale = 1 self.delta = 0.01 ... ``` 在`init_vars()`方法中,我們初始化了三個變量。 `self.angle`用于旋轉,`self.scale`用于縮放星形對象。 `self.delta`變量控制星星何時生長和何時收縮。 ```py glib.timeout_add(cv.SPEED, self.on_timer) ``` `on_timer()`方法的每個`cv.SPEED` ms 被調用。 ```py if self.scale < 0.01: self.delta = -self.delta elif self.scale > 0.99: self.delta = -self.delta ``` 這些線控制星星是要增長還是要縮小。 ```py cr.translate(w/2, h/2) cr.rotate(self.angle) cr.scale(self.scale, self.scale) ``` 我們將星星移到窗口中間。 旋轉并縮放比例。 ```py for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill() ``` 在這里,我們繪制星形對象。 在 PyCairo 教程的這一部分中,我們討論了變換。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看