x * $scalar, $this->y * $scalar); } public function mulV(self $v): self { return new self($this->x * $v->x, $this->y * $v->y); } public function divS(float $scalar): self { return new self($this->x / $scalar, $this->y / $scalar); } public function addS(float $scalar): self { return new self($this->x + $scalar, $this->y + $scalar); } public function addV(self $v): self { return new self($this->x + $v->x, $this->y + $v->y); } public function subS(float $scalar): self { return new self($this->x - $scalar, $this->y - $scalar); } public function subV(self $v): self { return new self($this->x - $v->x, $this->y - $v->y); } public function dot(self $v): float { return $this->x * $v->x + $this->y * $v->y; } public function abs(): self { return new self(abs($this->x), abs($this->y)); } public function length(): float { return sqrt($this->dot($this)); } public function lengthSquared(): float { return $this->dot($this); } public function normalize(): self { $length = $this->length(); if ($length < 1.0e-9) { return new self(0.0, 0.0); } return new self($this->x / $length, $this->y / $length); } public function rotate(float $angle): self { $cos = cos($angle); $sin = sin($angle); return new self($this->x * $cos - $this->y * $sin, $this->x * $sin + $this->y * $cos); } }