19e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com/*
29e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * Copyright 2012 Google Inc.
39e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com *
49e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
59e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * found in the LICENSE file.
69e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com */
715dd300ac6d7695b4d2aca81d8f3648eae704451skia.committer@gmail.com
873ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#if !defined QUADRATIC_UTILITIES_H
973ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#define QUADRATIC_UTILITIES_H
1073ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com
118dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com#include "DataTypes.h"
129d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com
139f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.comint add_valid_ts(double s[], int realRoots, double* t);
149d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comvoid chop_at(const Quadratic& src, QuadraticPair& dst, double t);
1505c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.comdouble dx_at_t(const Quadratic& , double t);
1605c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.comdouble dy_at_t(const Quadratic& , double t);
177ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com//void dxdy_at_t(const Quadratic& , double t, _Point& xy);
187ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com_Vector dxdy_at_t(const Quadratic& , double t);
197ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com
20beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.comdouble nearestT(const Quadratic& , const _Point& );
21beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.combool point_in_hull(const Quadratic& , const _Point& );
228dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
23639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com/* Parameterization form, given A*t*t + 2*B*t*(1-t) + C*(1-t)*(1-t)
24639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com *
25639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com * a = A - 2*B +   C
26639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com * b =     2*B - 2*C
27639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com * c =             C
28639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com */
2927accef223a27fba437f5e825d99edbae20a045bcaryclark@google.cominline void set_abc(const double* quad, double& a, double& b, double& c) {
30639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    a = quad[0];     // a = A
31639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    b = 2 * quad[2]; // b =     2*B
32639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    c = quad[4];     // c =             C
33639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    b -= c;          // b =     2*B -   C
34639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    a -= b;          // a = A - 2*B +   C
35639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com    b -= c;          // b =     2*B - 2*C
36639df891487e40925a4f8d9a34fd3dc0c18b40a7caryclark@google.com}
3727accef223a27fba437f5e825d99edbae20a045bcaryclark@google.com
389f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.comint quadraticRootsReal(double A, double B, double C, double t[2]);
399f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.comint quadraticRootsValidT(const double A, const double B, const double C, double s[2]);
409d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comvoid sub_divide(const Quadratic& src, double t1, double t2, Quadratic& dst);
41c83c70e911a38aea03db4af8dd9841d0d77bd129caryclark@google.com_Point sub_divide(const Quadratic& src, const _Point& a, const _Point& c, double t1, double t2);
42d0a19eb9140ecb968357f798f06d2b052b51fd89caryclark@google.comvoid toCubic(const Quadratic& , Cubic& );
4345a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com_Point top(const Quadratic& , double startT, double endT);
448dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comvoid xy_at_t(const Quadratic& , double t, double& x, double& y);
4547d73daa7a971e7eee5822def7922f7d43b2dc47caryclark@google.com_Point xy_at_t(const Quadratic& , double t);
4673ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com
4773ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#endif
48