withData(['value' => $value]); } } public static function zero(): self { return new self(0.0); } /** * Get diameter (2 * radius) */ public function getDiameter(): float { return $this->value * 2; } /** * Get circumference (2 * π * radius) */ public function getCircumference(): float { return 2 * M_PI * $this->value; } /** * Get area (π * radius²) */ public function getArea(): float { return M_PI * $this->value * $this->value; } /** * Scale radius by factor */ public function scale(float $factor): self { if ($factor < 0) { throw FrameworkException::create( ErrorCode::VAL_INVALID_FORMAT, 'Scale factor cannot be negative' )->withData(['factor' => $factor]); } return new self($this->value * $factor); } /** * Convert to SVG attribute value */ public function toSvgValue(): string { return sprintf('%.2f', $this->value); } public function __toString(): string { return $this->toSvgValue(); } }