Spline.st
author Claus Gittinger <cg@exept.de>
Wed, 05 Jun 1996 13:54:34 +0200
changeset 388 9f1c439ad66b
parent 374 a77f804c605e
child 490 ef43c7a69346
permissions -rw-r--r--
oops - bounds was wrong
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 This class is based on a file from the Manchester Goodie library.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
 It is not covered by the ST/X copyright and may be copied and used
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 according the rules as stated by the athor and the manchester archive.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 The original readme was:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 The above file is a Manchester Goodie.  It is distributed freely on condition
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 that you observe these conditions in respect of the whole Goodie, and on
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 any significant part of it which is separately transmitted or stored:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
        * You must ensure that every copy includes this notice, and that
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
          source and author(s) of the material are acknowledged.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
        * These conditions must be imposed on anyone who receives a copy.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
        * The material shall not be used for commercial gain without the prior
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
          written consent of the author(s).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
 For more information about the Manchester Goodies Library (from which 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
 this file was distributed) send e-mail:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
        To: goodies-lib@cs.man.ac.uk
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
        Subject: help 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
Geometric subclass:#Spline
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
	instanceVariableNames:'controlPoints lines function firstDerivative secondDerivative
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
		thirdDerivative'
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
	classVariableNames:''
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
	poolDictionaries:''
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
	category:'Graphics-Geometry'
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
!Spline class methodsFor:'documentation'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
copyright
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
 This class is based on a file from the Manchester Goodie library.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
 It is not covered by the ST/X copyright and may be copied and used
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
 according the rules as stated by the athor and the manchester archive.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
 The original readme was:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
 The above file is a Manchester Goodie.  It is distributed freely on condition
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
 that you observe these conditions in respect of the whole Goodie, and on
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
 any significant part of it which is separately transmitted or stored:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        * You must ensure that every copy includes this notice, and that
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
          source and author(s) of the material are acknowledged.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
        * These conditions must be imposed on anyone who receives a copy.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        * The material shall not be used for commercial gain without the prior
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
          written consent of the author(s).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
 For more information about the Manchester Goodies Library (from which 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
 this file was distributed) send e-mail:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        To: goodies-lib@cs.man.ac.uk
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        Subject: help 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
documentation
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    Spline defines a path that includes an arbitrary collection of points 
280
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    66
    connected by a third order curve. The curve passes through all controlPoints.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    67
    Both open and closed curves are possible.
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
279
Claus Gittinger <cg@exept.de>
parents: 278
diff changeset
    69
    [see also:]
289
c4a61914a9a0 more examples & comments
Claus Gittinger <cg@exept.de>
parents: 284
diff changeset
    70
        Polygon LineSegment Circle EllipticalArc 
331
Claus Gittinger <cg@exept.de>
parents: 327
diff changeset
    71
        Rectangle Curve Arrow ArrowedSpline
Claus Gittinger <cg@exept.de>
parents: 327
diff changeset
    72
        GraphicsContext StrokingWrapper FillingWrapper
279
Claus Gittinger <cg@exept.de>
parents: 278
diff changeset
    73
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    [author:]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
        scaletti@uxc.cso.uiuc.edu (Kurt J. Hebel)
279
Claus Gittinger <cg@exept.de>
parents: 278
diff changeset
    76
        adapted to ST/X & minor fixes by Claus Gittinger
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
examples
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
"
280
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    82
  open spline; filled & unfilled:
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    83
                                                                        [exBegin]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    84
    |v s|
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    85
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    86
    v := (View extent:100@100) openAndWait.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    87
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    88
    s := Spline controlPoints:
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    89
                (Array with:(20@20)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    90
                       with:(80@80)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    91
                       with:(20@80)).
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    92
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    93
    v paint:Color blue.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    94
    s displayFilledOn:v.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    95
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    96
    v paint:Color red.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    97
    s displayStrokedOn:v.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    98
                                                                        [exEnd]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
    99
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   100
  closed spline; filled & unfilled:
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   101
                                                                        [exBegin]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   102
    |v s|
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   103
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   104
    v := (View extent:100@100) openAndWait.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   105
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   106
    s := Spline controlPoints:
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   107
                (Array with:(20@20)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   108
                       with:(80@80)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   109
                       with:(20@80)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   110
                       with:(20@20)).
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   111
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   112
    v paint:Color blue.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   113
    s displayFilledOn:v.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   114
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   115
    v paint:Color red.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   116
    s displayStrokedOn:v.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   117
                                                                        [exEnd]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   118
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   119
  spiral:
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   120
                                                                        [exBegin]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   121
    |v points s|
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   122
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   123
    v := View extent:(200 @ 200).
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   124
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   125
    v openAndWait.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   126
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   127
    points := OrderedCollection new.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   128
    90 to:10 by:-10 do:[:r |
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   129
        0 to:330 by:30 do:[:angle |
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   130
            |d|
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   131
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   132
            d := (angle / 360) * 10.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   133
            points add:(Point r:r-d angle:angle) + (100@100)
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   134
        ].
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   135
    ].
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   136
    s := Spline controlPoints:points.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   137
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   138
    v paint:Color red.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   139
    s displayStrokedOn:v.
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   140
                                                                        [exEnd]
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   141
  interactive example:
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
                                                                        [exBegin]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    |v points eventCatcher|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    v := StandardSystemView extent:(450 @ 450).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    v label:'Spline Example - (click left/middle)'.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    points := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    v openAndWait.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    eventCatcher := Plug new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    eventCatcher respondTo:#handlesButtonPress:inView:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
                      with:[:butt :view | true].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    eventCatcher respondTo:#buttonPress:x:y:view:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
                      with:[:butt :x :y :view | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
                            v paint:(Color white).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
                            v fillCircle:(x @ y) radius:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
                            points add:(x @ y).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
                            (butt == 1 or:[butt == #select]) ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
                                v paint:(Color white).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
                                v fillCircle:(x @ y) radius:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
                                (Spline controlPoints:points) displayStrokedOn:v.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
                                points := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
                            ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
                           ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    v delegate:(eventCatcher)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
                                                                        [exEnd]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
!Spline class methodsFor:'instance creation'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
controlPoints:aSequentialCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
    "return a new spline, which passes through aSequentialCollectionOfPoints"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    ^ self new controlPoints:aSequentialCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
!Spline methodsFor:'accessing'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
controlPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    "return the collection of points through which the spline is
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
     to pass"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    ^ controlPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    "Created: 8.5.1996 / 18:46:35 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
controlPoints:aCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    "set the collection of points through which the spline is
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
     to pass"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    controlPoints := aCollectionOfPoints.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    lines := nil
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    "Created: 8.5.1996 / 18:50:24 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    "Modified: 8.5.1996 / 19:32:57 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
!Spline methodsFor:'converting'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
283
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   207
asPointArray
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   208
    "return an array containing my approximated vertex points."
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   209
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   210
    ^ self computeLineSegments
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   211
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   212
    "Created: 8.5.1996 / 20:44:09 / cg"
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   213
!
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   214
280
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   215
asPolygon
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    "return a polygon, approximating the spline"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    ^ Polygon vertices:(self computeLineSegments)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
280
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   220
    "Created: 8.5.1996 / 20:15:37 / cg"
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   221
!
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   222
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   223
asPolyline
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   224
    "same as #asPolygon - for ST-80 compatibility"
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   225
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   226
    ^ self asPolygon
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   227
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    "Created: 8.5.1996 / 18:49:42 / cg"
280
Claus Gittinger <cg@exept.de>
parents: 279
diff changeset
   229
    "Modified: 8.5.1996 / 20:15:59 / cg"
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
!Spline methodsFor:'displaying'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
displayFilledOn:aGC 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    "Display this Spline as a filled polygon from approximated lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    lines isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
        lines := self computeLineSegments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    aGC fillPolygon:lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    "Modified: 8.5.1996 / 18:45:49 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    "Created: 8.5.1996 / 18:54:12 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
displayStrokedOn:aGC 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    "Display this Spline as a series of approximating lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    lines isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
        lines := self computeLineSegments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    "/ Plot the lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    aGC displayPolygon:lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    "Created: 8.5.1996 / 18:44:17 / cg"
332
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   258
    "Modified: 13.5.1996 / 11:19:14 / cg"
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
!Spline methodsFor:'private'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    "Compute an array for the derivatives at each knot."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    |size values cyclic second third secondFromLast thirdFromLast
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
     addedExtra|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    "/ Get the number of points, 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    "/ and make an OrderedColleciton of all of the points."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    size := controlPoints size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
    function := OrderedCollection new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    controlPoints do:[:point | function addLast:point].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    "/ stop if the spline has not enough points for the derivation(s).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    size < 3 ifTrue: [^ self].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    "/ Flag whether curve is cyclic or not.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    cyclic := size > 3 and: [function first = function last].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    "/ Set up the values collection.  The derivatives are computed from this.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    values := function copy.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    "/ Process cyclic curves differently.  
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    "/ Add the last two points to the beginning,
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "/ and the first two points to the end, so that the derivative calculation 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    "/ can look at a cycle."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
    cyclic ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
        second := values at: 2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
        third := values at: 3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
        thirdFromLast := values at: size - 2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
        secondFromLast := values at: size - 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
        values addFirst: secondFromLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
        values addFirst: thirdFromLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
        values addLast: second.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
        values addLast: third
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
        size == 3 ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
            addedExtra := true.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
            values addLast:(values last).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
        ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
            addedExtra := false
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    "/ Compute the derivatives of the values collection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    self computeDerivatives:values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    "/ Remove any extra points which were added if the Spline is cyclic.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    cyclic ifTrue:  [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
        firstDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
        firstDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
        firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
        firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
        secondDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
        secondDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
        secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
        secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
        thirdDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
        thirdDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
        thirdDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
        thirdDerivative removeLast
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        addedExtra ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
            firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
            secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
            thirdDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    "Created: 8.5.1996 / 18:34:43 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    "Modified: 8.5.1996 / 19:43:51 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
computeDerivatives: values
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    "Computes the first, second and third derivatives at each point 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
     in the collection values."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    |size "{Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
     v b 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
     lastV lastB nextV nextB 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
     valuesI valuesI1 valuesI2 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
     twoDerivI twoDerivI1|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
    "/ Set up the derivative arrays.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    size := values size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    size < 3 ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
        'SPLINE: not enough controlPoints' errorPrintNL. 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
        ^ self
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
    firstDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    secondDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    thirdDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    "/ Compute the second derivative of the values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    size > 3 ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
        lastV := 4.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
        lastB := 6.0 * (values first - ((values at:2) * 2.0) + (values at:3)).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
        v := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
        b := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
        v at: 1 put:lastV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
        b at: 1 put:lastB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
        valuesI := values at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
        valuesI1 := values at:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
        size > 3 ifTrue: [valuesI2 := values at:4].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
        2 to:size-2 do: [:i |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
            nextV := 4.0 - (1.0 / lastV).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
            nextB := 6.0 * (valuesI - (valuesI1 * 2.0) + valuesI2) - (lastB / lastV).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
            v at:i put:nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
            b at:i put:nextB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
            size-2 == i ifFalse: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
                lastV := nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
                lastB := nextB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
                valuesI := valuesI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
                valuesI1 := valuesI2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
                valuesI2 := values at:i+3
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
            ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
        ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
        secondDerivative at:size-1 put:nextB/nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
        size-2 to:2 by:-1 do: [:i | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
            secondDerivative at:i 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
                            put:(b at:i-1) 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
                                 - (secondDerivative at:i+1) / (v at:i-1)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    secondDerivative at:1 put:0.0 asPoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    secondDerivative at:size put:0.0 asPoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    "/ Compute the values of the first and third derivative 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    "/ from the second derivative and the values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    valuesI := values at:1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
    valuesI1 := values at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
    twoDerivI := secondDerivative at:1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    twoDerivI1 := secondDerivative at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
    1 to:size-1 do:[:i |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
        firstDerivative at:i put:valuesI1 - valuesI - (twoDerivI * 2.0 + twoDerivI1 / 6.0).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
        thirdDerivative at:i put:twoDerivI1 - twoDerivI.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
        size-1 == i ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
            twoDerivI := twoDerivI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
            twoDerivI1 := secondDerivative at:i+2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
            valuesI := valuesI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
            valuesI1 := values at:i+2
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    "/ The derivative collections should be OrderedCollections.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    firstDerivative := firstDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    secondDerivative := secondDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    thirdDerivative := thirdDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    "Created: 8.5.1996 / 18:39:31 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    "Modified: 8.5.1996 / 19:44:36 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
computeLineSegments
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    "compute a series of approximating lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
    |lines 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
     n " {Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
     nSteps " {Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
     steps
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
     a b c d t|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
283
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   435
    lines notNil ifTrue:[ ^ lines].
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
    controlPoints size < 3 ifTrue:[^ controlPoints].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
    "/ Make sure that the function and its derivatives are up to date.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    self validateDerivatives.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
    "/ Create a polygon for plotting.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
    lines := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
    lines add:function first.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    "/ Approximate each spline knot.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
    n := function size - 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
    1 to:n do: [:k | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
        "/ Compute the Taylor series coefficients.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
        d := function at:k.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
        c := firstDerivative at:k.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
        b := (secondDerivative at:k) / 2.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
        a := (thirdDerivative at:k) / 6.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
        "/ Compute the number of approximating segments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
        steps := (secondDerivative at:k) abs + (secondDerivative at:k + 1) abs.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
        steps := 5 max:(steps x + steps y) // 100.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
        "/ Add each of the approximating line segments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
        nSteps := steps.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
        1 to:nSteps do:[:j | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
            t := j asFloat / steps.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
            lines add: a * t + b * t + c * t + d
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
        ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
        "/ Add the last line to the real spline endpoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
        lines add: (function at: k + 1)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
    ^ lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
    "Created: 8.5.1996 / 18:44:54 / cg"
283
59a8cfbc1e5e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 281
diff changeset
   474
    "Modified: 8.5.1996 / 20:45:10 / cg"
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
validateDerivatives
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
    "Make sure that the function and derivative arrays are still valid.  
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
     If they are not, recompute them."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
    |index "{ Class: SmallInteger }"|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
    "/
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
    "/ Compute the derivatives if the cached function has not been computed.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
    "/
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
    function isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
        ^ self computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
    "/ Compute the derivatives if the cached function 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
    "/ and the collection of points do not agree."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
    index := 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
    controlPoints do:[:point |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
        point ~~ (function at:index) ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
            ^ self computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
        ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
        index := index + 1
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    "Created: 8.5.1996 / 18:31:46 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
    "Modified: 8.5.1996 / 18:32:39 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
!Spline methodsFor:'queries'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   507
bounds
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   508
    "return the smallest enclosing rectangle"
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   509
332
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   510
    |l minX maxX minY maxY|
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   511
332
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   512
    lines isNil ifTrue:[
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   513
        lines := self computeLineSegments.
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   514
    ].
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   515
    l := lines.
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   516
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   517
    minX := maxX := l first x rounded.
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   518
    minY := maxY := l first y rounded.
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   519
    l do:[:p |
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   520
        |x y|
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   521
332
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   522
        (x := p x rounded) < minX ifTrue:[
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   523
            minX := x
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   524
        ] ifFalse:[
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   525
            x > maxX ifTrue:[
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   526
                maxX := x
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   527
            ]
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   528
        ].
388
9f1c439ad66b oops - bounds was wrong
Claus Gittinger <cg@exept.de>
parents: 374
diff changeset
   529
        (y := p y rounded) < minY ifTrue:[
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   530
            minY := y
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   531
        ] ifFalse:[
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   532
            y > maxY ifTrue:[
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   533
                maxY := y
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   534
            ]
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   535
        ].
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   536
    ].
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   537
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   538
    ^ Rectangle left:minX right:maxX top:minY bottom:maxY
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   539
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   540
    "Created: 13.5.1996 / 00:27:29 / cg"
332
bb2dd1a968c2 bounds may be larger than controlPoint-bounds
Claus Gittinger <cg@exept.de>
parents: 331
diff changeset
   541
    "Modified: 13.5.1996 / 11:02:29 / cg"
327
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   542
!
1fcf1500a9c0 add #bounds
Claus Gittinger <cg@exept.de>
parents: 289
diff changeset
   543
374
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   544
canBeFilled
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   545
    "return true, if the receiver can be drawn as a filled geometric.
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   546
     Always true here."
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   547
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   548
    ^ true
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   549
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   550
!
a77f804c605e added #canBeFilled for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 332
diff changeset
   551
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
isCyclic
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    "return true, if this spline represents a closed curve"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
    ^ controlPoints size > 3 and: [controlPoints first = controlPoints last].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
    "Created: 8.5.1996 / 18:47:50 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
!Spline class methodsFor:'documentation'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
version
388
9f1c439ad66b oops - bounds was wrong
Claus Gittinger <cg@exept.de>
parents: 374
diff changeset
   563
    ^ '$Header: /cvs/stx/stx/libbasic2/Spline.st,v 1.12 1996-06-05 11:54:34 cg Exp $'
278
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
! !