• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • projections
projector.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 Henry de Valence <hdevalence@gmail.com>
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License along
15  with this program; if not, write to the Free Software Foundation, Inc.,
16  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 
18 */
19 
20 #include "projector.h"
21 
22 #include <cmath>
23 
24 #include "ksutils.h"
25 #include "kstarsdata.h"
26 #include "skycomponents/skylabeler.h"
27 
28 namespace {
29  void toXYZ(const SkyPoint* p, double *x, double *y, double *z) {
30  double sinRa, sinDec, cosRa, cosDec;
31 
32  p->ra().SinCos( sinRa, cosRa );
33  p->dec().SinCos( sinDec, cosDec );
34  *x = cosDec * cosRa;
35  *y = cosDec * sinRa;
36  *z = sinDec;
37  }
38 }
39 
40 SkyPoint Projector::pointAt(double az, KStarsData* data)
41 {
42  SkyPoint p;
43  p.setAz( az );
44  p.setAlt( 0.0 );
45  p.HorizontalToEquatorial( data->lst(), data->geo()->lat() );
46  return p;
47 }
48 
49 Projector::Projector(const ViewParams& p)
50 {
51  m_data = KStarsData::Instance();
52  setViewParams(p);
53 }
54 
55 Projector::~Projector()
56 {
57 
58 }
59 
60 void Projector::setViewParams(const ViewParams& p)
61 {
62  m_vp = p;
63 
65  //Find Sin/Cos for focus point
66  m_sinY0 = 0;
67  m_cosY0 = 0;
68  if( m_vp.useAltAz ) {
69  m_vp.focus->alt().SinCos( m_sinY0, m_cosY0 );
70  } else {
71  m_vp.focus->dec().SinCos( m_sinY0, m_cosY0 );
72  }
73  //Find FOV in radians
74  m_fov = sqrt( m_vp.width*m_vp.width + m_vp.height*m_vp.height )
75  / ( 2 * m_vp.zoomFactor * dms::DegToRad );
76  //Set checkVisibility variables
77  double Ymax;
78  if ( m_vp.useAltAz ) {
79  m_xrange = 1.2*m_fov/cos( m_vp.focus->alt().radians() );
80  Ymax = fabs( m_vp.focus->alt().Degrees() ) + m_fov;
81  } else {
82  m_xrange = 1.2*m_fov/cos( m_vp.focus->dec().radians() );
83  Ymax = fabs( m_vp.focus->dec().Degrees() ) + m_fov;
84  }
85  m_isPoleVisible = (Ymax >= 90.0);
86 }
87 
88 double Projector::fov() const
89 {
90  return m_fov;
91 }
92 
93 QPointF Projector::toScreen(const SkyPoint* o, bool oRefract, bool* onVisibleHemisphere) const
94 {
95  return KSUtils::vecToPoint( toScreenVec(o, oRefract, onVisibleHemisphere) );
96 }
97 
98 bool Projector::onScreen(const QPointF& p) const
99 {
100  return (0 <= p.x() && p.x() <= m_vp.width &&
101  0 <= p.y() && p.y() <= m_vp.height);
102 }
103 
104 bool Projector::onScreen(const Vector2f& p) const
105 {
106  return (0 <= p.x() && p.x() <= m_vp.width &&
107  0 <= p.y() && p.y() <= m_vp.height);
108 }
109 
110 QPointF Projector::clipLine( SkyPoint *p1, SkyPoint *p2 ) const
111 {
112  return KSUtils::vecToPoint( clipLineVec(p1,p2));
113 }
114 
115 Vector2f Projector::clipLineVec( SkyPoint *p1, SkyPoint *p2 ) const
116 {
117  /* ASSUMES p1 was not clipped but p2 was.
118  * Return the QPoint that barely clips in the line twixt p1 and p2.
119  */
120  //TODO: iteration = ceil( 0.5*log2( w^2 + h^2) )??
121  // also possibly rewrite this
122  // --hdevalence
123  int iteration = 15; // For "perfect" clipping:
124  // 2^interations should be >= max pixels/line
125  bool isVisible = true; // so we start at midpoint
126  SkyPoint mid;
127  Vector2f oMid;
128  double x, y, z, dx, dy, dz, ra, dec;
129  int newx, newy, oldx, oldy;
130  oldx = oldy = -10000; // any old value that is not the first omid
131 
132  toXYZ( p1, &x, &y, &z );
133  // -jbb printf("\np1: %6.4f %6.4f %6.4f\n", x, y, z);
134 
135  toXYZ( p2, &dx, &dy, &dz );
136 
137  // -jbb printf("p2: %6.4f %6.4f %6.4f\n", dx, dy, dz);
138  dx -= x;
139  dy -= y;
140  dz -= z;
141  // Successive approximation to point on line that just clips.
142  while(iteration-- > 0) {
143  dx *= .5;
144  dy *= .5;
145  dz *= .5;
146  if ( ! isVisible ) { // move back toward visible p1
147  x -= dx;
148  y -= dy;
149  z -= dz;
150  }
151  else { // move out toward clipped p2
152  x += dx;
153  y += dy;
154  z += dz;
155  }
156 
157  // -jbb printf(" : %6.4f %6.4f %6.4f\n", x, y, z);
158  // [x, y, z] => [ra, dec]
159  ra = atan2( y, x );
160  dec = asin( z / sqrt(x*x + y*y + z*z) );
161 
162  mid = SkyPoint( ra * 12. / dms::PI, dec * 180. / dms::PI );
163  mid.EquatorialToHorizontal( m_data->lst(), m_data->geo()->lat() );
164 
165  oMid = toScreenVec( &mid, false, &isVisible );
166  //AND the result with checkVisibility to clip things going below horizon
167  isVisible &= checkVisibility(&mid);
168  newx = (int) oMid.x();
169  newy = (int) oMid.y();
170 
171  // -jbb printf("new x/y: %4d %4d", newx, newy);
172  if ( (oldx == newx) && (oldy == newy) ) {
173  break;
174  }
175  oldx = newx;
176  oldy = newy;
177  }
178  return oMid;
179 }
180 
181 bool Projector::checkVisibility( SkyPoint *p ) const
182 {
183  //TODO deal with alternate projections
184  //not clear how this depends on projection
185  //FIXME do these heuristics actually work?
186 
187  double dX, dY;
188 
189  //Skip objects below the horizon if the ground is drawn
190  /* Is the cost of this conversion actually less than drawing it anyways?
191  * EquatorialToHorizontal takes 3 SinCos calls -- so 6 trig calls if not using GNU exts.
192  */
193  /*
194  if( m_vp.fillGround ) {
195  if( !m_vp.useAltAz )
196  p->EquatorialToHorizontal( m_data->lst(), m_data->geo()->lat() );
197  if( p->alt().Degrees() < -1.0 ) return false;
198  }
199  */ //Here we hope that the point has already been 'synchronized'
200  if( m_vp.fillGround /*&& m_vp.useAltAz*/ && p->alt().Degrees() < -1.0 ) return false;
201 
202  if ( m_vp.useAltAz ) {
205  dY = fabs( p->alt().Degrees() - m_vp.focus->alt().Degrees() ) -2.;
206  } else {
207  dY = fabs( p->dec().Degrees() - m_vp.focus->dec().Degrees() );
208  }
209  if( m_isPoleVisible )
210  dY *= 0.75; //increase effective FOV when pole visible.
211  if( dY > m_fov )
212  return false;
213  if( m_isPoleVisible )
214  return true;
215 
216  if ( m_vp.useAltAz ) {
217  dX = fabs( p->az().Degrees() - m_vp.focus->az().Degrees() );
218  } else {
219  dX = fabs( p->ra().Degrees() - m_vp.focus->ra().Degrees() );
220  }
221  if ( dX > 180.0 )
222  dX = 360.0 - dX; // take shorter distance around sky
223 
224  return dX < m_xrange;
225 }
226 
227 double Projector::findPA( SkyObject *o, float x, float y ) const
228 {
229  //Find position angle of North using a test point displaced to the north
230  //displace by 100/zoomFactor radians (so distance is always 100 pixels)
231  //this is 5730/zoomFactor degrees
232  KStarsData *data = KStarsData::Instance();
233  double newDec = o->dec().Degrees() + 5730.0/m_vp.zoomFactor;
234  if ( newDec > 90.0 )
235  newDec = 90.0;
236  SkyPoint test( o->ra().Hours(), newDec );
237  if ( m_vp.useAltAz )
238  test.EquatorialToHorizontal( data->lst(), data->geo()->lat() );
239  Vector2f t = toScreenVec( &test );
240  float dx = t.x() - x;
241  float dy = y - t.y(); //backwards because QWidget Y-axis increases to the bottom
242  float north;
243  if ( dy ) {
244  north = atan2f( dx, dy )*180.0/dms::PI;
245  } else {
246  north = (dx > 0.0 ? -90.0 : 90.0);
247  }
248 
249  return ( north + o->pa() );
250 }
251 
252 QVector< Vector2f > Projector::groundPoly(SkyPoint* labelpoint, bool *drawLabel) const
253 {
254  KStarsData *data = KStarsData::Instance();
255  QVector<Vector2f> ground;
256 
257  static const QString horizonLabel = i18n("Horizon");
258  float marginLeft, marginRight, marginTop, marginBot;
259  SkyLabeler::Instance()->getMargins( horizonLabel, &marginLeft, &marginRight,
260  &marginTop, &marginBot );
261 
262  //daz is 1/2 the width of the sky in degrees
263  double daz = 90.;
264  if ( m_vp.useAltAz ) {
265  daz = 0.5*m_vp.width*57.3/m_vp.zoomFactor; //center to edge, in degrees
266  if ( type() == SkyMap::Orthographic ) {
267  daz = daz * 1.4;
268  }
269  daz = qMin(90.0, daz);
270  }
271 
272  double faz = m_vp.focus->az().Degrees();
273  double az1 = faz -daz;
274  double az2 = faz +daz;
275 
276  bool allGround = true;
277  bool allSky = true;
278 
279  double inc = 1.0;
280  //Add points along horizon
281  for(double az = az1; az <= az2 + inc; az += inc) {
282  SkyPoint p = pointAt(az,data);
283  bool visible = false;
284  Vector2f o = toScreenVec(&p, false, &visible);
285  if( visible ) {
286  ground.append( o );
287  //Set the label point if this point is onscreen
288  if ( labelpoint && o.x() < marginRight && o.y() > marginTop && o.y() < marginBot )
289  *labelpoint = p;
290 
291  if ( o.y() > 0. ) allGround = false;
292  if ( o.y() < m_vp.height ) allSky = false;
293  }
294  }
295 
296  if( allSky ) {
297  if( drawLabel)
298  *drawLabel = false;
299  return QVector<Vector2f>();
300  }
301 
302  if( allGround ) {
303  ground.clear();
304  ground.append( Vector2f( -10., -10. ) );
305  ground.append( Vector2f( m_vp.width +10., -10. ) );
306  ground.append( Vector2f( m_vp.width +10., m_vp.height +10. ) );
307  ground.append( Vector2f( -10., m_vp.height +10. ) );
308  if( drawLabel)
309  *drawLabel = false;
310  return ground;
311  }
312 
313  //In Gnomonic projection, or if sufficiently zoomed in, we can complete
314  //the ground polygon by simply adding offscreen points
315  //FIXME: not just gnomonic
316  if ( daz < 25.0 || type() == SkyMap::Gnomonic ) {
317  ground.append( Vector2f( m_vp.width + 10.f, ground.last().y() ) );
318  ground.append( Vector2f( m_vp.width + 10.f, m_vp.height + 10.f ) );
319  ground.append( Vector2f( -10.f, m_vp.height + 10.f ) );
320  ground.append( Vector2f( -10.f, ground.first().y() ) );
321  } else {
322  double r = m_vp.zoomFactor*radius();
323  double t1 = atan2( -1.*(ground.last().y() - 0.5*m_vp.height), ground.last().x() - 0.5*m_vp.width )/dms::DegToRad;
324  double t2 = t1 - 180.;
325  for ( double t=t1; t >= t2; t -= inc ) { //step along circumference
326  dms a( t );
327  double sa(0.), ca(0.);
328  a.SinCos( sa, ca );
329  ground.append( Vector2f( 0.5*m_vp.width + r*ca, 0.5*m_vp.height - r*sa) );
330  }
331  }
332 
333  if( drawLabel)
334  *drawLabel = true;
335  return ground;
336 }
337 
338 bool Projector::unusablePoint(const QPointF& p) const
339 {
340  //r0 is the angular size of the sky horizon, in radians
341  double r0 = radius();
342  //If the zoom is high enough, all points are usable
343  //The center-to-corner distance, in radians
344  double r = 0.5*1.41421356*m_vp.width/m_vp.zoomFactor;
345  if( r < r0 ) return false;
346  //At low zoom, we have to determine whether the point is beyond the sky horizon
347  //Convert pixel position to x and y offsets in radians
348  double dx = (0.5*m_vp.width - p.x())/m_vp.zoomFactor;
349  double dy = (0.5*m_vp.height - p.y())/m_vp.zoomFactor;
350  return (dx*dx + dy*dy) > r0*r0;
351 }
352 
353 SkyPoint Projector::fromScreen(const QPointF& p, dms* LST, const dms* lat) const
354 {
355  dms c;
356  double sinc, cosc;
360  double sinY0, cosY0;
361  //Convert pixel position to x and y offsets in radians
362  double dx = (0.5*m_vp.width - p.x())/m_vp.zoomFactor;
363  double dy = (0.5*m_vp.height - p.y())/m_vp.zoomFactor;
364 
365  double r = sqrt( dx*dx + dy*dy );
366  c.setRadians( projectionL(r) );
367  c.SinCos( sinc, cosc );
368 
369  if( m_vp.useAltAz ) {
370  dx = -1.0*dx; //Azimuth goes in opposite direction compared to RA
371  m_vp.focus->alt().SinCos( sinY0, cosY0 );
372  } else {
373  m_vp.focus->dec().SinCos( sinY0, cosY0 );
374  }
375 
376  double Y = asin( cosc*sinY0 + ( dy*sinc*cosY0 )/r );
377  double atop = dx*sinc;
378  double abot = r*cosY0*cosc - dy*sinY0*sinc;
379  double A = atan2( atop, abot );
380 
381  SkyPoint result;
382  if ( m_vp.useAltAz ) {
383  dms alt, az;
384  alt.setRadians( Y );
385  az.setRadians( A + m_vp.focus->az().radians() );
386  if ( m_vp.useRefraction )
387  alt = SkyPoint::unrefract( alt );
388  result.setAlt( alt );
389  result.setAz( az );
390  result.HorizontalToEquatorial( LST, lat );
391  } else {
392  dms ra, dec;
393  dec.setRadians( Y );
394  ra.setRadians( A + m_vp.focus->ra().radians() );
395  result.set( ra.reduce(), dec );
396  result.EquatorialToHorizontal( LST, lat );
397  }
398 
399  return result;
400 }
401 
402 Vector2f Projector::toScreenVec(const SkyPoint* o, bool oRefract, bool* onVisibleHemisphere) const
403 {
404  double Y, dX;
405  double sindX, cosdX, sinY, cosY;
406 
407  oRefract &= m_vp.useRefraction;
408  if ( m_vp.useAltAz ) {
409  if ( oRefract )
410  Y = SkyPoint::refract( o->alt() ).radians(); //account for atmospheric refraction
411  else
412  Y = o->alt().radians();
413  dX = m_vp.focus->az().reduce().radians() - o->az().reduce().radians();
414  } else {
415  dX = o->ra().reduce().radians() - m_vp.focus->ra().reduce().radians();
416  Y = o->dec().radians();
417  }
418 
419  Q_ASSERT( std::isfinite( Y ) && std::isfinite( dX ) );
420 
421  dX = KSUtils::reduceAngle(dX, -dms::PI, dms::PI);
422 
423  //Convert dX, Y coords to screen pixel coords, using GNU extension if available
424  #if ( __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 )
425  sincos( dX, &sindX, &cosdX );
426  sincos( Y, &sinY, &cosY );
427  #else
428  sindX = sin(dX); cosdX = cos(dX);
429  sinY = sin(Y); cosY = cos(Y);
430  #endif
431 
432  //c is the cosine of the angular distance from the center
433  double c = m_sinY0*sinY + m_cosY0*cosY*cosdX;
434 
435  //If c is less than 0.0, then the "field angle" (angular distance from the focus)
436  //is more than 90 degrees. This is on the "back side" of the celestial sphere
437  //and should not be drawn.
438  if( onVisibleHemisphere )
439  *onVisibleHemisphere = (c > cosMaxFieldAngle()); // TODO: Isn't it more efficient to bypass the final calculation below if the object is not visible?
440 
441  double k = projectionK(c);
442 
443  return Vector2f( 0.5*m_vp.width - m_vp.zoomFactor*k*cosY*sindX,
444  0.5*m_vp.height - m_vp.zoomFactor*k*( m_cosY0*sinY - m_sinY0*cosY*cosdX ) );
445 }
446 
Projector::~Projector
virtual ~Projector()
Definition: projector.cpp:55
SkyPoint::ra
const dms & ra() const
Definition: skypoint.h:171
Projector::onScreen
bool onScreen(const QPointF &p) const
Check whether the projected point is on-screen.
Definition: projector.cpp:98
Projector::toScreenVec
virtual Vector2f toScreenVec(const SkyPoint *o, bool oRefract=true, bool *onVisibleHemisphere=0) const
Given the coordinates of the SkyPoint argument, determine the pixel coordinates in the SkyMap...
Definition: projector.cpp:402
SkyPoint::set
void set(const dms &r, const dms &d)
Sets RA, Dec and RA0, Dec0 according to arguments.
Definition: skypoint.cpp:46
Projector::groundPoly
virtual QVector< Vector2f > groundPoly(SkyPoint *labelpoint=0, bool *drawLabel=0) const
Get the ground polygon.
Definition: projector.cpp:252
Projector::m_sinY0
double m_sinY0
Definition: projector.h:228
ViewParams::useRefraction
bool useRefraction
Definition: projector.h:42
KSUtils::reduceAngle
T reduceAngle(T x, T min, T max)
Put angle into range.
Definition: ksutils.h:74
KStarsData
KStarsData is the backbone of KStars.
Definition: kstarsdata.h:66
SkyPoint::az
const dms & az() const
Definition: skypoint.h:177
KSUtils::vecToPoint
QPointF vecToPoint(const Vector2f &vec)
Convert a vector to a point.
Definition: ksutils.h:91
Projector::type
virtual SkyMap::Projection type() const =0
Return the type of this projection.
SkyPoint::refract
static double refract(const double alt)
Apply refraction correction to altitude.
Definition: skypoint.cpp:765
SkyMap::Gnomonic
Definition: skymap.h:101
SkyPoint::setAz
void setAz(dms az)
Sets Az, the Azimuth.
Definition: skypoint.h:152
ViewParams::focus
SkyPoint * focus
Definition: projector.h:45
KStarsData::lst
dms * lst()
Definition: kstarsdata.h:161
KStarsData::Instance
static KStarsData * Instance()
Definition: kstarsdata.h:92
dms::Degrees
const double & Degrees() const
Definition: dms.h:98
SkyObject::pa
virtual double pa() const
Definition: skyobject.h:194
KStarsData::geo
GeoLocation * geo()
Definition: kstarsdata.h:164
Projector::m_cosY0
double m_cosY0
Definition: projector.h:228
SkyLabeler::getMargins
void getMargins(const QString &text, float *left, float *right, float *top, float *bot)
sets four margins for help in keeping labels entirely on the screen.
Definition: skylabeler.cpp:195
Projector::checkVisibility
bool checkVisibility(SkyPoint *p) const
Determine if the skypoint p is likely to be visible in the display window.
Definition: projector.cpp:181
Projector::cosMaxFieldAngle
virtual double cosMaxFieldAngle() const
This function returns the cosine of the maximum field angle, i.e., the maximum angular distance from ...
Definition: projector.h:219
NaN::f
const float f
Definition: nan.h:36
Projector::findPA
double findPA(SkyObject *o, float x, float y) const
Determine the on-screen position angle of a SkyObject.
Definition: projector.cpp:227
SkyLabeler::Instance
static SkyLabeler * Instance()
Definition: skylabeler.cpp:49
Projector::Projector
Projector(const ViewParams &p)
Constructor.
Definition: projector.cpp:49
SkyPoint
The sky coordinates of a point in the sky.
Definition: skypoint.h:50
ViewParams::width
float width
Definition: projector.h:40
Projector::toScreen
QPointF toScreen(const SkyPoint *o, bool oRefract=true, bool *onVisibleHemisphere=0) const
This is exactly the same as toScreenVec but it returns a QPointF.
Definition: projector.cpp:93
Projector::pointAt
static SkyPoint pointAt(double az, KStarsData *data)
Helper function for drawing ground.
Definition: projector.cpp:40
ViewParams::useAltAz
bool useAltAz
Definition: projector.h:43
Projector::fromScreen
virtual SkyPoint fromScreen(const QPointF &p, dms *LST, const dms *lat) const
Determine RA, Dec coordinates of the pixel at (dx, dy), which are the screen pixel coordinate offsets...
Definition: projector.cpp:353
Projector::fov
double fov() const
Return the FOV of this projection.
Definition: projector.cpp:88
ViewParams::height
float height
Definition: projector.h:40
Projector::projectionL
virtual double projectionL(double x) const
This function handles some of the projection-specific code.
Definition: projector.h:212
Projector::m_data
KStarsData * m_data
Definition: projector.h:226
SkyPoint::HorizontalToEquatorial
void HorizontalToEquatorial(const dms *LST, const dms *lat)
Determine the (RA, Dec) coordinates of the SkyPoint from its (Altitude, Azimuth) coordinates, given the local sidereal time and the observer's latitude.
Definition: skypoint.cpp:102
Projector::clipLineVec
Vector2f clipLineVec(SkyPoint *p1, SkyPoint *p2) const
ASSUMES *p1 did not clip but *p2 did.
Definition: projector.cpp:115
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
Projector::clipLine
QPointF clipLine(SkyPoint *p1, SkyPoint *p2) const
ASSUMES *p1 did not clip but *p2 did.
Definition: projector.cpp:110
Projector::radius
virtual double radius() const
Get the radius of this projection's sky circle.
Definition: projector.h:202
Projector::m_vp
ViewParams m_vp
Definition: projector.h:227
SkyPoint::dec
const dms & dec() const
Definition: skypoint.h:174
dms::Hours
double Hours() const
Definition: dms.h:125
SkyPoint::EquatorialToHorizontal
void EquatorialToHorizontal(const dms *LST, const dms *lat)
Determine the (Altitude, Azimuth) coordinates of the SkyPoint from its (RA, Dec) coordinates, given the local sidereal time and the observer's latitude.
Definition: skypoint.cpp:55
GeoLocation::lat
const dms * lat() const
Definition: geolocation.h:79
Projector::projectionK
virtual double projectionK(double x) const
This function handles some of the projection-specific code.
Definition: projector.h:207
PI
#define PI
Definition: satellite.cpp:43
projector.h
ViewParams::zoomFactor
float zoomFactor
Definition: projector.h:41
SkyPoint::unrefract
static double unrefract(const double alt)
Remove refraction correction.
Definition: skypoint.cpp:778
SkyPoint::setAlt
void setAlt(dms alt)
Sets Alt, the Altitude.
Definition: skypoint.h:141
kstarsdata.h
skylabeler.h
SkyPoint::alt
const dms & alt() const
Definition: skypoint.h:180
SkyMap::Orthographic
Definition: skymap.h:98
Projector::unusablePoint
virtual bool unusablePoint(const QPointF &p) const
Check if the current point on screen is a valid point on the sky.
Definition: projector.cpp:338
ksutils.h
SkyObject
Provides all necessary information about an object in the sky: its coordinates, name(s), type, magnitude, and QStringLists of URLs for images and webpages regarding the object.
Definition: skyobject.h:46
Projector::m_fov
double m_fov
Definition: projector.h:229
Projector::setViewParams
void setViewParams(const ViewParams &p)
Update cached values for projector.
Definition: projector.cpp:60
ViewParams
This is just a container that holds infromation needed to do projections.
Definition: projector.h:37
ViewParams::fillGround
bool fillGround
If the ground is filled, then points below horizon are invisible.
Definition: projector.h:44
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal