
Class: Spline
Object

+Geometric

+Spline

+ArrowedSpline
 Package:
 stx:libbasic2
 Category:
 GraphicsGeometryObjects
 Version:
 rev:
1.23
date: 2022/03/08 22:47:40
 user: cg
 file: Spline.st directory: libbasic2
 module: stx stcclassLibrary: libbasic2
Spline defines a path that includes an arbitrary collection of points
connected by a third order curve. The curve passes through all controlPoints.
Both open and closed curves are possible.
copyrightThis class is based on a file from the Manchester Goodie library.
It is not covered by the ST/X copyright and may be copied and used
according the rules as stated by the athor and the manchester archive.
The original readme was:
The above file is a Manchester Goodie. It is distributed freely on condition
that you observe these conditions in respect of the whole Goodie, and on
any significant part of it which is separately transmitted or stored:
* You must ensure that every copy includes this notice, and that
source and author(s) of the material are acknowledged.
* These conditions must be imposed on anyone who receives a copy.
* The material shall not be used for commercial gain without the prior
written consent of the author(s).
For more information about the Manchester Goodies Library (from which
this file was distributed) send email:
To: goodieslib@cs.man.ac.uk
Subject: help
instance creation

> controlPoints:">controlPoints: aSequentialCollectionOfPoints

return a new spline, which passes through aSequentialCollectionOfPoints
accessing

> controlPoints">controlPoints

return the collection of points through which the spline is to pass

> controlPoints:">controlPoints: aCollectionOfPoints

set the collection of points through which the spline is to pass
converting

> asPointArray">asPointArray

return an array containing my approximated vertex points.

> asPolygon">asPolygon

return a polygon, approximating the spline

> asPolyline">asPolyline

same as #asPolygon  for ST80 compatibility
displaying

> displayFilledOn:">displayFilledOn: aGC

Display this Spline as a filled polygon from approximated lines.

> displayStrokedOn:">displayStrokedOn: aGC

Display this Spline as a series of approximating lines.
private

> computeCurve">computeCurve

Compute an array for the derivatives at each knot.

> computeDerivatives:">computeDerivatives: values

Computes the first, second and third derivatives at each point
in the collection values.

> computeLineSegments">computeLineSegments

compute a series of approximating lines.

> validateDerivatives">validateDerivatives

Make sure that the function and derivative arrays are still valid.
If they are not, recompute them.
queries

> computeBounds">computeBounds

return the smallest enclosing rectangle

> isCyclic">isCyclic

return true, if this spline represents a closed curve
testing

> canBeFilled">canBeFilled

return true, if the receiver can be drawn as a filled geometric.
Always true here.
transformations

> transformedBy:">transformedBy: aMatrix

return a new spline which is me transformed by aMatrix
open spline; filled & unfilled:
v s
v := (View extent:200@200) openAndWaitUntilVisible.
v transformation:(WindowingTransformation
scale:1
translation:(100@100)).
v paint:Color black.
v displayLineFrom:(90@0) to:(90@0).
v displayLineFrom:(0@90) to:(0@90).
v paint:Color lightGrey.
v displayLineFrom:(60@90) to:(60@90).
v displayLineFrom:(90@20) to:(90@20).
v displayLineFrom:(90@80) to:(90@80).
s := Spline controlPoints:
(Array with:(20@20)
with:(50@50)
with:(20@80)).
v paint:Color blue.
s displayFilledOn:v.
v paint:Color red.
s displayStrokedOn:v.

v s
v := (View extent:100@100) openAndWaitUntilVisible.
s := Spline controlPoints:
(Array with:(20@20)
with:(80@80)
with:(20@80)).
v paint:Color blue.
s displayFilledOn:v.
v paint:Color red.
s displayStrokedOn:v.

closed spline; filled & unfilled:
v s
v := (View extent:100@100) openAndWaitUntilVisible.
s := Spline controlPoints:
(Array with:(20@20)
with:(80@80)
with:(20@80)
with:(20@20)).
v paint:Color blue.
s displayFilledOn:v.
v paint:Color red.
s displayStrokedOn:v.

spiral:
v points s
v := View extent:(200 @ 200).
v openAndWaitUntilVisible.
points := OrderedCollection new.
90 to:10 by:10 do:[:r 
0 to:330 by:30 do:[:angle 
d
d := (angle / 360) * 10.
points add:(Point r:rd angle:angle) + (100@100)
].
].
s := Spline controlPoints:points.
v paint:Color red.
s displayStrokedOn:v.
 interactive example:
clickleft for firstpoints; right for last.
v points eventCatcher
v := StandardSystemView extent:(450 @ 450).
v label:'Spline Example  (click left/middle)'.
points := OrderedCollection new.
v viewBackground:Color black.
v openAndWaitUntilVisible.
eventCatcher := Plug new.
eventCatcher respondTo:#handlesButtonPress:inView:
with:[:butt :view  true].
eventCatcher respondTo:#buttonPress:x:y:view:
with:[:butt :x :y :view 
v paint:(Color white).
v fillCircle:(x @ y) radius:3.
points add:(x @ y).
(butt == 1 or:[butt == #select]) ifFalse:[
v paint:(Color white).
v fillCircle:(x @ y) radius:3.
(Spline controlPoints:points) displayStrokedOn:v.
points := OrderedCollection new.
]
].
v delegate:(eventCatcher)

