25  if ( p1 && p2 && p3 && result )
 
   28    const double area = 
triArea( p1, p2, p3 );
 
   33    const double area1 = 
triArea( &p, p2, p3 );
 
   34    const double area2 = 
triArea( p1, &p, p3 );
 
   35    const double area3 = 
triArea( p1, p2, &p );
 
   36    const double u = area1 / area;
 
   37    const double v = area2 / area;
 
   38    const double w = area3 / area;
 
 
   56  if ( p1 && p2 && p3 && result )
 
   58    const double area = 
triArea( p1, p2, p3 );
 
   62      QgsDebugError( QStringLiteral( 
"warning, p1, p2 and p3 are in a line" ) );
 
   66    const double denominator = ( ( p2->
y() - p3->
y() ) * ( p1->
x() - p3->
x() ) - ( p3->
y() - p1->
y() ) * ( p3->
x() - p2->
x() ) );
 
   67    if ( denominator != 0 ) 
 
   69      px = ( 2 * u * area * ( p1->
x() - p3->
x() ) - 2 * v * area * ( p3->
x() - p2->
x() ) - p2->
x() * p3->
y() * ( p1->
x() - p3->
x() ) + p3->
x() * p1->
y() * ( p3->
x() - p2->
x() ) + p3->
x() * p2->
y() * ( p1->
x() - p3->
x() ) - p1->
x() * p3->
y() * ( p3->
x() - p2->
x() ) ) / denominator;
 
   70      if ( ( p3->
x() - p2->
x() ) != 0 )
 
   72        py = ( 2 * u * area - px * ( p2->
y() - p3->
y() ) - p2->
x() * p3->
y() + p3->
x() * p2->
y() ) / ( p3->
x() - p2->
x() );
 
   76        py = ( 2 * v * area - px * ( p3->
y() - p1->
y() ) - p3->
x() * p1->
y() + p1->
x() * p3->
y() ) / ( p1->
x() - p3->
x() );
 
   81      py = ( 2 * u * area * ( p3->
y() - p1->
y() ) - 2 * v * area * ( p2->
y() - p3->
y() ) - p2->
x() * p3->
y() * ( p3->
y() - p1->
y() ) + p3->
x() * p1->
y() * ( p2->
y() - p3->
y() ) + p3->
x() * p2->
y() * ( p3->
y() - p1->
y() ) - p1->
x() * p3->
y() * ( p2->
y() - p3->
y() ) ) / ( ( p3->
x() - p2->
x() ) * ( p3->
y() - p1->
y() ) - ( p1->
x() - p3->
x() ) * ( p2->
y() - p3->
y() ) );
 
   82      if ( ( p2->
y() - p3->
y() ) != 0 )
 
   84        px = ( 2 * u * area - py * ( p3->
x() - p2->
x() ) - p2->
x() * p3->
y() + p3->
x() * p2->
y() ) / ( p2->
y() - p3->
y() );
 
   88        px = ( 2 * v * area - py * ( p1->
x() - p3->
x() ) - p3->
x() * p1->
y() + p1->
x() * p3->
y() ) / ( p3->
y() - p1->
y() );
 
 
  109  return lower( n, i ) * std::pow( t, i ) * std::pow( ( 1 - t ), ( n - i ) );
 
 
  119  if ( p1 && p2 && p3 && result )
 
  121    const double distp1p2 = p1->
distance( *p2 );
 
  122    const double distp2p3 = p2->
distance( *p3 );
 
  123    if ( distp1p2 > distp2p3 )
 
  130    const double denominator = -p3->
x() * p2->
y() + p3->
x() * p1->
y() + p1->
x() * p2->
y() + p2->
x() * p3->
y() - p2->
x() * p1->
y() - p1->
x() * p3->
y();
 
  132    if ( denominator == 0 )
 
  134      QgsDebugError( QStringLiteral( 
"error: the three points are in a line" ) );
 
  139      result->
setX( 0.5 * ( p1->
x() * p1->
x() * p2->
y() - p1->
x() * p1->
x() * p3->
y() - p3->
x() * p3->
x() * p2->
y() - p1->
y() * p2->
x() * p2->
x() - p1->
y() * p1->
y() * p3->
y() - p3->
y() * p3->
y() * p2->
y() + p1->
y() * p1->
y() * p2->
y() + p3->
y() * p2->
x() * p2->
x() - p1->
y() * p2->
y() * p2->
y() + p1->
y() * p3->
y() * p3->
y() + p1->
y() * p3->
x() * p3->
x() + p3->
y() * p2->
y() * p2->
y() ) / denominator );
 
  140      result->
setY( -0.5 * ( p3->
x() * p2->
x() * p2->
x() + p2->
x() * p1->
y() * p1->
y() + p3->
x() * p2->
y() * p2->
y() - p3->
x() * p1->
x() * p1->
x() + p1->
x() * p3->
y() * p3->
y() - p3->
x() * p1->
y() * p1->
y() - p1->
x() * p2->
x() * p2->
x() - p2->
x() * p3->
y() * p3->
y() - p1->
x() * p2->
y() * p2->
y() - p2->
x() * p3->
x() * p3->
x() + p1->
x() * p3->
x() * p3->
x() + p2->
x() * p1->
x() * p1->
x() ) / denominator );
 
 
  154  if ( thepoint && p1 && p2 )
 
  157    Vector3D line( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
 
  159    const double a = normal.
getX();
 
  160    const double b = normal.
getY();
 
  161    const double c = -( normal.
getX() * p2->
x() + normal.
getY() * p2->
y() );
 
  162    const double distance = std::fabs( ( a * thepoint->
x() + b * thepoint->
y() + 
c ) / ( std::sqrt( a * a + b * b ) ) );
 
 
  174  return std::tgamma( n + 1 );
 
 
  179  const double tolerance = 0.0001; 
 
  181  if ( testp && p1 && p2 && p3 )
 
  189    double px = testp->
x();
 
  190    double py = testp->
y();
 
  192    const double xmin = std::min( std::min( ax, px ), std::min( bx, cx ) );
 
  193    const double ymin = std::min( std::min( ay, py ), std::min( by, cy ) );
 
  203    double aValue = ( ax * ax + ay * ay ) * 
triArea( p2, p3, testp );
 
  204    aValue = aValue - ( ( bx * bx + by * by ) * 
triArea( p1, p3, testp ) );
 
  205    aValue = aValue + ( ( cx * cx + cy * cy ) * 
triArea( p1, p2, testp ) );
 
  206    aValue = aValue - ( ( px * px + py * py ) * 
triArea( p1, p2, p3 ) );
 
  208    return aValue > tolerance;
 
 
  219  return angle( p1, point, p2, point ) > 90;
 
 
  227    const double f1 = thepoint.
x() - p1->
x();
 
  228    const double f2 = p2->
y() - p1->
y();
 
  229    const double f3 = thepoint.
y() - p1->
y();
 
  230    const double f4 = p2->
x() - p1->
x();
 
  231    return f1 * f2 - f3 * f4;
 
 
  243  if ( p1 && p2 && p3 && p4 )
 
  246    const Vector3D p1p2( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
 
  247    const Vector3D p3p4( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
 
  251      t1 = ( p3->
x() - p1->
x() + t2 * p3p4.
getX() ) / p1p2.
getX();
 
  256      t2 = ( p1->
x() + t1 * p1p2.
getX() - p3->
x() ) / p3p4.
getX();
 
  263    if ( t1 > 0 && t1 < 1 && t2 > 0 && t2 < 1 )
 
  265      if ( ( *p1 ) == ( *p3 ) || ( *p1 ) == ( *p4 ) || ( *p2 ) == ( *p3 ) || ( *p2 ) == ( *p4 ) ) 
 
 
  286  if ( p1 && p2 && p3 && p4 )
 
  289    const Vector3D p1p2( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
 
  290    const Vector3D p3p4( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
 
  294      t1 = ( p3->
x() - p1->
x() + t2 * p3p4.
getX() ) / p1p2.
getX();
 
  299      t2 = ( p1->
x() + t1 * p1p2.
getX() - p3->
x() ) / p3p4.
getX();
 
  303      intersection_point->
setX( 0 );
 
  304      intersection_point->
setY( 0 );
 
  305      intersection_point->
setZ( 0 );
 
  309    if ( t1 > 0 && t1 < 1 && t2 > 0 && t2 < 1 )
 
  311      if ( ( *p1 ) == ( *p3 ) || ( *p1 ) == ( *p4 ) || ( *p2 ) == ( *p3 ) || ( *p2 ) == ( *p4 ) ) 
 
  313        intersection_point->
setX( 0 );
 
  314        intersection_point->
setY( 0 );
 
  315        intersection_point->
setZ( 0 );
 
  319      intersection_point->
setX( p1->
x() * ( 1 - t1 ) + p2->
x() * t1 );
 
  320      intersection_point->
setY( p1->
y() * ( 1 - t1 ) + p2->
y() * t1 );
 
  321      intersection_point->
setZ( 0 );
 
 
  339  if ( i >= 0 && i <= n )
 
 
  351  if ( pa && pb && pc )
 
  353    const double deter = ( pa->
x() * pb->
y() + pb->
x() * pc->
y() + pc->
x() * pa->
y() - pa->
x() * pc->
y() - pb->
x() * pa->
y() - pc->
x() * pb->
y() );
 
 
  365  if ( n != 3 || i > n )
 
  367    QgsDebugError( QStringLiteral( 
"error, can't calculate hermite polynom" ) );
 
  370  if ( n == 3 && i == 0 )
 
  375  if ( n == 3 && i == 1 )
 
  380  if ( n == 3 && i == 2 )
 
  385  if ( n == 3 && i == 3 )
 
 
  398  if ( n != 3 || i > n )
 
  400    QgsDebugError( QStringLiteral( 
"error, can't calculate hermite polynom" ) );
 
  403  if ( n == 3 && i == 0 )
 
  410  if ( n == 3 && i == 1 )
 
  416  if ( n == 3 && i == 2 )
 
  422  if ( n == 3 && i == 3 )
 
 
  437  if ( v1 && v2 && result ) 
 
 
  454    if ( v1->
getY() == 0 ) 
 
  458      if ( v1->
getX() < 0 )
 
  460        result->
setY( -length );
 
  465        result->
setY( length );
 
  471    const double a = 1 + ( v1->
getX() * v1->
getX() ) / ( v1->
getY() * v1->
getY() );
 
  473    const double c = -( length * length );
 
  474    const double d = b * b - 4 * a * 
c;
 
  482    result->
setX( ( -b + std::sqrt( d ) ) / ( 2 * a ) ); 
 
  489    if ( !( 
leftOf( point1, &point2, &point3 ) < 0 ) ) 
 
 
  509    if ( v1->
getY() == 0 ) 
 
  513      if ( v1->
getX() < 0 )
 
  515        result->
setY( length );
 
  520        result->
setY( -length );
 
  526    const double a = 1 + ( v1->
getX() * v1->
getX() ) / ( v1->
getY() * v1->
getY() );
 
  528    const double c = -( length * length );
 
  529    const double d = b * b - 4 * a * 
c;
 
  537    result->
setX( ( -b + std::sqrt( d ) ) / ( 2 * a ) ); 
 
  544    if ( ( 
leftOf( point1, &point2, &point3 ) < 0 ) ) 
 
 
  562  if ( p1 && p2 && p3 && vec ) 
 
  564    const double ax = p2->
x() - p1->
x();
 
  565    const double ay = p2->
y() - p1->
y();
 
  566    const double az = p2->
z() - p1->
z();
 
  567    const double bx = p3->
x() - p1->
x();
 
  568    const double by = p3->
y() - p1->
y();
 
  569    const double bz = p3->
z() - p1->
z();
 
  571    vec->
setX( ay * bz - az * by );
 
  572    vec->
setY( az * bx - ax * bz );
 
  573    vec->
setZ( ax * by - ay * bx );
 
 
  579  if ( first && vec1 && second && vec2 )
 
  589      return ( ( first->
x() * vec1->
getY() - first->
y() * vec1->
getX() - second->
x() * vec1->
getY() + second->
y() * vec1->
getX() ) / ( vec2->
getX() * vec1->
getY() - vec2->
getY() * vec1->
getX() ) );
 
  593      QgsDebugError( QStringLiteral( 
"warning: vectors are parallel" ) );
 
 
  626  if ( tangent && target && result )
 
  628    const double xt = tangent->
getX();
 
  629    const double yt = tangent->
getY();
 
  630    const double zt = tangent->
getZ();
 
  632    const double xw = target->
getX();
 
  633    const double yw = target->
getY();
 
  634    const double zw = target->
getZ();
 
  636    double xg1, yg1, zg1; 
 
  637    double xg2, yg2, zg2; 
 
  640    const double xgalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
 
  643      QgsDebugError( QStringLiteral( 
"warning, only complex solution of xg" ) );
 
  646    xg1 = std::sqrt( xgalpha1 ) * ( -yt * yw * xt + yt * yt * xw + xw * zt * zt - zt * xt * zw );
 
  647    xg2 = -sqrt( xgalpha1 ) * ( -yt * yw * xt + yt * yt * xw + xw * zt * zt - zt * xt * zw );
 
  650    const double ygalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
 
  653      QgsDebugError( QStringLiteral( 
"warning, only complex solution of yg" ) );
 
  656    yg1 = -sqrt( ygalpha1 ) * ( -yw * xt * xt - zt * zt * yw + zt * yt * zw + yt * xw * xt );
 
  657    yg2 = std::sqrt( ygalpha1 ) * ( -yw * xt * xt - zt * zt * yw + zt * yt * zw + yt * xw * xt );
 
  660    const double zgalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
 
  663      QgsDebugError( QStringLiteral( 
"warning, only complex solution of zg" ) );
 
  666    zg1 = -sqrt( zgalpha1 ) * ( yt * yw * zt - yt * yt * zw + xw * zt * xt - xt * xt * zw );
 
  667    zg2 = std::sqrt( zgalpha1 ) * ( yt * yw * zt - yt * yt * zw + xw * zt * xt - xt * xt * zw );
 
  672    if ( distance1 <= distance2 ) 
 
 
  697  if ( test && pt1 && pt2 && pt3 )
 
  699    const double a = ( pt1->
z() * ( pt2->
y() - pt3->
y() ) + pt2->
z() * ( pt3->
y() - pt1->
y() ) + pt3->
z() * ( pt1->
y() - pt2->
y() ) ) / ( ( pt1->
x() - pt2->
x() ) * ( pt2->
y() - pt3->
y() ) - ( pt2->
x() - pt3->
x() ) * ( pt1->
y() - pt2->
y() ) );
 
  700    const double b = ( pt1->
z() * ( pt2->
x() - pt3->
x() ) + pt2->
z() * ( pt3->
x() - pt1->
x() ) + pt3->
z() * ( pt1->
x() - pt2->
x() ) ) / ( ( pt1->
y() - pt2->
y() ) * ( pt2->
x() - pt3->
x() ) - ( pt2->
y() - pt3->
y() ) * ( pt1->
x() - pt2->
x() ) );
 
  701    const double c = pt1->
z() - a * pt1->
x() - b * pt1->
y();
 
  702    const double zpredicted = test->
x() * a + test->
y() * b + 
c;
 
  703    return ( test->
z() - zpredicted );
 
 
  714  if ( p1 && p2 && p3 && p4 )
 
  716    const Vector3D v1( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
 
  717    const Vector3D v2( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
 
 
static double distance2D(double x1, double y1, double x2, double y2)
Returns the 2D distance between (x1, y1) and (x2, y2).
 
Point geometry type, with support for z-dimension and m-values.
 
void setY(double y)
Sets the point's y-coordinate.
 
void setX(double x)
Sets the point's x-coordinate.
 
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
 
void setZ(double z)
Sets the point's z-coordinate.
 
Represents a 3D-Vector, capable of storing x, y and z-coordinates in double values.
 
void setX(double x)
Sets the x-component of the vector.
 
double getY() const
Returns the y-component of the vector.
 
double getX() const
Returns the x-component of the vector.
 
void setY(double y)
Sets the y-component of the vector.
 
double getZ() const
Returns the z-component of the vector.
 
double getLength() const
Returns the length of the vector.
 
void setZ(double z)
Sets the z-component of the vector.
 
bool ANALYSIS_EXPORT normalLeft(Vector3D *v1, Vector3D *result, double length)
Assigns the vector 'result', which is normal to the vector 'v1', on the left side of v1 and has lengt...
 
bool ANALYSIS_EXPORT inDiametral(QgsPoint *p1, QgsPoint *p2, QgsPoint *point)
Tests, whether 'point' is inside the diametral circle through 'p1' and 'p2'.
 
bool ANALYSIS_EXPORT derVec(const Vector3D *v1, const Vector3D *v2, Vector3D *result, double x, double y)
Calculates the z-component of a vector with coordinates 'x' and 'y'which is in the same tangent plane...
 
double ANALYSIS_EXPORT calcBernsteinPoly(int n, int i, double t)
Calculates the value of a Bernstein polynomial.
 
int ANALYSIS_EXPORT faculty(int n)
Faculty function.
 
bool ANALYSIS_EXPORT BarycentricToXY(double u, double v, double w, QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *result)
 
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
 
double ANALYSIS_EXPORT triArea(QgsPoint *pa, QgsPoint *pb, QgsPoint *pc)
Returns the area of a triangle. If the points are ordered counterclockwise, the value will be positiv...
 
bool ANALYSIS_EXPORT pointInsideTriangle(double x, double y, QgsPoint *p1, QgsPoint *p2, QgsPoint *p3)
Returns true, if the point with coordinates x and y is inside (or at the edge) of the triangle p1,...
 
bool ANALYSIS_EXPORT normalRight(Vector3D *v1, Vector3D *result, double length)
Assigns the vector 'result', which is normal to the vector 'v1', on the right side of v1 and has leng...
 
double ANALYSIS_EXPORT crossVec(QgsPoint *first, Vector3D *vec1, QgsPoint *second, Vector3D *vec2)
Calculates the intersection of the two vectors vec1 and vec2, which start at first(vec1) and second(v...
 
bool ANALYSIS_EXPORT lineIntersection(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Returns true, if line1 (p1 to p2) and line2 (p3 to p4) intersect. If the lines have an endpoint in co...
 
int ANALYSIS_EXPORT lower(int n, int i)
Lower function.
 
double ANALYSIS_EXPORT planeTest(QgsPoint *test, QgsPoint *pt1, QgsPoint *pt2, QgsPoint *pt3)
Tests, if 'test' is in the same plane as 'p1', 'p2' and 'p3' and returns the z-difference from the pl...
 
bool ANALYSIS_EXPORT circumcenter(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *result)
Calculates the center of the circle passing through p1, p2 and p3. Returns true in case of success an...
 
double ANALYSIS_EXPORT cFDerBernsteinPoly(int n, int i, double t)
Calculates the first derivative of a Bernstein polynomial with respect to the parameter t.
 
double ANALYSIS_EXPORT cFDerCubicHermitePoly(int n, int i, double t)
Calculates the first derivative of a cubic Hermite polynomial with respect to the parameter t.
 
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'. Negative values mean left ...
 
double ANALYSIS_EXPORT distPointFromLine(QgsPoint *thepoint, QgsPoint *p1, QgsPoint *p2)
Calculates the (2 dimensional) distance from 'thepoint' to the line defined by p1 and p2.
 
bool ANALYSIS_EXPORT calcBarycentricCoordinates(double x, double y, QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *result)
Calculates the barycentric coordinates of a point (x,y) with respect to p1, p2, p3 and stores the thr...
 
double ANALYSIS_EXPORT calcCubicHermitePoly(int n, int i, double t)
Calculates the value of a cubic Hermite polynomial.
 
bool ANALYSIS_EXPORT inCircle(QgsPoint *testp, QgsPoint *p1, QgsPoint *p2, QgsPoint *p3)
Tests, whether 'testp' is inside the circle through 'p1', 'p2' and 'p3'.
 
void ANALYSIS_EXPORT normalFromPoints(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, Vector3D *vec)
Calculates the normal vector of the plane through the points p1, p2 and p3 and assigns the result to ...
 
bool ANALYSIS_EXPORT normalMinDistance(Vector3D *tangent, Vector3D *target, Vector3D *result)
Calculates a Vector orthogonal to 'tangent' with length 1 and closest possible to result....
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
#define QgsDebugError(str)