theriftlab / radiance
各种角度和坐标格式之间的转换和运算。
Requires
- php: ^8.1
- ext-bcmath: *
Requires (Dev)
- pestphp/pest: ^2.28
README
Radiance 提供简单的轻量级类,使您的 PHP 应用程序能够轻松处理基于 360° 圆的角度,例如在各种格式之间进行转换、添加和减去、归一化和找到距离和中点。
安装
注意: Radiance 需要 PHP ^8.1 和 BCMath 扩展。
composer require theriftlab/radiance
使用
示例
Radiance 提供三个主要类:Angle、Latitude 和 Longitude。作为相当简单的类,它们的底层结构非常相似,只有一些差异。
use RiftLab\Radiance\Angle; $angle = Angle::make(-51.477928); echo $angle; // Output: -51°28'41" $angle2 = Angle::make('10°'); echo $angle->distanceTo($angle2); // Output: 61°28'41" echo $angle->distanceFrom($angle2); // Output: -61°28'41" echo $angle2->distanceTo($angle); // Output: -61°28'41" echo $angle->distanceTo(10); // Output: 61°28'41" echo $angle->add($angle2); // Output: -41°28'41" echo $angle->add(10); // Output: -41°28'41" echo $angle->sub($angle2); // Output: -61°28'41" echo $angle->sub(10); // Output: -61°28'41" echo $angle->add($angle2)->distanceTo($angle); // Output: -10°00'00" echo Angle::make(350)->midpointWith(20); // Output: 05°00'00
实例化
对象可以从几乎任何格式构建。以下是一些使用 Angle 的更多示例
// These will all produce identical objects: $angle1 = Angle::make(-51.477928); $angle2 = Angle::make('-51°28\'40.5408"'); $angle3 = Angle::make('51°28\'40.5408"W'); $angle4 = Angle::make('51w28\'40.5408'); $angle5 = Angle::make('51s28.67568'); var_dump($angle1 == $angle2); // Output: bool(true) var_dump($angle2 == $angle3); // Output: bool(true) // ..etc.
坐标类
除了基本的 Angle 类,还有 Latitude 和 Longitude 类。这些类的行为与 Angle 类相同,但它们限制在地理边界内:Latitude 为 -90° 到 90°,Longitude 为 -180° 到 180°。尝试用超出这些限制的角度实例化,或添加/减去将它们推到这些限制之外的价值,将抛出异常。
尽管所有类型的输出都可以自定义(请参阅下面的 字符串格式化 部分),但与坐标类唯一的另一个区别是它们的默认字符串格式
$lat = Latitude::make(-51.477928); echo $lat; // Output: 51s28.68 echo $lat->add(60); // Output: 8n31.32 echo $lat->midpointWith(10); // Output: 20s44.34 echo $lat->sub(40); // Below -90°: LatitudeBoundaryError thrown $dist = Angle::make(40); echo $lat->sub($dist); // LatitudeBoundaryError still thrown
负角度
Radiance 对使用 Angle 实例表示的角度没有太多偏见。您可以从中构建一个负角度,尽管它将被归一化
echo Angle::make(-560); // Output: -200°0'0"
然而,由于 distanceTo() / distanceFrom() 和 midpointWith() 计算是设计用来找到 0-360° 圆上两点之间最短距离的,使用负角度可能最初看起来不太直观
$angle = Angle::make(-200); // 160° on a circle echo $angle; // Output: -200°0'0" echo $angle->distanceTo(140); // 160° to 140° // Output: -20°0'0" echo $angle->distanceTo(180); // 160° to 180° // Output: 20°0'0"
如果我们真的把负数混合起来,它们仍然会堆叠
$angle = Angle::make(-560); // still 160° echo $angle; // Output: -200°0'0" echo $angle->distanceTo(-220); // 140° on a circle, so still 160° to 140° // Output: -20°0'0" echo $angle->distanceTo(-180); // 180° on a circle, so still 160° to 180° // Output: 20°0'0"
差异
虽然不是为直接实例化而设计的,但在所有的 distanceTo() 和 distanceFrom() 操作中都会返回一个 Diff 类的实例。这基本上与 Angle 类相同,但仅限于输出功能,没有其他操作可用。其默认格式将反映其计算出的任何类
echo Angle::make(10)->distanceTo(30); // Output: 20°00'00" echo Latitude::make(10)->distanceTo(30); // Output: 20n0.00 echo Longitude::make(10)->distanceTo(30); // Output: 20e0.00
请参阅下面的 字符串格式化 部分以获取有关如何自定义输出的详细信息。
函数
以下函数对所有类类型都可用,包括 Diff
以下附加操作可用于实现 AngleInterface 的 Angle、Latitude 和 Longitude 类
Angle 类本身还有一个附加函数
字符串格式化
toString() 函数接受一个字符串占位符,以指定其格式。每个类类型的默认格式字符串如下
要传递自己的格式,以下占位符对所有类类型都可用
对于 Latitude 类,以下额外占位符可用
对于 Longitude 类,以下额外占位符可用
测试
测试是通过 Pest 包含的
./vendor/bin/pest