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 = 0; $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 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; } }