Skip to content

Instantly share code, notes, and snippets.

@lennyferguson
Last active January 14, 2019 22:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lennyferguson/d5914bf35e53951d8b8e7c608180110f to your computer and use it in GitHub Desktop.
Save lennyferguson/d5914bf35e53951d8b8e7c608180110f to your computer and use it in GitHub Desktop.
Example of a function that generates a range of font sizes from min -> max -> min modeling the traversal of a sin wave
from typing import List, TypeVar, Callable
from math import sin, pi
# TypeVar for a generic number type
Num = TypeVar('Num', int, float)
"""
Function that generates a List of integers that represent a interpolation of font sizes from min to max along
a sin wave function that has been transformed to have the desired properties.
Returns a List of Integers (List[int]) of size num_pages containing font sizes interpolated between min and max.
"""
def get_font_sizes(num_pages: int, min: int = 6, max: int = 72, round_strategy: Callable[[Num], int] = round) -> List[int]:
# Define a function y that transforms an input t from [0 .. 2pi] to a font size between min and max
amplitude = (max - min) / 2.0
y = lambda t: round_strategy(amplitude * sin(t - (pi / 2.0)) + amplitude + min)
# Transform the range of inputs from [0 .. N] to [0 .. 2*pi] where N = num_pages
delta = 2.0 * pi / num_pages
# Invoke y with inputs translated to [0 .. 2pi] using delta constant
return [ y(t) for t in [ delta * n for n in range(num_pages) ] ]
# Example of interpolating over 40 pages from min to max back to min between 6 and 72
pages = 40
sizes = get_font_sizes(pages)
print("Example 1:\n{}\n".format(sizes))
# This example interpolates between size 10 and 60 instead of the default 6 and 72
pages = 100
sizes = get_font_sizes(pages, 10, 60)
print("Example 2:\n{}\n".format(sizes))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment