[Cuis-dev] AbstractVectorCanvas method to draw ovals

Mark Volkmann r.mark.volkmann at gmail.com
Wed Mar 5 14:42:01 PST 2025


Yes, I love it! I think I was taught the wrong meaning of the word "oval"
in grade school and never learned the correct definition despite having a
B.S. in Math. ;-)
Stadium it is!

Let me know when your version is pushed and I'll change my Switch morph to
use the stadium method.

On Wed, Mar 5, 2025 at 3:14 PM Juan Vuletich <juan at cuis.st> wrote:

> 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 Vuletichcuis.stgithub.com/jvuletichresearchgate.net/profile/Juan-Vuletichindependent.academia.edu/JuanVuletichpatents.justia.com/inventor/juan-manuel-vuletichlinkedin.com/in/juan-vuletich-75611b3twitter.com/JuanVuletich
>
>

-- 
R. Mark Volkmann
Object Computing, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20250305/37f60394/attachment-0001.htm>


More information about the Cuis-dev mailing list