find.3d(), find.pitch(), and
find.yaw() now calculate projected geometry directly with
project2d.from.3d() rather than querying a precomputed
simulation dataset. The external simulation dataset and
download.simdata() are therefore no longer required and
download.simdata() has been removed.find.3d() now supports additional information derived
from 2D landmarks. An araponga2d observation can be
combined with landmark-labeling uncertainty through
label_error and with the object’s unprojected length
through full_length. For workflows in which projected
measurements have already been calculated, pitch2d and/or
length2d constraints can alternatively be supplied
directly.full_length.from.camera() and
full_length.from.reference() to estimate the unprojected
image length required by full_length from camera geometry
or a reference segment, respectively. Input ranges can be used to
propagate uncertainty in physical measurements, distance, camera
parameters, and reference measurements.pitch2d.from.3d() has been renamed to
project2d.from.3d() and substantially extended. The
function is now vectorized and returns projected 2D pitch, projection
factor, and projected x-y component factors. If full_length
is supplied, absolute projected length and x-y components are also
returned. Supported 3D pitch values now span (-180, 180]. Geometrically
undefined projected pitches return NA.pitch2d.from.xy() has been renamed to
project2d.from.xy(). It now returns an
araponga2d data frame containing the landmark coordinates,
projected 2D pitch, and projected length rather than a numeric pitch
value with landmark coordinates stored as an attribute. Coincident
landmarks produce a projected length of zero and an undefined
(NA) projected pitch.pitch2d.w.error() has been redesigned to calculate the
exact continuous interval of projected 2D pitches compatible with
landmark-labeling uncertainty. It now accepts an araponga2d
object and returns an angular-interval summary rather than a sampled
vector of possible pitches. The previous label_nsamp and
add_boundaries arguments have been removed.find.3d() and its wrappers are now evaluated at their
exact values rather than rounded to integer degrees.default_step to control the resolution of
automatically generated candidate-angle grids.max_combinations as a safeguard against
excessively large searches. Candidate combinations are evaluated in
chunks to reduce peak memory use.Version 2.0.0 introduces breaking API changes relative to araponga 1.x.
pitch2d.from.xy() and pitch2d.from.3d()
have been replaced by project2d.from.xy() and
project2d.from.3d(), respectively. Their return values have
also changed, so code relying on the previous numeric outputs or
"xy" attribute must be updated.find.3d(),
find.pitch(), and find.yaw() is now
observed2d. Code that previously supplied a numeric
projected pitch positionally should instead use the direct constraint
explicitly, for example find.pitch(pitch2d = x, ...).find argument to find.3d() now refers
only to 3D quantities ("pitch", "yaw", and
"view_elevation"); "pitch2d" is no longer a
return option.pitch2d.w.error() now operates directly on an
araponga2d observation and returns a continuous angular
interval. The previous sampled-output interface and the
label_nsamp and add_boundaries arguments have
been removed.pitch2d = NA. Such orientations
cannot satisfy a projected-pitch constraint, but may still be compatible
with a search based only on projected length.download.simdata(): regenerated simulation dataset
v1.1.0, now with fixed floating-point issue.download.simdata() & find.3d():
updated to download dataset v1.1.0 and warn users that might have the
older version installed.download.simdata(): added codes for generating dataset
to data-raw/simdata.pitch2d.from.3d(): fixed floating-point handling for
degenerate projections (#4).find.3d(): fixed bug that dropped column name in the
output.find.3d() and others: minor clarification in
documentation for label_error argument.plot.angles(): fixed bug that plotted full circle when
facing = "left".trim.yaws() when retained or excluded
yaw sets are empty (#2).