Conditions | 7 |
Paths | 6 |
Total Lines | 82 |
Lines | 0 |
Ratio | 0 % |
Changes | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | <?php |
||
29 | public function getDistance(Coordinate $point1, Coordinate $point2): float |
||
30 | { |
||
31 | if ($point1->getEllipsoid()->getName() !== $point2->getEllipsoid()->getName()) { |
||
32 | throw new NotMatchingEllipsoidException('The ellipsoids for both coordinates must match'); |
||
33 | } |
||
34 | |||
35 | $lat1 = deg2rad($point1->getLat()); |
||
36 | $lat2 = deg2rad($point2->getLat()); |
||
37 | $lng1 = deg2rad($point1->getLng()); |
||
38 | $lng2 = deg2rad($point2->getLng()); |
||
39 | |||
40 | $a = $point1->getEllipsoid()->getA(); |
||
41 | $b = $point1->getEllipsoid()->getB(); |
||
42 | $f = 1 / $point1->getEllipsoid()->getF(); |
||
43 | |||
44 | $L = $lng2 - $lng1; |
||
45 | $U1 = atan((1 - $f) * tan($lat1)); |
||
46 | $U2 = atan((1 - $f) * tan($lat2)); |
||
47 | |||
48 | $iterationsLeft = 100; |
||
49 | $lambda = $L; |
||
50 | |||
51 | $sinU1 = sin($U1); |
||
52 | $sinU2 = sin($U2); |
||
53 | $cosU1 = cos($U1); |
||
54 | $cosU2 = cos($U2); |
||
55 | |||
56 | do { |
||
57 | $sinLambda = sin($lambda); |
||
58 | $cosLambda = cos($lambda); |
||
59 | |||
60 | $sinSigma = sqrt( |
||
61 | ($cosU2 * $sinLambda) * ($cosU2 * $sinLambda) + |
||
62 | ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda) * ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda) |
||
63 | ); |
||
64 | |||
65 | if (abs($sinSigma) < 1E-12) { |
||
66 | return 0.0; |
||
67 | } |
||
68 | |||
69 | $cosSigma = $sinU1 * $sinU2 + $cosU1 * $cosU2 * $cosLambda; |
||
70 | |||
71 | $sigma = atan2($sinSigma, $cosSigma); |
||
72 | |||
73 | $sinAlpha = $cosU1 * $cosU2 * $sinLambda / $sinSigma; |
||
74 | |||
75 | $cosSqAlpha = 1 - $sinAlpha * $sinAlpha; |
||
76 | |||
77 | $cos2SigmaM = 0; |
||
78 | if (abs($cosSqAlpha) > 1E-12) { |
||
79 | $cos2SigmaM = $cosSigma - 2 * $sinU1 * $sinU2 / $cosSqAlpha; |
||
80 | } |
||
81 | |||
82 | $C = $f / 16 * $cosSqAlpha * (4 + $f * (4 - 3 * $cosSqAlpha)); |
||
83 | |||
84 | $lambdaP = $lambda; |
||
85 | |||
86 | $lambda = $L |
||
87 | + (1 - $C) |
||
88 | * $f |
||
89 | * $sinAlpha |
||
90 | * ($sigma + $C * $sinSigma * ($cos2SigmaM + $C * $cosSigma * (- 1 + 2 * $cos2SigmaM * $cos2SigmaM))); |
||
91 | |||
92 | $iterationsLeft--; |
||
93 | } while (abs($lambda - $lambdaP) > 1e-12 && $iterationsLeft > 0); |
||
94 | |||
95 | if ($iterationsLeft === 0) { |
||
96 | throw new NotConvergingException('Vincenty calculation does not converge'); |
||
97 | } |
||
98 | |||
99 | $uSq = $cosSqAlpha * ($a * $a - $b * $b) / ($b * $b); |
||
100 | $A = 1 + $uSq / 16384 * (4096 + $uSq * (- 768 + $uSq * (320 - 175 * $uSq))); |
||
101 | $B = $uSq / 1024 * (256 + $uSq * (- 128 + $uSq * (74 - 47 * $uSq))); |
||
102 | $deltaSigma = $B * $sinSigma * ( |
||
103 | $cos2SigmaM |
||
104 | + $B / 4 * ($cosSigma * (- 1 + 2 * $cos2SigmaM * $cos2SigmaM) |
||
105 | - $B / 6 * $cos2SigmaM * (- 3 + 4 * $sinSigma * $sinSigma) * (- 3 + 4 * $cos2SigmaM * $cos2SigmaM)) |
||
106 | ); |
||
107 | $s = $b * $A * ($sigma - $deltaSigma); |
||
108 | |||
109 | return round($s, 3); |
||
110 | } |
||
111 | } |
||
112 |