【问题标题】:Iterating through Diameter of a Circle Morph迭代圆变形的直径
【发布时间】:2012-08-29 18:42:19
【问题描述】:

我有一个CircleMorph,我想扩大它的直径,可能是为了用它创建一个小动画。

b := CircleMorph new.
b color: Color transparent.
b borderWidth: 2.
b extent:100 @ 100.
b openInWorld.

如果我使用循环或step 方法来执行此操作会更好吗?如果你推荐step 方法,那我该怎么做呢?

【问题讨论】:

    标签: smalltalk pharo morphic


    【解决方案1】:

    您可以创建 CircleMorph 的子类,称为 GrowingCircleMorph。 然后实现step

    step
       self extent: (self extent) + 1.
       (self extent) > (200@200) ifTrue: [ self stopStepping ]
    

    现在,如果您在 World 中打开新的 GrowingCircleMorph 实例,它将开始增长到 201@201。

    要更改速度,请实现 stepTime 并返回所需的步骤之间的时间(以毫秒为单位)。

    更新:如果您希望中心保持不变,请更改圆形变形的边界,而不是范围:

    step
       self bounds: ((self bounds) expandBy: 1).
       (self extent) > (200@200) ifTrue: [ self stopStepping ]
    

    【讨论】:

    • 感谢您的帮助,我有 2 个 CircleMorphs b1 和 b2 相交我可以使用 intersect 方法获得相交点吗? b1 相交:b2
    • 我认为你必须自己实现它。只要看看数学公式,或者如果我没记错Dr. Geo 有圆圈,就知道如何回答它们的交叉点。你可能会在那里找到一些灵感..
    • 如果您希望中心保持不变,请更改变形的边界,而不是范围。我更新了答案。
    【解决方案2】:

    如果你想玩这些东西,就让它通用:

    HOCanvasMorph>>drawOn: aCanvas
        super drawOn: aCanvas.
    
        drawBlock ifNotNil: [
          aCanvas
            translateBy: self bounds origin
            clippingTo: self bounds
            during: [:canvas | drawBlock value: canvas]]
    
        HOCanvasMorph>>drawBlock: aBlock
            drawBlock := aBlock.
            self changed.
    
    HOCanvasMorph class>>example
    |m|
    
    m := HOCanvasMorph new openInWorld.
    
    "to draw:"
    
    m drawBlock: [:c |
        c line: 10@10 to: 100@100 color: Color red
    ]
    
    HOCanvasMorph class>>napperons
    "Some mathematical fun"
    
    | m |
    m := HOCanvasMorph new openInWorld. "to draw:"
    m
        drawBlock: [ :aCanvas | 
            | n r t xa xc xb yc ya yb longueur nombreDeDroites |
            longueur := 150.
            nombreDeDroites := 30.  "super drawOn: aCanvas."
            xc := 200.
            yc := 200.
            n := 15.
            r := 100.
            0 to: n - 2 do: [ :i | 
                t := 2 * Float pi * i / n.
                i + 1 to: n - 1 do: [ :j | 
                    | tj |
                    tj := 2 * Float pi * j / n.
                    xa := xc + (r * t cos).
                    ya := yc + (r * t sin).
                    xb := xc + (r * tj cos).
                    yb := yc + (r * tj sin).
                    (aCanvas asBalloonCanvas) line: xa @ ya to: xb @ yb color: Color green ] ] ]
    

    由于块可以使用任何更改,因此将这些更改放在一个 step 方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多