Hi all,<br><br>First, I apologise because yesterday I was wrong to respond in the thread with subject 'Reference system'. :) I'm so sorry.<br><br>I will try explain I've done step by step, Torsten helped me:<br>
<br>I have modified ViewportParamsPrivate::setPlanetAxis() method to use another reference system to a specific kind of GeoDataCoordinates. In this method I have implemented a lat-lon-Fixed-To-Inertial coordinate conversion. This conversion uses the formula: v = s / t --> s = v * t. 'v' is the earth angular speed and 't' is the time elapsed, for this reason I need the marble clock.<br>


<br>1.- I have added an attribute in GeoDataCoordinatesPrivate class to set the new type and I have added another attribute to set the marble clock. Code for GeoDataCoordinates_p.h: <a href="http://pastebin.com/mCF0eLn7" target="_blank">http://pastebin.com/mCF0eLn7</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':76,'weight':100},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515223358'}, self.className)},600);" class="wrc13" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span> The type indicates the reference system to use for the GeoDataCoordinates object. By default the value of the type is zero, this means that the reference system used is the typical reference system used for Marble.<br>
<br>

2.- Then I have modified the GeoDataCoordinates class to declare and implement the get and set methods for the the new type and for the marble clock. Code for GeoDataCoordinates.h: <a href="http://pastebin.com/pFF8hjGe" target="_blank">http://pastebin.com/pFF8hjGe</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':76,'weight':100},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515223358'}, self.className)},600);" class="wrc13" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span> and code for GeoDataCoordinates.cpp: <a href="http://pastebin.com/BUGqVETW" target="_blank">http://pastebin.com/BUGqVETW</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':76,'weight':100},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515223358'}, self.className)},600);" class="wrc13" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><br>
<br>

3.- Later I have gone to the SphericalProjection class because the methods in there are executed whenever geodetic coordinates converted to screen coordinates. I have modified the method that has this prototipe: 'bool SphericalProjection::screenCoordinates( const GeoDataCoordinates &coordinates, const ViewportParams *viewport, qreal &x, qreal &y, bool &globeHidesPoint ) const'. This is the new code for SphericalProjection.cpp: <a href="http://pastebin.com/yhGEfDf9">http://pastebin.com/yhGEfDf9</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':76,'weight':100},'flags':{},'single':true,'ttl':7200,'expireTime':'20120515225145'}, self.className)},600);" class="wrc13" style="padding-right:16px;width:16px;height:16px"></span><br>
<br>

4.- I have modified ViewportParamsPrivate::setPlanetAxis() method to use another reference system to a specific kind of GeoDataCoordinates. Code: <a href="http://pastebin.com/NDFaXJGz" target="_blank">http://pastebin.com/NDFaXJGz</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':76,'weight':100},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515223358'}, self.className)},600);" class="wrc13" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><br>


<br>Problems:<br>1.- I'm not sure that the new implementation added in ViewportParams is correct because the SphericalProjection::screenCoordinates() method doesn't call ViewportParamsPrivate::setPlanetAxis() directly.<br>
<br>Best regards.<br><br><div class="gmail_quote">2012/5/13 Torsten Rahn <span dir="ltr"><<a href="mailto:tackat@t-online.de" target="_blank">tackat@t-online.de</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Now I get it :-)<br>
<br>
Yes, I can see why this kind of problem occurs with Orbit data.<br>
<br>
Right now we basically calculate the screen positions of objects for a certain<br>
position inside the projection classes. See<br>
<br>
src/lib/Projections/SphericalProjection.cpp<br>
<br>
with methods like<br>
<br>
bool SphericalProjection::screenCoordinates( const GeoDataCoordinates<br>
&coordinates,  const ViewportParams *viewport,<br>
 qreal &x, qreal &y, bool &globeHidesPoint ) const<br>
<br>
for example. The expensive part there is the line  qpos.rotateAroundAxis( *(<br>
viewport->planetAxisMatrix() ) ); which does the basic coordinate<br>
transformation between geodetic GeoDataCoordinates and pixel coordinates.<br>
<br>
I guess that would be the proper place in the code where one could introduce<br>
other such possible reference systems. If you really want to "save" CPU cycles<br>
there then you'd probably introduce an alternative planetAxisMatrix that is<br>
used for the rotateAroundAxis method (have a look at the other places in the<br>
code where the planetAxis is calculated to do this in a similar way).<br>
This would avoid having to "convert" the positions for all the<br>
GeoDataCoordinates of the Satellites. Instead you'd just create a fitting<br>
matrix once that would work for all :-)<br>
<br>
We'd gladly accept patches that do this in a nice way ;) This means it should<br>
work for all projections with a nice API. Ideally you'd also provide some<br>
basic unit regression tests :)<br>
<br>
BR,<br>
<br>
Torsten<br>
<div><div><br>
<br>
<br>
<br>
<br>
<br>
On Sonntag, 13. Mai 2012 13:20:14 marble_developer marble_developer wrote:<br>
> Hi,<br>
><br>
> I will try to explain it a bit better.<br>
><br>
> When the Earth turns the corresponding angle in each update of Marble<br>
> clock, the points added turn the same angle too, it's the normal behaviour<br>
> in Marble because the reference system rotates with the Earth globe.<br>
><br>
> In this case, a point that has the next values for lon, lat and alt doesn't<br>
> generate an orbit. lon, lat, alt = (0, 0, 20000 * 1000). The point is drawn<br>
> always in the same point of space.<br>
><br>
> I want that the points remain fixed in the space and they doesn't turn with<br>
> the Earth.<br>
><br>
> In this case a point that has the next values for lon, lat and alt<br>
> generates an orbit. lon, lat, alt = (0, 0, 20000 * 1000). The point is<br>
> drawn in differents points of space because the point drawn remain fixed in<br>
> space.<br>
><br>
> For example, we consider that the update interval of Marble clock is 10800<br>
> s, (10800 s is the time that the Earth use to turn 45º) and that a point<br>
> with values lon, lat, alt = 0,0, 20000 * 1000 is added in each update of<br>
> Marble clock. At first, when the time is 0 s, the point p is drawn in 0,0,<br>
> 20000 * 1000, then, when the time is 10800 s, the point p is drawn in 0,0,<br>
> 20000 * 1000 but the last point p' is in -45, 0, 20000 * 1000 respect the<br>
> new point p.<br>
><br>
> I have performed this behaviour by recalculating the new lon position in<br>
> every update but it's very slowly when the number of points is elevated.<br>
><br>
> How can I do this task in a better way? Is it possible to change the<br>
> reference system using in Marble?<br>
><br>
> Regards.<br>
><br>
> 2012/5/7 marble_developer marble_developer <<a href="mailto:marbledeveloper@gmail.com" target="_blank">marbledeveloper@gmail.com</a>><br>
><br>
> > Hi all,<br>
> ><br>
> > Is it possible to change the reference system using in Marble?<br>
> > In affirmative case, how can I change it?<br>
> > I need to use an inertial reference system instead of fixed reference<br>
> > system.<br>
> ><br>
> > Best regards.<br>
</div></div><div><div>_______________________________________________<br>
Marble-devel mailing list<br>
<a href="mailto:Marble-devel@kde.org" target="_blank">Marble-devel@kde.org</a><br>
<a href="https://mail.kde.org/mailman/listinfo/marble-devel" target="_blank">https://mail.kde.org/mailman/listinfo/marble-devel</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':100,'weight':12},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515223350'}, self.className)},600);" class="wrc11" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><br>



</div></div></blockquote></div><br>