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