~ubuntu-branches/ubuntu/utopic/qgis/utopic

« back to all changes in this revision

Viewing changes to src/analysis/interpolation/LinTriangleInterpolator.cc

  • Committer: Bazaar Package Importer
  • Author(s): Johan Van de Wauw
  • Date: 2010-07-11 20:23:24 UTC
  • mfrom: (3.1.4 squeeze)
  • Revision ID: james.westby@ubuntu.com-20100711202324-5ktghxa7hracohmr
Tags: 1.4.0+12730-3ubuntu1
* Merge from Debian unstable (LP: #540941).
* Fix compilation issues with QT 4.7
* Add build-depends on libqt4-webkit-dev 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
                          LinTriangleInterpolator.cc  -  description
 
3
                             -------------------
 
4
    copyright            : (C) 2004 by Marco Hugentobler
 
5
    email                : mhugent@geo.unizh.ch
 
6
 ***************************************************************************/
 
7
 
 
8
/***************************************************************************
 
9
 *                                                                         *
 
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.                                   *
 
14
 *                                                                         *
 
15
 ***************************************************************************/
 
16
 
 
17
#include "LinTriangleInterpolator.h"
 
18
#include "qgslogger.h"
 
19
 
 
20
bool LinTriangleInterpolator::calcFirstDerX( double x, double y, Vector3D* vec )
 
21
{
 
22
 
 
23
  if ( vec && mTIN )
 
24
  {
 
25
    Point3D pt1( 0, 0, 0 );
 
26
    Point3D pt2( 0, 0, 0 );
 
27
    Point3D pt3( 0, 0, 0 );
 
28
 
 
29
    if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
 
30
    {
 
31
      return false;//point outside the convex hull or numerical problems
 
32
    }
 
33
 
 
34
    vec->setX( 1.0 );
 
35
    vec->setY( 0.0 );
 
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() ) ) );
 
37
    return true;
 
38
  }
 
39
 
 
40
  else
 
41
  {
 
42
    QgsDebugMsg( "warning, null pointer" );
 
43
    return false;
 
44
  }
 
45
}
 
46
 
 
47
bool LinTriangleInterpolator::calcFirstDerY( double x, double y, Vector3D* vec )
 
48
{
 
49
  if ( vec && mTIN )
 
50
  {
 
51
    Point3D pt1( 0, 0, 0 );
 
52
    Point3D pt2( 0, 0, 0 );
 
53
    Point3D pt3( 0, 0, 0 );
 
54
 
 
55
    if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
 
56
    {
 
57
      return false;
 
58
    }
 
59
 
 
60
    vec->setX( 0 );
 
61
    vec->setY( 1.0 );
 
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() ) ) );
 
63
    return true;
 
64
  }
 
65
 
 
66
  else
 
67
  {
 
68
    QgsDebugMsg( "warning, null pointer" );
 
69
    return false;
 
70
  }
 
71
}
 
72
 
 
73
bool LinTriangleInterpolator::calcNormVec( double x, double y, Vector3D* vec )
 
74
{
 
75
//calculate vector product of the two derivative vectors in x- and y-direction and set the length to 1
 
76
  if ( vec && mTIN )
 
77
  {
 
78
    Vector3D vec1;
 
79
    Vector3D vec2;
 
80
    if ( !calcFirstDerX( x, y, &vec1 ) )
 
81
      {return false;}
 
82
    if ( !calcFirstDerY( x, y, &vec2 ) )
 
83
      {return false;}
 
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 );
 
89
    return true;
 
90
  }
 
91
 
 
92
  else
 
93
  {
 
94
    QgsDebugMsg( "warning, null pointer" );
 
95
    return false;
 
96
  }
 
97
 
 
98
}
 
99
 
 
100
 
 
101
bool LinTriangleInterpolator::calcPoint( double x, double y, Point3D* point )
 
102
{
 
103
  if ( point && mTIN )
 
104
  {
 
105
    Point3D pt1( 0, 0, 0 );
 
106
    Point3D pt2( 0, 0, 0 );
 
107
    Point3D pt3( 0, 0, 0 );
 
108
 
 
109
    if ( !mTIN->getTriangle( x, y, &pt1, &pt2, &pt3 ) )
 
110
    {
 
111
      return false;//point is outside the convex hull or numerical problems
 
112
    }
 
113
 
 
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();
 
117
 
 
118
    point->setX( x );
 
119
    point->setY( y );
 
120
    point->setZ( a*x + b*y + c );
 
121
    return true;
 
122
  }
 
123
  else
 
124
  {
 
125
    QgsDebugMsg( "warning, null pointer" );
 
126
    return false;
 
127
  }
 
128
 
 
129
}
 
130
 
 
131
 
 
132
 
 
133
 
 
134
 
 
135
 
 
136
 
 
137
 
 
138
 
 
139