diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index 16e04b3a20ad8c8e175b552dfc3394929315ebcf..a2354bee5a9e231f0881f58cdee8896439c5dc9a 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -424,10 +424,25 @@ impl PidPane {
     fn center(&mut self, ui: &Ui) {
         let ui_center = ui.max_rect().center();
 
-        let elements_center = self.elements.iter().fold(Vec2::ZERO, |acc, e| {
-            acc + e.position.to_relative_pos2(&self.grid).to_vec2()
-        }) / self.elements.len() as f32;
+        let points: Vec<Pos> = self
+            .elements
+            .iter()
+            .map(|e| e.position.clone())
+            .chain(
+                self.connections
+                    .iter()
+                    .flat_map(|conn| conn.middle_points.clone()),
+            )
+            .collect();
+
+        let min_x = points.iter().map(|p| p.x).min().unwrap();
+        let max_x = points.iter().map(|p| p.x).max().unwrap();
+        let min_y = points.iter().map(|p| p.y).min().unwrap();
+        let max_y = points.iter().map(|p| p.y).max().unwrap();
+
+        let pid_center =
+            Pos::new((max_x + min_x) / 2, (max_y + min_y) / 2).to_relative_pos2(&self.grid);
 
-        self.grid.zero_pos = ui_center - elements_center;
+        self.grid.zero_pos = ui_center - pid_center.to_vec2();
     }
 }
diff --git a/src/ui/panes/pid_drawing_tool/pos.rs b/src/ui/panes/pid_drawing_tool/pos.rs
index 2a85b4b7dadb1a39174e33a87f816a65766407c3..88178616c6a12ac969c3c89fbeb8642009026d33 100644
--- a/src/ui/panes/pid_drawing_tool/pos.rs
+++ b/src/ui/panes/pid_drawing_tool/pos.rs
@@ -10,6 +10,10 @@ pub struct Pos {
 }
 
 impl Pos {
+    pub fn new(x: i32, y: i32) -> Self {
+        Self { x, y }
+    }
+
     pub fn add_size(&self, size: i32) -> Self {
         Self {
             x: self.x + size,