|
Class: Spline
Object
|
+--Geometric
|
+--Spline
|
+--ArrowedSpline
- Package:
- stx:libbasic2
- Category:
- Graphics-Geometry-Objects
- Version:
- rev:
1.23
date: 2022/03/08 22:47:40
- user: cg
- file: Spline.st directory: libbasic2
- module: stx stc-classLibrary: 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 e-mail:
To: goodies-lib@cs.man.ac.uk
Subject: help
instance creation
-
controlPoints: aSequentialCollectionOfPoints
-
return a new spline, which passes through aSequentialCollectionOfPoints
accessing
-
controlPoints
-
return the collection of points through which the spline is to pass
-
controlPoints: aCollectionOfPoints
-
set the collection of points through which the spline is to pass
converting
-
asPointArray
-
return an array containing my approximated vertex points.
-
asPolygon
-
return a polygon, approximating the spline
-
asPolyline
-
same as #asPolygon - for ST-80 compatibility
displaying
-
displayFilledOn: aGC
-
Display this Spline as a filled polygon from approximated lines.
-
displayStrokedOn: aGC
-
Display this Spline as a series of approximating lines.
private
-
computeCurve
-
Compute an array for the derivatives at each knot.
-
computeDerivatives: values
-
Computes the first, second and third derivatives at each point
in the collection values.
-
computeLineSegments
-
compute a series of approximating lines.
-
validateDerivatives
-
Make sure that the function and derivative arrays are still valid.
If they are not, recompute them.
queries
-
computeBounds
-
return the smallest enclosing rectangle
-
isCyclic
-
return true, if this spline represents a closed curve
testing
-
canBeFilled
-
return true, if the receiver can be drawn as a filled geometric.
Always true here.
transformations
-
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:r-d angle:angle) + (100@100)
].
].
s := Spline controlPoints:points.
v paint:Color red.
s displayStrokedOn:v.
| interactive example:
click-left for first-points; 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)
|
|