Source: Circle.js

import { Plot } from "./Plot.js";

/** Class representing a circle. */
export class Circle {
  /**
   * Create a circle.
   * @param {number} x - The x value of the centre.
   * @param {number} y - The y value of the centre.
   * @param {number} radius - The radius.
   * @param {Object} options
   * @param {string} [options.stroke = "black"]
   * @param {number} [options.strokeWidth = 0.1]
   * @param {string} [options.fill = "none"]
   */
  constructor(
    x,
    y,
    radius,
    { stroke, strokeWidth, fill = "none" } = {},
  ) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    const plot = Plot.getContext();
    this.stroke = stroke !== undefined ? stroke : plot?.stroke || "black";
    this.strokeWidth = strokeWidth !== undefined ? strokeWidth : plot?.strokeWidth || 0.1;
    this.fill = fill;
  }

	/**
	 * Create a circle from a Vector object and a radius.
	 * @param {Vector} vector - The position of the centre of the circle.
	 * @param {number} radius - The radius.
	 * @returns {Circle}
	 */
	static fromVector(vector, radius) {
		return new Circle(vector.x, vector.y, radius);
	}

  /**
   *
   * @returns {SVGElement}
   */
  toSVGElement() {
    let element = document.createElementNS(
      "http://www.w3.org/2000/svg",
      "circle",
    );
    element.setAttribute("cx", this.x);
    element.setAttribute("cy", this.y);
    element.setAttribute("r", this.radius);
    element.setAttribute("stroke", this.stroke);
    element.setAttribute("fill", this.fill);
    element.setAttribute("stroke-width", `${this.strokeWidth}`);

    return element;
  }
}