File indexing completed on 2024-05-12 03:50:40

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2010 Dennis Nienhüser <nienhueser@kde.org>
0004 //
0005 
0006 #include "InstructionTransformation.h"
0007 
0008 #include <cmath>
0009 
0010 namespace Marble
0011 {
0012 
0013 RoutingInstructions InstructionTransformation::process( const RoutingWaypoints &model )
0014 {
0015     RoutingInstructions result;
0016 
0017     int lastAngle = 0;
0018     for( int i = 0; i < model.size(); ++i ) {
0019         const RoutingWaypoint &item = model[i];
0020         int newAngle = 180 + lastAngle;
0021         if ( i < model.size() - 1 ) {
0022             newAngle = qRound( 180.0 / M_PI * item.point().bearing( model[i+1].point() ) );
0023         }
0024         int angle = ( newAngle - lastAngle + 540 ) % 360;
0025         Q_ASSERT( angle >= 0 && angle <= 360 );
0026         if ( result.isEmpty() || !result.last().append( item, angle ) ) {
0027             result.push_back( RoutingInstruction( item ) );
0028         }
0029         lastAngle = newAngle;
0030     }
0031 
0032     for ( int i = 0; i < result.size(); ++i ) {
0033         result[i].setSuccessor( i < result.size() - 1 ? &result[i+1] : nullptr );
0034         result[i].setPredecessor( i ? &result[i-1] : nullptr );
0035     }
0036 
0037     return result;
0038 }
0039 
0040 } // namespace Marble