5个版本 (重大变更)

0.5.0 2023年2月6日
0.4.0 2023年2月5日
0.3.0 2023年2月4日
0.2.0 2023年1月25日
0.1.0 2023年1月24日

#763 in 数学

Download history 12/week @ 2024-04-22 25/week @ 2024-04-29 15/week @ 2024-05-06 13/week @ 2024-05-13 14/week @ 2024-05-20 13/week @ 2024-05-27 16/week @ 2024-06-03 7/week @ 2024-06-10 8/week @ 2024-06-17 7/week @ 2024-06-24 98/week @ 2024-07-08 56/week @ 2024-07-15 40/week @ 2024-07-22 30/week @ 2024-07-29 15/week @ 2024-08-05

每月145次下载
用于 esvg

MIT 许可证

38KB
886

多边形库

一个用于与2D平面上的多边形交互的库。

示例

旋转多边形

    use polygonical::polygon::Polygon;
    use polygonical::point::Point;

    let poly = Polygon::new(vec![
        Point::new(0.0, 1.0),
        Point::new(1.0, 1.0),
        Point::new(1.0, 0.0),
    ]);

    // get the area of the polygon
    let area = poly.area();

    // rotate the polygon around its own center by 90 degrees
    let rotated = poly.rotate_around_center(90.0_f64.to_radians());

    println!("area: {} rotated: {}", area, rotated);

创建圆的近似

    use polygonical::polygon::Polygon;
    use polygonical::point::Point;

    let num_points = 16;
    let radius = 2.0;
    let center = Point::new(10.0, 20.0);

    // Note: we use an integer number of degrees here because rust won't let you iterate over floats like this.
    let points = (0..360).step_by(360/num_points)
        .map(|a| Point::new(radius, 0.0).rotate((a as f64).to_radians()).translate(&center))
        .collect();

    let circle = Polygon::new(points);
     
    let approx_area = circle.area();
    let area = std::f64::consts::PI * radius * radius;

    println!("area: {} aprox_area: {} difference: {}", area, approx_area, area - approx_area);

特性

  • 多边形
  • 边界框
  • 点的平移
  • 多边形包含点
  • 多边形是自相交的
  • 多边形面积
  • 多边形的平移
  • 点的旋转
  • 多边形的旋转
  • 重叠检测
  • 包含检测
  • 多边形合并

希望的特性

我们想要实现但尚未实现的特性。

  • 点的缩放
  • 多边形的缩放
  • 多边形减法

不希望的特性

这个库不会做的事情。

  • 3D几何
  • 输出到svg(那将属于另一个库)
  • 坐标系转换、epsg代码、像素空间到世界空间等。

设计目标

  • 正确
  • 安全
  • 快速

按照这个顺序

局限性/警告

多边形必须指定点按顺时针方向围绕它们。一些算法仅在点按顺时针定义时才起作用。没有检测这一点,可能会产生奇怪的结果,尚未经过测试。

依赖

~45KB