Spline.st
author Claus Gittinger <cg@exept.de>
Wed, 08 May 1996 19:45:40 +0200
changeset 278 dde5b4f52ba5
child 279 cb9df1c2f620
permissions -rw-r--r--
intitial checkin
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 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    connected by a third order curve.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    [author:]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        scaletti@uxc.cso.uiuc.edu (Kurt J. Hebel)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
examples
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
                                                                        [exBegin]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    |v points eventCatcher|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    v := StandardSystemView extent:(450 @ 450).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    v label:'Spline Example - (click left/middle)'.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    points := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    v openAndWait.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    eventCatcher := Plug new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    eventCatcher respondTo:#handlesButtonPress:inView:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
                      with:[:butt :view | true].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    eventCatcher respondTo:#buttonPress:x:y:view:
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
                      with:[:butt :x :y :view | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
                            v paint:(Color white).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
                            v fillCircle:(x @ y) radius:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
                            points add:(x @ y).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
                            (butt == 1 or:[butt == #select]) ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
                                v paint:(Color white).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
                                v fillCircle:(x @ y) radius:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
                                (Spline controlPoints:points) displayStrokedOn:v.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
                                points := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
                            ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
                           ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    v delegate:(eventCatcher)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
                                                                        [exEnd]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
!Spline class methodsFor:'instance creation'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
controlPoints:aSequentialCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    "return a new spline, which passes through aSequentialCollectionOfPoints"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    ^ self new controlPoints:aSequentialCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!Spline methodsFor:'accessing'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
controlPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    "return the collection of points through which the spline is
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
     to pass"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    ^ controlPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    "Created: 8.5.1996 / 18:46:35 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
controlPoints:aCollectionOfPoints
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    "set the collection of points through which the spline is
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
     to pass"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    controlPoints := aCollectionOfPoints.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    lines := nil
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    "Created: 8.5.1996 / 18:50:24 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    "Modified: 8.5.1996 / 19:32:57 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
!Spline methodsFor:'converting'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
asPolyline
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    "return a polygon, approximating the spline"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    ^ Polygon vertices:(self computeLineSegments)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
    "Created: 8.5.1996 / 18:49:42 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
!Spline methodsFor:'displaying'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
displayFilledOn:aGC 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    "Display this Spline as a filled polygon from approximated lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    lines isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
        lines := self computeLineSegments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    aGC fillPolygon:lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    "Modified: 8.5.1996 / 18:45:49 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    "Created: 8.5.1996 / 18:54:12 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
displayStrokedOn:aGC 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    "Display this Spline as a series of approximating lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    lines isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
        lines := self computeLineSegments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "/ Plot the lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
    aGC displayPolygon:lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
    "Created: 8.5.1996 / 18:44:17 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
    "Modified: 8.5.1996 / 18:45:49 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
!Spline methodsFor:'private'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
    "Compute an array for the derivatives at each knot."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    |size values cyclic second third secondFromLast thirdFromLast
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
     addedExtra|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    "/ Get the number of points, 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    "/ and make an OrderedColleciton of all of the points."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    size := controlPoints size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    function := OrderedCollection new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    controlPoints do:[:point | function addLast:point].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    "/ stop if the spline has not enough points for the derivation(s).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    size < 3 ifTrue: [^ self].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    "/ Flag whether curve is cyclic or not.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    cyclic := size > 3 and: [function first = function last].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    "/ Set up the values collection.  The derivatives are computed from this.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    values := function copy.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    "/ Process cyclic curves differently.  
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    "/ Add the last two points to the beginning,
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    "/ and the first two points to the end, so that the derivative calculation 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
    "/ can look at a cycle."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    cyclic ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
        second := values at: 2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
        third := values at: 3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
        thirdFromLast := values at: size - 2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
        secondFromLast := values at: size - 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
        values addFirst: secondFromLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
        values addFirst: thirdFromLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
        values addLast: second.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
        values addLast: third
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
        size == 3 ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
            addedExtra := true.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
            values addLast:(values last).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
        ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
            addedExtra := false
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    "/ Compute the derivatives of the values collection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    self computeDerivatives:values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
    "/ Remove any extra points which were added if the Spline is cyclic.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    cyclic ifTrue:  [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
        firstDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
        firstDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
        firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
        firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
        secondDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
        secondDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
        secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
        secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
        thirdDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
        thirdDerivative removeFirst.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
        thirdDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
        thirdDerivative removeLast
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    ] ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
        addedExtra ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
            firstDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
            secondDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
            thirdDerivative removeLast.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    "Created: 8.5.1996 / 18:34:43 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    "Modified: 8.5.1996 / 19:43:51 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
computeDerivatives: values
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    "Computes the first, second and third derivatives at each point 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
     in the collection values."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    |size "{Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
     v b 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
     lastV lastB nextV nextB 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
     valuesI valuesI1 valuesI2 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
     twoDerivI twoDerivI1|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    "/ Set up the derivative arrays.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    size := values size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    size < 3 ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
        'SPLINE: not enough controlPoints' errorPrintNL. 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
        ^ self
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    firstDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
    secondDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    thirdDerivative := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    "/ Compute the second derivative of the values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    size > 3 ifTrue: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
        lastV := 4.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
        lastB := 6.0 * (values first - ((values at:2) * 2.0) + (values at:3)).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
        v := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
        b := Array new:size.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
        v at: 1 put:lastV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
        b at: 1 put:lastB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
        valuesI := values at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
        valuesI1 := values at:3.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
        size > 3 ifTrue: [valuesI2 := values at:4].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
        2 to:size-2 do: [:i |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
            nextV := 4.0 - (1.0 / lastV).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
            nextB := 6.0 * (valuesI - (valuesI1 * 2.0) + valuesI2) - (lastB / lastV).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
            v at:i put:nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
            b at:i put:nextB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
            size-2 == i ifFalse: [
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
                lastV := nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
                lastB := nextB.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
                valuesI := valuesI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
                valuesI1 := valuesI2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
                valuesI2 := values at:i+3
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
            ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
        ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
        secondDerivative at:size-1 put:nextB/nextV.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
        size-2 to:2 by:-1 do: [:i | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
            secondDerivative at:i 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
                            put:(b at:i-1) 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
                                 - (secondDerivative at:i+1) / (v at:i-1)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
        ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    secondDerivative at:1 put:0.0 asPoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
    secondDerivative at:size put:0.0 asPoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    "/ Compute the values of the first and third derivative 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    "/ from the second derivative and the values.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
    valuesI := values at:1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    valuesI1 := values at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    twoDerivI := secondDerivative at:1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    twoDerivI1 := secondDerivative at:2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    1 to:size-1 do:[:i |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
        firstDerivative at:i put:valuesI1 - valuesI - (twoDerivI * 2.0 + twoDerivI1 / 6.0).
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
        thirdDerivative at:i put:twoDerivI1 - twoDerivI.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        size-1 == i ifFalse:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
            twoDerivI := twoDerivI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
            twoDerivI1 := secondDerivative at:i+2.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
            valuesI := valuesI1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
            valuesI1 := values at:i+2
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
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    "/ The derivative collections should be OrderedCollections.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    firstDerivative := firstDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    secondDerivative := secondDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    thirdDerivative := thirdDerivative asOrderedCollection.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
    "Created: 8.5.1996 / 18:39:31 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    "Modified: 8.5.1996 / 19:44:36 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
computeLineSegments
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    "compute a series of approximating lines."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
    |lines 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
     n " {Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
     nSteps " {Class: SmallInteger }"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
     steps
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
     a b c d t|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    controlPoints size < 3 ifTrue:[^ controlPoints].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    "/ Make sure that the function and its derivatives are up to date.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    self validateDerivatives.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    "/ Create a polygon for plotting.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    lines := OrderedCollection new.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    lines add:function first.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
    "/ Approximate each spline knot.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
    n := function size - 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    1 to:n do: [:k | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
        "/ Compute the Taylor series coefficients.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
        d := function at:k.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
        c := firstDerivative at:k.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
        b := (secondDerivative at:k) / 2.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
        a := (thirdDerivative at:k) / 6.0.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
        "/ Compute the number of approximating segments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
        steps := (secondDerivative at:k) abs + (secondDerivative at:k + 1) abs.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
        steps := 5 max:(steps x + steps y) // 100.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
        "/ Add each of the approximating line segments.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
        nSteps := steps.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
        1 to:nSteps do:[:j | 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
            t := j asFloat / steps.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
            lines add: a * t + b * t + c * t + d
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
        "/ Add the last line to the real spline endpoint.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
        lines add: (function at: k + 1)
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    ^ lines
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    "Created: 8.5.1996 / 18:44:54 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    "Modified: 8.5.1996 / 19:33:30 / cg"
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
validateDerivatives
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    "Make sure that the function and derivative arrays are still valid.  
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
     If they are not, recompute them."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    |index "{ Class: SmallInteger }"|
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    "/
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
    "/ Compute the derivatives if the cached function has not been computed.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
    "/
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    function isNil ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
        ^ self computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    "/ Compute the derivatives if the cached function 
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
    "/ and the collection of points do not agree."
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    index := 1.
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
    controlPoints do:[:point |
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
        point ~~ (function at:index) ifTrue:[
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
            ^ self computeCurve
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
        ].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
        index := index + 1
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    ]
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    "Created: 8.5.1996 / 18:31:46 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    "Modified: 8.5.1996 / 18:32:39 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
!Spline methodsFor:'queries'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
isCyclic
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    "return true, if this spline represents a closed curve"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    ^ controlPoints size > 3 and: [controlPoints first = controlPoints last].
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
    "Created: 8.5.1996 / 18:47:50 / cg"
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
! !
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
!Spline class methodsFor:'documentation'!
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
version
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    ^ '$Header: /cvs/stx/stx/libbasic2/Spline.st,v 1.1 1996-05-08 17:45:40 cg Exp $'
dde5b4f52ba5 intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
! !