1
/***************************************************************************
2
LinTriangleInterpolator.cc - description
4
copyright : (C) 2004 by Marco Hugentobler
5
email : mhugent@geo.unizh.ch
6
***************************************************************************/
8
/***************************************************************************
10
* This program is free software; you can redistribute it and/or modify *
11
* it under the terms of the GNU General Public License as published by *
12
* the Free Software Foundation; either version 2 of the License, or *
13
* (at your option) any later version. *
15
***************************************************************************/
17
#include "LinTriangleInterpolator.h"
18
#include "qgslogger.h"
20
bool LinTriangleInterpolator::calcFirstDerX( double x, double y, Vector3D* vec )
25
Point3D pt1( 0, 0, 0 );
26
Point3D pt2( 0, 0, 0 );
27
Point3D pt3( 0, 0, 0 );
29
if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
31
return false;//point outside the convex hull or numerical problems
36
vec->setZ(( pt1.getZ()*( pt2.getY() - pt3.getY() ) + pt2.getZ()*( pt3.getY() - pt1.getY() ) + pt3.getZ()*( pt1.getY() - pt2.getY() ) ) / (( pt1.getX() - pt2.getX() )*( pt2.getY() - pt3.getY() ) - ( pt2.getX() - pt3.getX() )*( pt1.getY() - pt2.getY() ) ) );
42
QgsDebugMsg( "warning, null pointer" );
47
bool LinTriangleInterpolator::calcFirstDerY( double x, double y, Vector3D* vec )
51
Point3D pt1( 0, 0, 0 );
52
Point3D pt2( 0, 0, 0 );
53
Point3D pt3( 0, 0, 0 );
55
if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
62
vec->setZ(( pt1.getZ()*( pt2.getX() - pt3.getX() ) + pt2.getZ()*( pt3.getX() - pt1.getX() ) + pt3.getZ()*( pt1.getX() - pt2.getX() ) ) / (( pt1.getY() - pt2.getY() )*( pt2.getX() - pt3.getX() ) - ( pt2.getY() - pt3.getY() )*( pt1.getX() - pt2.getX() ) ) );
68
QgsDebugMsg( "warning, null pointer" );
73
bool LinTriangleInterpolator::calcNormVec( double x, double y, Vector3D* vec )
75
//calculate vector product of the two derivative vectors in x- and y-direction and set the length to 1
80
if ( !calcFirstDerX( x, y, &vec1 ) )
82
if ( !calcFirstDerY( x, y, &vec2 ) )
84
Vector3D vec3( vec1.getY()*vec2.getZ() - vec1.getZ()*vec2.getY(), vec1.getZ()*vec2.getX() - vec1.getX()*vec2.getZ(), vec1.getX()*vec2.getY() - vec1.getY()*vec2.getX() );//calculate vector product
85
double absvec3 = sqrt( vec3.getX() * vec3.getX() + vec3.getY() * vec3.getY() + vec3.getZ() * vec3.getZ() );//length of vec3
86
vec->setX( vec3.getX() / absvec3 );//standardize vec3 and assign it to vec
87
vec->setY( vec3.getY() / absvec3 );
88
vec->setZ( vec3.getZ() / absvec3 );
94
QgsDebugMsg( "warning, null pointer" );
101
bool LinTriangleInterpolator::calcPoint( double x, double y, Point3D* point )
105
Point3D pt1( 0, 0, 0 );
106
Point3D pt2( 0, 0, 0 );
107
Point3D pt3( 0, 0, 0 );
109
if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
111
return false;//point is outside the convex hull or numerical problems
114
double a = ( pt1.getZ() * ( pt2.getY() - pt3.getY() ) + pt2.getZ() * ( pt3.getY() - pt1.getY() ) + pt3.getZ() * ( pt1.getY() - pt2.getY() ) ) / (( pt1.getX() - pt2.getX() ) * ( pt2.getY() - pt3.getY() ) - ( pt2.getX() - pt3.getX() ) * ( pt1.getY() - pt2.getY() ) );
115
double b = ( pt1.getZ() * ( pt2.getX() - pt3.getX() ) + pt2.getZ() * ( pt3.getX() - pt1.getX() ) + pt3.getZ() * ( pt1.getX() - pt2.getX() ) ) / (( pt1.getY() - pt2.getY() ) * ( pt2.getX() - pt3.getX() ) - ( pt2.getY() - pt3.getY() ) * ( pt1.getX() - pt2.getX() ) );
116
double c = pt1.getZ() - a * pt1.getX() - b * pt1.getY();
120
point->setZ( a*x + b*y + c );
125
QgsDebugMsg( "warning, null pointer" );