From 4fb7f0fe0d42c8fbfbcdc3a807b8c62c1362717b Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Mon, 4 Sep 2023 18:37:26 +0200
Subject: [PATCH] Solved a bug when computing the in and out road radius when
 creating junction links.

---
 src/osm/osm_junction.cpp | 36 +++++++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/osm/osm_junction.cpp b/src/osm/osm_junction.cpp
index 0fab72f..9e5ec0f 100644
--- a/src/osm/osm_junction.cpp
+++ b/src/osm/osm_junction.cpp
@@ -608,37 +608,55 @@ void COSMJunction::create_links(void)
               node3=&out_way.get_segment_end_node(FIRST_SEGMENT);
             else
               node3=&out_way.get_segment_start_node(LAST_SEGMENT);
+            in_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0)*in_way.get_lane_width();
+            if(in_way.is_node_first(this->parent_node->get_id()))
+            {
+              node1=&in_way.get_segment_end_node(FIRST_SEGMENT);
+              left=in_way.is_node_left(*node3,false,0.2);
+              right=in_way.is_node_right(*node3,false,0.2);
+            }
+            else
+            {
+              node1=&in_way.get_segment_start_node(LAST_SEGMENT);
+              left=in_way.is_node_left(*node3,true,0.2);
+              right=in_way.is_node_right(*node3,true,0.2);
+            }
+            /*
             if(in_way.is_node_first(this->parent_node->get_id()))
             {
               node1=&in_way.get_segment_end_node(FIRST_SEGMENT);
               if((left=in_way.is_node_left(*node3,false,0.2))==true)
-                in_radius=DEFAULT_MIN_RADIUS+((k+1)/2.0)*in_way.get_lane_width();
+                in_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0-k)*in_way.get_lane_width();
               else if((right=in_way.is_node_right(*node3,false,0.2))==true)
-                in_radius=DEFAULT_MIN_RADIUS+(((double)(in_way.get_num_lanes()-1)-k)/2.0)*in_way.get_lane_width();
+                in_radius=DEFAULT_MIN_RADIUS+(k+1-in_way.get_num_lanes()/2.0)*in_way.get_lane_width();
             }
             else
             {
               node1=&in_way.get_segment_start_node(LAST_SEGMENT);
               if((left=in_way.is_node_left(*node3,true,0.2))==true)
-                in_radius=DEFAULT_MIN_RADIUS+(((double)(in_way.get_num_lanes()-1)-k)/2.0)*in_way.get_lane_width();
+                in_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0)*in_way.get_lane_width();
               else if((right=in_way.is_node_right(*node3,true,0.2))==true)
-                in_radius=DEFAULT_MIN_RADIUS+((k+1)/2.0)*in_way.get_lane_width();
+                in_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0-k)*in_way.get_lane_width();
             }
+            */
+            out_radius=DEFAULT_MIN_RADIUS+(out_way.get_num_lanes()/2.0)*out_way.get_lane_width();
+            /*
             if(out_way.is_node_first(this->parent_node->get_id()))
             {
               if(left)
-                out_radius=DEFAULT_MIN_RADIUS+(((double)(out_way.get_num_lanes()-1)-l)/2.0)*out_way.get_lane_width();
+                out_radius=DEFAULT_MIN_RADIUS+(l+1-in_way.get_num_lanes()/2.0)*in_way.get_lane_width();
               else if(right)
-                out_radius=DEFAULT_MIN_RADIUS+((l+1)/2.0)*out_way.get_lane_width();
+                out_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0-l)*in_way.get_lane_width();
             }
             else
             {
               if(left)
-                out_radius=DEFAULT_MIN_RADIUS+((l+1)/2.0)*out_way.get_lane_width();
+                out_radius=DEFAULT_MIN_RADIUS+(in_way.get_num_lanes()/2.0-l)*in_way.get_lane_width();
               else if(right)
-                out_radius=DEFAULT_MIN_RADIUS+(((double)(out_way.get_num_lanes()-1)-l)/2.0)*out_way.get_lane_width();
+                out_radius=DEFAULT_MIN_RADIUS+(l+1-in_way.get_num_lanes()/2.0)*in_way.get_lane_width();
             }
-//            std::cout << "in way: " << in_way.id << " lane " << k << " out way: " << out_way.id << " lane " << l << " in radius " << in_radius << " out radius " << out_radius << std::endl;
+            */
+//          std::cout << "in way: " << in_way.id << " lane " << k << " out way: " << out_way.id << " lane " << l << " in radius " << in_radius << " out radius " << out_radius << " num lanes in: " << in_way.get_num_lanes() << " num fwd lanes in: " << in_way.get_num_forward_lanes() << " num lanes out: " << out_way.get_num_lanes() <<  " num fwd lanes out: " << out_way.get_num_forward_lanes()  << std::endl;
             angle=this->parent_node->compute_angle(*node1,*node3);
             if(!left && !right)
             {
-- 
GitLab