cetz-plot icon indicating copy to clipboard operation
cetz-plot copied to clipboard

Fill only outside of a circle contour

Open Andrew15-5 opened this issue 2 years ago • 1 comments

When using x² + y² + op: ">=" + z: 9 + fill: true it fills outside the circle and inside of it (although it works as expected with hyperbola).

https://github.com/johannes-wolf/cetz/issues/270#issuecomment-1775489607:

This is very complicated to solve as of now. Please create a separate ticket for this. Detecting holes is a contour is currently not supported. We could test if a polygon lies insides another polygon. BUT Typst is currently unable to draw paths with holes in them.

code
#import "@local/cetz:0.1.2"

#cetz.canvas({
  import cetz.draw: *
  import cetz.plot
  let get-style(color) = {
    let (r, g, b, ..) = color.to-rgba()
    (line: (stroke: rgb(r, g, b) + 1pt, fill: color.lighten(25%)))
  }
  let x-min = -10
  let x-max = 10
  let y-min = -10
  let y-max = 10
  let width = x-max - x-min
  let height = y-max - y-min
  plot.plot(size: (15, 15), {
    // circle
    plot.add-contour(
      (x, y) => (calc.pow((x - 1), 2) + calc.pow((y - 1), 2)),
      op: ">=",
      z: 9,
      x-domain: (x-min, x-max),
      y-domain: (y-min, y-max),
      x-samples: 50,
      y-samples: 50,
      fill: true,
      style: get-style(rgb("#2D6FB47F")), // blue
    )
  })
})
screenshot

image

This issue was tested against redesign-internals#742d560.

Andrew15-5 avatar Oct 23 '23 15:10 Andrew15-5

Note: This is possible by splitting the fill path in 2 halves, if the inner polygon is completely insides the outer polygon.

johannes-wolf avatar Oct 23 '23 21:10 johannes-wolf