1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// SPDX-License-Identifier: MIT OR Apache-2.0
// Copyright (c) 2023, 2025 lacklustr@protonmail.com https://github.com/eadf
// This file is part of vector-traits.
//! # Vector-Traits Crate
//!
//! `vector-traits` is a Rust crate designed to provide a limited set of traits for abstracting over different vector
//! implementations and scalar types, offering a unified interface for a basic set of vector operations. This crate facilitates
//! seamless transitions between different vector libraries and scalar precisions (e.g., `f32` and `f64`) without
//! requiring significant code modifications.
//!
//! ## Features
//!
//! - Abstract over two-dimensional and three-dimensional vectors with `GenericVector2` and `GenericVector3` traits.
//! - Generic scalar trait `GenericScalar` for flexible scalar type handling.
//! - Basic vector traits `HasXY` and `HasXYZ` for low-level, custom vector storage types, e.g., FFI types.
//! - Seamless transition between different vector libraries like `cgmath`, `glam`, and `nalgebra`.
//! - Ability to switch between different scalar types (`f32`, `f64`) effortlessly.
//!
//! ## Design Philosophy
//!
//! This library is designed to be **agnostic** to whether the underlying type represents a **point** or a **vector**.
//! For example, you can compute the distance between two points (`v0.distance(v1)`) or the magnitude of a vector (`v0.magnitude()`)
//! regardless of how the underlying library differentiates between points and vectors. This approach simplifies interoperability
//! and allows you to focus on the geometric operations rather than the semantic distinctions.
//!
//! While some libraries make a deliberate effort to differentiate between points and vectors (e.g., `nalgebra` and `cgmath`), this crate
//! intentionally treats them uniformly to provide a consistent and flexible interface. This means that operations like
//! `distance`, `magnitude`, and `normalize` are available on any type that implements the relevant traits, whether it
//! represents a point or a vector in the underlying library.
//!
//! ## Supported Vector Implementations
//!
//! Currently, the following vector types from `cgmath`, `glam`, and `nalgebra` libraries are supported:
//!
//! - `glam::Vec2`, `glam::Vec3`, `glam::Mat3`, `glam::Mat4`
//! - `glam::Vec3A`, `glam::Mat3A` (uses newtype wrappers: `Vec2A` & `Mat4A` for symmetry)
//! - `glam::DVec2`, `glam::DVec3`, `glam::DMat3`, `glam::DMat4`
//! - `cgmath::Vector2`, `cgmath::Vector3`
//! - `nalgebra::Vector2`, `nalgebra::Vector3`
//!
//! ## Usage
//!
//! Add `vector-traits` to your `Cargo.toml` dependencies along with the desired features:
//!
//! ```toml
//! [dependencies]
//! vector-traits = { version = "0.4.0", features = ["glam", "cgmath", "nalgebra"] } # only use what you need
//! ```
//!
//! ## Example
//!
//! In this example we use the linestring crate, that builds upon these traits, to calculate the
//! convex hull of a `Vec` of coordinates and an RDP simplified linestring. It does this without any
//! type conversions, but instead uses the specified vector type throughout.
//!
//! ```rust,ignore
//! use vector_traits::prelude::GenericVector2;
//! use linestring::prelude::LineString2;
//!
//! let point_cloud: Vec<glam::Vec2> = vec![/* your glam::Vec2 data */];
//! let convex_hull = point_cloud.convex_hull();
//!
//! let linestring: Vec<nalgebra::Vector2<f64>> = vec![/* your nalgebra::Vector2<f64> data */];
//! let simplified_linestring = linestring.simplify_rdp(0.001);
//! ```
//!
//! ## Contributing
//!
//! Contributions are welcome! Feel free to open an issue or submit a pull request.
//!
//! ## License
//!
//! Licensed under either of
//!
//! - Apache License, Version 2.0 ([LICENSE-APACHE](https://example.com/your-apache-license-link))
//! - MIT license ([LICENSE-MIT](https://example.com/your-mit-license-link))
//!
//! at your option.
compile_error!;
pub use approx;
pub use cgmath;
pub use glam;
pub use macaw;
pub use nalgebra;
pub use num_traits;