Una cadena de poses declara sus eslabones, y esta sección contiene lo que solo responde una cadena: cómo se construye a partir de poses, cuántos eslabones tiene, qué pose es un eslabón y cómo la cadena entera se compone de nuevo en la única pose que denota.
Construye una cadena de poses a partir de un arreglo de poses ordenadas desde el marco más exterior hacia dentro
posechain(pose[]) → posechain
SELECT asEWKT(posechain(ARRAY[pose 'Pose(Point(0 0),0)', pose 'Pose(Point(1 0),0)'])); -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),0))
Convierte una pose en una cadena de poses de un solo eslabón
posechain(pose) → posechain
SELECT asEWKT(posechain(pose 'SRID=3812;Pose(Point(1 2),0.5)')); -- SRID=3812;PoseChain(Pose(POINT(1 2),0.5))
Devuelve la pose de un marco que define la cadena, leída en el marco exterior de la cadena
pose(posechain) → pose pose(posechain,integer) → pose
Cada instante contiene la pose a la que compone toda la cadena, que es donde se sitúa su marco más interno en el marco de la cadena. El resultado es una función escalonada: componer una cadena multiplica las rotaciones de sus eslabones, por lo que la pose de la cadena interpolada entre dos instantes no es la pose interpolada entre las dos poses compuestas, y un resultado lineal respondería una pose que la cadena nunca tiene. Una cadena de un solo eslabón se compone a sí misma, y allí la interpolación del argumento se conserva sin cambios.
Con un argumento se compone toda la cadena, lo que da la pose de su marco más interior. Con dos se componen los primeros n eslabones, lo que da la pose del marco que define el eslabón n-ésimo, es decir, dónde se sitúa esa articulación de la cadena.
SELECT asEWKT(pose(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0), Pose(Point(1 0),0))')); -- Pose(POINT(2 0),0) SELECT asEWKT(pose(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0), Pose(Point(1 0),0))', 2)); -- Pose(POINT(1 0),0)
Devuelve una cadena de poses con una pose añadida como su eslabón más interior
appendPose(posechain,pose) → posechain
La pose se lee en el marco que define el último eslabón de la cadena, por lo que no lleva ni un SRID ni el marcador geodésico.
SELECT asEWKT(appendPose(posechain 'PoseChain(Pose(Point(0 0),0))', pose 'Pose(Point(1 0),0)')); -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),0))
Devuelve el número de eslabones de una cadena de poses
numPoses(posechain) → integer
SELECT numPoses(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0), Pose(Point(2 0),0))'); -- 3
Devuelve los eslabones de una cadena de poses
startPose(posechain) → pose endPose(posechain) → pose poseN(posechain,integer) → pose poses(posechain) → pose[]
Un eslabón se devuelve tal como está almacenado, es decir, en el marco que define el eslabón anterior. Dónde se sitúa ese marco en el marco exterior de la cadena es lo que responde pose(posechain,integer). La función poseN devuelve NULL si la cadena tiene menos eslabones que el número dado.
SELECT asEWKT(startPose(posechain 'SRID=3812;
PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
-- SRID=3812;Pose(POINT(0 0),0)
SELECT asEWKT(endPose(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
-- Pose(POINT(1 0),0)
SELECT asEWKT(poseN(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))', 2));
-- Pose(POINT(1 0),0)
SELECT asEWKT(poses(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
-- {"Pose(POINT(0 0),0)","Pose(POINT(1 0),0)"}
Devuelve el número de eslabones que tiene todo valor de una cadena de poses temporal
numPoses(tposechain) → integer
El número es el mismo en todo instante, por lo que un instante responde por todo el valor.
SELECT numPoses(tposechain 'PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01'); -- 2