mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-30 07:02:48 -06:00
72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
|
# Name: bezier.py
|
||
|
# Package: wx.lib.pdfviewer
|
||
|
#
|
||
|
# Purpose: Compute Bezier curves for PDF rendered using wx.DC
|
||
|
# Adapted from the original source code, see below.
|
||
|
#
|
||
|
# Author: David Hughes dfh@forestfield.co.uk
|
||
|
# Copyright: Forestfield Software Ltd
|
||
|
# Licence: Public domain
|
||
|
|
||
|
# History: Created 17 Jun 2009
|
||
|
#
|
||
|
# Tags: phoenix-port, documented
|
||
|
#
|
||
|
#----------------------------------------------------------------------------
|
||
|
"""
|
||
|
This module is used to compute Bezier curves for PDF rendering.
|
||
|
"""
|
||
|
|
||
|
import wx
|
||
|
from vec2d import *
|
||
|
|
||
|
def calculate_bezier(p, steps = 30):
|
||
|
"""
|
||
|
Calculate a bezier curve from 4 control points and return a
|
||
|
list of the resulting points.
|
||
|
Depends on the 2d vector class from http://www.pygame.org/wiki/2DVectorClass
|
||
|
|
||
|
2007 Victor Blomqvist
|
||
|
Released to the Public Domain
|
||
|
The function uses the forward differencing algorithm described at
|
||
|
http://www.niksula.cs.hut.fi/~hkankaan/Homepages/bezierfast.html
|
||
|
"""
|
||
|
|
||
|
t = 1.0 / steps
|
||
|
temp = t*t
|
||
|
|
||
|
f = p[0]
|
||
|
fd = 3 * (p[1] - p[0]) * t
|
||
|
fdd_per_2 = 3 * (p[0] - 2 * p[1] + p[2]) * temp
|
||
|
fddd_per_2 = 3 * (3 * (p[1] - p[2]) + p[3] - p[0]) * temp * t
|
||
|
|
||
|
fddd = fddd_per_2 + fddd_per_2
|
||
|
fdd = fdd_per_2 + fdd_per_2
|
||
|
fddd_per_6 = fddd_per_2 * (1.0 / 3)
|
||
|
|
||
|
points = []
|
||
|
for x in range(steps):
|
||
|
points.append(f)
|
||
|
f = f + fd + fdd_per_2 + fddd_per_6
|
||
|
fd = fd + fdd + fddd_per_2
|
||
|
fdd = fdd + fddd
|
||
|
fdd_per_2 = fdd_per_2 + fddd_per_2
|
||
|
points.append(f)
|
||
|
return points
|
||
|
|
||
|
def compute_points(controlpoints, nsteps=30):
|
||
|
"""
|
||
|
Input 4 control points as :class:`RealPoint` and convert to vec2d instances.
|
||
|
compute the nsteps points on the resulting curve and return them
|
||
|
as a list of :class:`Point`
|
||
|
"""
|
||
|
controlvectors = []
|
||
|
for p in controlpoints:
|
||
|
controlvectors.append(vec2d(p.x, p.y))
|
||
|
pointvectors = calculate_bezier(controlvectors, nsteps)
|
||
|
curvepoints = []
|
||
|
for v in pointvectors:
|
||
|
curvepoints.append(wx.Point(v[0], v[1]))
|
||
|
return curvepoints
|
||
|
|