Pikchr

arc, but part of an ellipse, not a circle?
Login

arc, but part of an ellipse, not a circle?

(1) By Zellyn Hunter (zellyn) on 2025-01-16 19:55:06 [link] [source]

Is there a way to create the equivalent of an arc, but with a piece of an ellipse rather than a piece of a circle?

(2) By anonymous on 2025-01-17 13:21:35 in reply to 1 [link] [source]

Depends on how hands-on and scrappy you want your solution to be.

Arc is not the only primitive, don't forget spline, but there are always options.

Splines:

spline left 1 then go down 0.3 left 0.5 then go down 0.2 radius 1

move down 0.2

right

spline go 0.1 s then 0.25 se then 0.5 e

Real hacky stuff

ellipse width 3 height 2
box with nw at last ellipse.w width 3 height 1 color white fill white
box with nw at last ellipse.n width 1.5 height 1 color white fill white

move down 1
move left until even with last ellipse.w
right

line up 0.1 right 0 then up 0.18 right 0.08 then up 0.15 right 0.2 then up 0.1 right 0.8 then right 0.3 radius 0.5

move down 1
move left until even with last ellipse.w
right

line go 0.15 n then 0.3 ne then go 0.4 e then go 0.4 e then go 0.3 se then go 0.15 s rad 1

(3) By spindrift on 2025-01-17 21:39:01 in reply to 2 [link] [source]

They certainly are rather crude.

(4) By anonymous on 2025-03-16 18:55:13 in reply to 1 [source]

It may be worth pointing out that the implementation notes state that "arcs are here rendered as quadratic Bezier curves rather than true arcs."

This can be confirmed by drawing an arc on top of a circle and noting the slight non-conformity.

circle thin color red
arc from previous.s thin color blue

The implementation details show that the control-point of the quadratic Bezier curve is calculated as a function of the from-point and the to-point. In other words, the control-point cannot be arbitrarily set for an arc primitive.

However, Pikchr allows for a fairly simple manual construction of a quadratic Bezier curve, including an arbitrarily set control-point. Putting this into a simple marco produces an arc-like curve approximation of an ellipse.

define drawQuadraticBezier {
   line from $1 \
      to 1/20 between 1/20 between $1 and $3 and 1/20 between $3 and $2 \
      to 2/20 between 2/20 between $1 and $3 and 2/20 between $3 and $2 \
      to 3/20 between 3/20 between $1 and $3 and 3/20 between $3 and $2 \
      to 4/20 between 4/20 between $1 and $3 and 4/20 between $3 and $2 \
      to 5/20 between 5/20 between $1 and $3 and 5/20 between $3 and $2 \
      to 6/20 between 6/20 between $1 and $3 and 6/20 between $3 and $2 \
      to 7/20 between 7/20 between $1 and $3 and 7/20 between $3 and $2 \
      to 8/20 between 8/20 between $1 and $3 and 8/20 between $3 and $2 \
      to 9/20 between 9/20 between $1 and $3 and 9/20 between $3 and $2 \
      to 10/20 between 10/20 between $1 and $3 and 10/20 between $3 and $2 \
      to 11/20 between 11/20 between $1 and $3 and 11/20 between $3 and $2 \
      to 12/20 between 12/20 between $1 and $3 and 12/20 between $3 and $2 \
      to 13/20 between 13/20 between $1 and $3 and 13/20 between $3 and $2 \
      to 14/20 between 14/20 between $1 and $3 and 14/20 between $3 and $2 \
      to 15/20 between 15/20 between $1 and $3 and 15/20 between $3 and $2 \
      to 16/20 between 16/20 between $1 and $3 and 16/20 between $3 and $2 \
      to 17/20 between 17/20 between $1 and $3 and 17/20 between $3 and $2 \
      to 18/20 between 18/20 between $1 and $3 and 18/20 between $3 and $2 \
      to 19/20 between 19/20 between $1 and $3 and 19/20 between $3 and $2 \
      to $2 \
   thin color blue
}

ellipse thin color red
FROM: previous ellipse .e
TO: previous ellipse .s
CONTROL: (FROM,TO)
drawQuadraticBezier(FROM, TO, CONTROL)

Having this macro (with as many line segments needed for a curve as smooth as needed) allows for arbitrary curves between arbitrary points with complete control of the curve.

HERE THERE HERE THERE
define drawQuadraticBezier {
   line from $1 \
      to 1/20 between 1/20 between $1 and $3 and 1/20 between $3 and $2 \
      to 2/20 between 2/20 between $1 and $3 and 2/20 between $3 and $2 \
      to 3/20 between 3/20 between $1 and $3 and 3/20 between $3 and $2 \
      to 4/20 between 4/20 between $1 and $3 and 4/20 between $3 and $2 \
      to 5/20 between 5/20 between $1 and $3 and 5/20 between $3 and $2 \
      to 6/20 between 6/20 between $1 and $3 and 6/20 between $3 and $2 \
      to 7/20 between 7/20 between $1 and $3 and 7/20 between $3 and $2 \
      to 8/20 between 8/20 between $1 and $3 and 8/20 between $3 and $2 \
      to 9/20 between 9/20 between $1 and $3 and 9/20 between $3 and $2 \
      to 10/20 between 10/20 between $1 and $3 and 10/20 between $3 and $2 \
      to 11/20 between 11/20 between $1 and $3 and 11/20 between $3 and $2 \
      to 12/20 between 12/20 between $1 and $3 and 12/20 between $3 and $2 \
      to 13/20 between 13/20 between $1 and $3 and 13/20 between $3 and $2 \
      to 14/20 between 14/20 between $1 and $3 and 14/20 between $3 and $2 \
      to 15/20 between 15/20 between $1 and $3 and 15/20 between $3 and $2 \
      to 16/20 between 16/20 between $1 and $3 and 16/20 between $3 and $2 \
      to 17/20 between 17/20 between $1 and $3 and 17/20 between $3 and $2 \
      to 18/20 between 18/20 between $1 and $3 and 18/20 between $3 and $2 \
      to 19/20 between 19/20 between $1 and $3 and 19/20 between $3 and $2 \
      to $2 \
   thin color blue
}

HERE: box "HERE"
THERE: box "THERE" with nw at .25 right of .25 below HERE.se
CONTROL: (0.5625 right of THERE.ne,0.25 above THERE.ne)
drawQuadraticBezier(HERE.e, THERE.e, CONTROL)

HERE: box "HERE" with w at 2 right of HERE.e
THERE: box "THERE" with w at 2 right of THERE.e
CONTROL: (1 right of THERE.ne,1 above THERE.ne)
drawQuadraticBezier(HERE.e, THERE.e, CONTROL)

I'd assume similar macros could be defined for cubic Bezier curves, but since quadratic is used for arc and is easier to build, it seems appropriate here as well. I don't know if that's easier or overkill compared to trying to use splines, which I've never really dabbled with.