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