
Class: Geometric
Object

+Geometric

+Bezier

+Circle

+Curve

+EllipticalArc

+LineSegment

+Polygon

+Rectangle

+Spline
 Package:
 stx:libbasic
 Category:
 GraphicsGeometryObjects
 Version:
 rev:
1.37
date: 2017/02/22 17:58:25
 user: cg
 file: Geometric.st directory: libbasic
 module: stx stcclassLibrary: libbasic
 Author:
 Claus Gittinger
Abstract superclass for geometric figures.
Concrete classes are (currently) Rectangle, Polygon and the classes
found in goodies/shape.
These are not graphical objects, but pure mathematical ones.
I.e. instances do not carry graphics attributes such as color, lineWidth etc.
However, they ``know'' how to display themself as stroked or possibly
filled picture on a graphicsContext (although, the GC's current
paint and lineStyles are used).
Use instances of (subclasses) of DisplayObject or
of the GeometricWrapper classes for objects which keep the color
and lineStyle information with them.
Notice:
ST/X does not use Geometric instances for drawing (yet).
Except for Rectangle, Geometry and its subclasses exists mainly
for ST80 compatibility and to provide a home when other (PD)
geometry classes are to be filed in.
Rectangle
Polygon
EllipticalArc
Circle
Spline
Point
LineSegment
Curve
Arrow
ArrowedSpline
GraphicsContext
StrokingWrapper
FillingWrapper
helper functions

boundingRectangleForPoints: aSequencableCollectionOfPoints

given a bunch of point, compute the boundingRectangle
(i.e. the smallest rectangle which encloses all of those points)
initialization

initialize

setup class constants
usage example(s):
queries

isAbstract

Return if this class is an abstract class.
True is returned here for myself only; false for subclasses.
Abstract subclasses must redefine this again.
converting

asFiller

return a wrapper which displays the receiver in its filled form

asRectangle

return the enclosing rectangle; same as #bounds

asStroker

return a wrapper which displays the receiver as stroked outline

asVisualComponent

return a wrapper on the receiver, which responds to VisualComponent messages.
displaying

ascentOn: aGC

displayOn: does not draw above baseline

displayFilledOn: aGC

display myself filled on a graphicsContext; the current graphics
attributes are used. Since we do not know how to do it, nothing is
drawn here.
** This method raises an error  it must be redefined in concrete classes **

displayOn: aGCOrStream

display myself on a graphicsContext; the current graphics
attributes are used. The default here is to display the outline.

displayStrokedOn: aGC

display my outline on a graphicsContext; the current graphics
attributes are used. Since we do not know how to do it, nothing is
drawn here.
** This method raises an error  it must be redefined in concrete classes **
queries

bounds

return the smallest enclosing rectangle.
This resends computeBounds, to allow caching of bounds in
case this computation is expensive.

computeBounds

return the smallest enclosing rectangle.
** This method raises an error  it must be redefined in concrete classes **

outlineIntersects: aRectangle

return true, if the receiver's image intersects
aRectangle, when drawn as an outline.
Here, all we can do is to ask the boundary rectangle;
subclasses should reimplement better checks.

regionIntersects: aRectangle

return true, if the receiver's image intersects
aRectangle, when drawn as a filled version.
Here, all we can do is to ask the boundary rectangle;
subclasses should reimplement better checks.
testing

canBeFilled

return true, if the receiver can be drawn as a filled geometric.
Return false here, since we don't know.

isBezier2Segment

return true, if the receiver is a quadratic bezier segment

isLineSegment

return true, if the receiver is a line segment
transformations

align: offset with: someCoordinate


alignBottomLeftWith: someCoordinate

return a copy of myself where its bottomLeft is aligned with someCoordinate

alignBottomRightWith: someCoordinate

return a copy of myself where its bottomRight is aligned with someCoordinate.
Same as alignCorner

alignCenterWith: someCoordinate

return a copy of myself where its center is aligned with someCoordinate.
Same as alignOrigin

alignCornerWith: someCoordinate

return a copy of myself where its corner is aligned with someCoordinate

alignOriginWith: someCoordinate

return a copy of myself where its origin is aligned with someCoordinate

alignTopLeftWith: someCoordinate

return a copy of myself where its topLeft is aligned with someCoordinate.
Same as alignOrigin

alignTopRightWith: someCoordinate

return a copy of myself where its topRight is aligned with someCoordinate.
Same as alignOrigin

scaledBy: scaleAmount

return a copy of the receiver, which is scaled by the argument,
a point or number
** This method raises an error  it must be redefined in concrete classes **

translatedBy: scaleAmount

return a copy of the receiver, which is translated by the argument,
a point or number
** This method raises an error  it must be redefined in concrete classes **
line segment:
v l
v := (View extent:100@100) openAndWait.
l := LineSegment from:10@10 to:90@90.
v paint:Color red.
l displayStrokedOn:v.
l start:90@10 end:10@90.
v paint:Color blue.
l displayStrokedOn:v.

rectangle, unfilled:
v r
v := (View extent:100@100) openAndWait.
r := Rectangle origin:10@10 corner:90@90.
v paint:Color red.
r displayStrokedOn:v.

circle; filled and unfilled:
v c
v := (View extent:200@100) openAndWait.
c := Circle boundingBox:(10@10 corner:90@90).
v paint:Color blue.
c displayFilledOn:v.
c center:150@50.
v paint:Color red.
c displayStrokedOn:v.
 circle & rectangle; both filled:
v c
v := (View extent:100@100) openAndWait.
c := Circle center:50@50 radius:40.
v paint:Color red.
c asRectangle displayFilledOn:v.
v paint:Color blue.
c displayFilledOn:v.
 elliptical arcs; filled & unfilled:
v e
v := (View extent:200@100) openAndWait.
e := EllipticalArc
boundingBox:(10@10 corner:190@90)
startAngle:0
endAngle:270.
v paint:Color blue.
e displayFilledOn:v.
v paint:Color red.
e displayStrokedOn:v.
 polygon; filled & unfilled:
v p
v := (View extent:100@100) openAndWait.
p := Polygon vertices:
(Array with:(10@10)
with:(90@90)
with:(10@90)).
v paint:Color blue.
p displayFilledOn:v.
v paint:Color red.
p displayStrokedOn:v.

circles; filled & unfilled:
v c
v := View new openAndWait.
c := Circle center:50@50 radius:40.
c displayFilledOn:v.
50 to:1 by:1 do:[:r 
c radius:r.
v paint:(Color grey:(r * 2)).
c displayStrokedOn:v.
].
1 to:50 do:[:r 
c radius:r.
v paint:(Color grey:100(r * 2)).
c displayStrokedOn:v.
]
 arcs; filled:
v ell
v := View new openAndWait.
ell := EllipticalArc
boundingBox:(10@10 corner:90@90)
startAngle:0
sweepAngle:0.
#(45 90 135 180 225 270 315 360) keysAndValuesDo:[:index :angle 
index odd ifTrue:[
v paint:Color white
] ifFalse:[
v paint:Color black
].
ell sweepAngle:angle.
ell displayFilledOn:v.
Delay waitForSeconds:0.5.
].
 arcs; filled:
v ell
v := View new openAndWait.
ell := EllipticalArc
boundingBox:(10@10 corner:90@90)
startAngle:0
sweepAngle:45.
#(45 90 135 180 225 270 315 360)
with:#( 0.125 0.25 0.375 0.5 0.625 0.75 0.875 1)
do:[:angle :grey 
ell startAngle:angle45.
v paint:(ColorValue red:grey green:0 blue:0).
ell displayFilledOn:v.
].
 spline; filled & unfilled:
v p
v := (View extent:100@100) openAndWait.
p := Spline controlPoints:
(Array with:(20@20)
with:(80@80)
with:(20@80)).
v paint:Color blue.
p displayFilledOn:v.
v paint:Color red.
p displayStrokedOn:v.

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

