1a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com/* 2a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com * Copyright 2012 Google Inc. 3a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com * 4a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be 5a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com * found in the LICENSE file. 6a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com */ 7a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com#include "CubicLineSegments.h" 8a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com#include "QuadraticLineSegments.h" 9a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com 10a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com// http://cagd.cs.byu.edu/~557/text/cagd.pdf 2.7 11a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com// A hodograph is the first derivative curve 12a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.comvoid hodograph(const Cubic& cubic, Quadratic& hodo) { 13a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[0].x = 3 * (cubic[1].x - cubic[0].x); 14a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[0].y = 3 * (cubic[1].y - cubic[0].y); 15a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[1].x = 3 * (cubic[2].x - cubic[1].x); 16a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[1].y = 3 * (cubic[2].y - cubic[1].y); 17a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[2].x = 3 * (cubic[3].x - cubic[2].x); 18a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodo[2].y = 3 * (cubic[3].y - cubic[2].y); 19a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com} 20a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com 21a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com// A 2nd hodograph is the second derivative curve 22a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.comvoid secondHodograph(const Cubic& cubic, _Line& hodo2) { 23a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com Quadratic hodo; 24a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodograph(cubic, hodo); 25a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com hodograph(hodo, hodo2); 26a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com} 27a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com 28a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com// The number of line segments required to approximate the cubic 29a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com// see http://cagd.cs.byu.edu/~557/text/cagd.pdf 10.6 30a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.comdouble subDivisions(const Cubic& cubic) { 31a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com _Line hodo2; 32a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com secondHodograph(cubic, hodo2); 33aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com double maxX = SkTMax(hodo2[1].x, hodo2[1].x); 34aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com double maxY = SkTMax(hodo2[1].y, hodo2[1].y); 35a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com double dist = sqrt(maxX * maxX + maxY * maxY); 36a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com double segments = sqrt(dist / (8 * FLT_EPSILON)); 37a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com return segments; 38a7e483d130a65833e4c0d4abb4c2f13a9ce7703bcaryclark@google.com} 39