theriftlab/radiance

各种角度和坐标格式之间的转换和运算。

v1.1.7 2024-01-31 15:11 UTC

This package is auto-updated.

Last update: 2024-09-30 02:02:56 UTC


README

Radiance 提供简单的轻量级类,使您的 PHP 应用程序能够轻松处理基于 360° 圆的角度,例如在各种格式之间进行转换、添加和减去、归一化和找到距离和中点。

安装

注意: Radiance 需要 PHP ^8.1 和 BCMath 扩展。

composer require theriftlab/radiance

使用

示例

Radiance 提供三个主要类:AngleLatitudeLongitude。作为相当简单的类,它们的底层结构非常相似,只有一些差异。

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 类,还有 LatitudeLongitude 类。这些类的行为与 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

以下附加操作可用于实现 AngleInterfaceAngleLatitudeLongitude

Angle 类本身还有一个附加函数

字符串格式化

toString() 函数接受一个字符串占位符,以指定其格式。每个类类型的默认格式字符串如下

要传递自己的格式,以下占位符对所有类类型都可用

对于 Latitude 类,以下额外占位符可用

对于 Longitude 类,以下额外占位符可用

测试

测试是通过 Pest 包含的

./vendor/bin/pest