1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
// Copyright (C) 2003 Dominique Devriese <[email protected]>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301, USA.
#ifndef KIG_MISC_CUBIC_COMMON_H
#define KIG_MISC_CUBIC_COMMON_H
#include "common.h"
class Transformation;
/**
* This class represents an equation of a cubic in the form
* \f$ a_{ijk} x_i x_j x_k = 0 \f$ (in homogeneous coordinates,
* \f$ i,j,k = 0,1,2 \f$), \f$ i <= j <= k \f$.
* The coefficients are stored in lessicografic order.
*/
class CubicCartesianData
{
public:
double coeffs[10];
/**
* \ifnot creating-python-scripting-doc
* \brief Default Constructor
*
* Constructs a new CubicCartesianData, with all the coeffs
* initialized to 0.
* \endif
*/
explicit CubicCartesianData();
/**
* Constructor. Construct a new CubicCartesianData, with the given
* values as coeffs.
*/
CubicCartesianData( double a000, double a001, double a002,
double a011, double a012, double a022,
double a111, double a112, double a122,
double a222 )
{
coeffs[0] = a000;
coeffs[1] = a001;
coeffs[2] = a002;
coeffs[3] = a011;
coeffs[4] = a012;
coeffs[5] = a022;
coeffs[6] = a111;
coeffs[7] = a112;
coeffs[8] = a122;
coeffs[9] = a222;
}
CubicCartesianData( const double incoeffs[10] );
/**
* Create an invalid CubicCartesianData. This is a special state of a
* CubicCartesianData that signals that something went wrong..
*
* \see CubicCartesianData::valid
*
* \internal We represent an invalid CubicCartesianData by setting all
* the coeffs to positive or negative infinity. This is handy, since
* it doesn't require us to adapt most of the functions, it doesn't
* need extra space, and most of the times that we should get an
* invalid CubicCartesianData, we get one automatically..
*/
static CubicCartesianData invalidData();
/**
* Return whether this is a valid CubicCartesianData.
*
* \see CubicCartesianData::invalidData
*/
bool valid() const;
};
bool operator==( const CubicCartesianData& lhs, const CubicCartesianData& rhs );
/**
* This function calcs a cartesian cubic equation such that the
* given points are on the cubic. There can be at most 9 and at
* least 2 point. If there are less than 9, than the coefficients
* will be chosen to 1.0 if possible
*/
const CubicCartesianData calcCubicThroughPoints (
const std::vector<Coordinate>& points );
const CubicCartesianData calcCubicCuspThroughPoints (
const std::vector<Coordinate>& points );
const CubicCartesianData calcCubicNodeThroughPoints (
const std::vector<Coordinate>& points );
double calcCubicYvalue ( double x, double ymin, double ymax,
int root, CubicCartesianData data,
bool& valid, int& numroots );
const Coordinate calcCubicLineIntersect( const CubicCartesianData& c,
const LineData& l,
int root, bool& valid );
void calcCubicLineRestriction ( CubicCartesianData data,
Coordinate p1, Coordinate dir,
double& a, double& b, double& c, double& d );
const CubicCartesianData calcCubicTransformation (
const CubicCartesianData& data,
const Transformation& t, bool& valid );
#endif
|