[Cuis-dev] AbstractVectorCanvas method to draw ovals

Juan Vuletich juan at cuis.st
Wed Mar 5 13:14:45 PST 2025


Hi Mark,

I expected more what https://en.wikipedia.org/wiki/Oval describes as a 
"technical drawing oval". This could perhaps be called a 'Stadium'. 
Additionally, in VectorCanvas, coordinates describe the points that the 
pen goes through, not a rectangle where the figure is contained.

I suggest this:

stadium: aRectangle
     "
| r |
r := 500 at 150 extent: 100 at 250.
(VectorCanvas onForm: Display)
     strokeWidth: 2.0 color: Color red do: [ :canvas |
             canvas stadium: r ].
(VectorCanvas onForm: Display)
     geometryTransformation: (AffineTransformation withRadians: 1 scale: 
1.2 position: 200 at 100);
     strokeWidth: 2.0 color: Color red do: [ :canvas |
         canvas
             stadium: r ].
Display forceToScreen
"
     | height p1 p2 p3 p4 radius width x1 x2 y1 y2 |
     width := aRectangle width.
     height := aRectangle height.
     radius := (width min: height) / 2.
     height < width
         ifTrue: [
             x1 := aRectangle left + radius.
             x2 := aRectangle right - radius.
             y1 := aRectangle top.
             y2 := aRectangle bottom.
             p1 := x1 @ y1.
             p2 := x2 @ y1.
             p3 := x2 @ y2.
             p4 := x1 @ y2 ]
         ifFalse: [
             x1 := aRectangle left.
             x2 := aRectangle right.
             y1 := aRectangle top + radius.
             y2 := aRectangle bottom - radius.
             p1 := x1 @ y2.
             p2 := x1 @ y1.
             p3 := x2 @ y1.
             p4 := x2 @ y2].
     self
         moveTo: p1;
         lineTo: p2;
         arcTo: p3 radius: radius angleOfXAxis: 0 largeFlag: false 
sweepFlag: true;
         lineTo: p4;
         arcTo: p1 radius: radius angleOfXAxis: 0 largeFlag: false 
sweepFlag: true.

Would this work?

On 3/5/2025 4:19 PM, Mark Volkmann via Cuis-dev wrote:
> Below is the AbstractVectorCanvas method I mentioned in the meetup 
> today for drawing an oval. Here is an example of using it from a 
> drawOn: method of a morph. See the TODO comment below related to 
> getting the stroke width. I'm open to suggestions for improving this.
>
> aCanvas strokeWidth: 5 color: Color red fillColor: Color yellow do: [
>     aCanvas drawOval: rect strokeWidth: 5.
> ].
>
> ---
>
> drawOval: aRect strokeWidth: aStrokeWidth
>     | diameter halfStrokeWidth height p1 p2 p3 p4
>       radius strokeWidth width x1 x2 y1 y2 |
>
>     width := aRect width.
>     height := aRect height.
>
> "TODO: Why does this give the wrong value?"
> "strokeWidth := engine strokeWidth."
> strokeWidth := aStrokeWidth.
> halfStrokeWidth := strokeWidth / 2.
> diameter := (height min: width) - strokeWidth.
> radius := diameter / 2.
>
> height < width
> ifTrue: [
> x1 := halfStrokeWidth + radius.
> x2 := width - x1.
> y1 := halfStrokeWidth.
> y2 := height - y1.
> p1 := x1 @ y1.
> p2 := x2 @ y1.
> p3 := x2 @ y2.
> p4 := x1 @ y2.
> ]
> ifFalse: [
> x1 := halfStrokeWidth.
> y1 := halfStrokeWidth + radius.
> x2 := width - x1.
> y2 := height - y1.
> p1 := x1 @ y2.
> p2 := x1 @ y1.
> p3 := x2 @ y1.
> p4 := x2 @ y2.
> ].
>
> self
> moveTo: p1;
> lineTo: p2;
> arcTo: p3 radius: radius angleOfXAxis: 0 largeFlag: false sweepFlag: true;
> lineTo: p4;
> arcTo: p1 radius: radius angleOfXAxis: 0 largeFlag: false sweepFlag: true.
>
> -- 
> R. Mark Volkmann
> Object Computing, Inc.


-- 
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250305/9b95593c/attachment.htm>


More information about the Cuis-dev mailing list