from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
from compas.geometry import add_vectors
from compas.geometry import subtract_vectors
from compas.geometry import scale_vector
from compas.geometry import distance_point_point
__all__ = [
'tween_points',
'tween_points_distance'
]
[docs]def tween_points(points1, points2, num):
"""Compute the interpolated points between two sets of points.
Parameters
----------
points1 : list
The first set of points
points2 : list
The second set of points
num : int
The number of interpolated sets to return
Returns
-------
list
Nested list of points.
Raises
------
AssertionError
When the two point sets do not have the same length.
Examples
--------
>>>
Notes
-----
The two point sets should have the same length.
"""
vectors = [subtract_vectors(p2, p1) for p1, p2 in zip(points1, points2)]
tweens = []
for j in range(num):
tween = []
for point, vector in zip(points1, vectors):
scale = (j + 1.0) / (num + 1.0)
tween.append(add_vectors(point, scale_vector(vector, scale)))
tweens.append(tween)
return tweens
[docs]def tween_points_distance(points1, points2, dist, index=None):
"""Compute an interpolated set of points between two sets of points, at
a given distance.
Parameters
----------
points1 : list
The first set of points
points2 : list
The second set of points
dist : float
The distance from the first set to the second at which to compute the
interpolated set.
index: int
The index of the point in the first set from which to calculate the
distance to the second set. If no value is given, the first point will be used.
Returns
-------
list
List of points
"""
if not index:
index = 0
d = distance_point_point(points1[index], points2[index])
scale = float(dist) / d
tweens = []
for i in range(len(points1)):
tweens.append(add_vectors(points1[i], scale_vector(subtract_vectors(points2[i], points1[i]), scale)))
return tweens
# ==============================================================================
# Main
# ==============================================================================
if __name__ == "__main__":
# from compas_plotters import Plotter
# points1 = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [2.0, 0.0, 0.0], [3.0, 0.0, 0.0]]
# points2 = [[0.0, 0.0, 0.0], [1.0, 3.0, 0.0], [2.0, 1.0, 0.0], [3.0, 0.0, 0.0]]
# tweens = tween_points(points1, points2, 5)
# polylines = [{'points': points1, 'width': 1.0}]
# for points in tweens:
# polylines.append({'points': points, 'width': 0.5})
# polylines.append({'points': points2, 'width': 1.0})
# plotter = Plotter(figsize=(10, 7))
# plotter.draw_polylines(polylines)
# plotter.show()
import doctest
doctest.testmod(globs=globals())