0) { $values = array_slice($values, $offset, -$offset); } $count = count($values); $sum = 0.0; foreach ($values as $value) { if ($value === 0) { throw new ZeroDevisionException(); } $sum += 1 / $value; } return 1 / ($sum / $count); } /** * Calculate the angle mean. * * Example: ([1, 2, 2, 3, 4, 4, 2]) * * @param array $angles Angles * @param int $offset Offset for outlier * * @return float * * @since 1.0.0 */ public static function angleMean($angles, int $offset = 0) : float { $y = $x = 0; $size = count($angles); for ($i = 0; $i < $size; $i++) { $x += cos(deg2rad($angles[$i])); $y += sin(deg2rad($angles[$i])); } $x /= $size; $y /= $size; return rad2deg(atan2($y, $x)); } /** * Calculate angle based on time. * * Example: ('08:44:28') * * @param string $time Time * * @return float * * @throws \Exception * * @since 1.0.0 */ public static function timeToAngle(string $time) : float { $parts = explode(':', $time); if (count($parts) !== 3) { throw new \Exception('Wrong time format'); } $sec = ($parts[0] * 3600) + ($parts[1] * 60) + $parts[2]; $angle = 360.0 * ($sec / 86400.0); return $angle; } /** * Calculate time based on angle. * * Example: ('08:44:28') * * @param float $angle Angle * * @return string * * @since 1.0.0 */ public static function angleToTime(float $angle) : string { $sec = 86400.0 * $angle / 360.0; $time = sprintf('%02d:%02d:%02d', floor($sec / 3600), floor(($sec % 3600) / 60), $sec % 60); return $time; } /** * Calculate the angle mean. * * Example: ([1, 2, 2, 3, 4, 4, 2]) * * @param array $angles Angles * @param int $offset Offset for outlier * * @return float * * @since 1.0.0 */ public static function angleMean2(array $angles, int $offset = 0) : float { sort($angles); if ($offset > 0) { $angles = array_slice($angles, $offset, -$offset); } $sins = 0.0; $coss = 0.0; foreach ($angles as $a) { $sins += sin(deg2rad($a)); $coss += cos(deg2rad($a)); } $avgsin = $sins / (0.0 + count($angles)); $avgcos = $coss / (0.0 + count($angles)); $avgang = rad2deg(atan2($avgsin, $avgcos)); while ($avgang < 0.0) { $avgang += 360.0; } return $avgang; } }