diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index 4fcbcf94b7de6a50415541a35844d7ef4d5e9f7e..0ee1b861e177f8369cf753b9140422b2cc4011cf 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -275,7 +275,7 @@ impl PidPane {
         let points: Vec<Vec2> = self
             .elements
             .iter()
-            .map(|e| e.position())
+            .map(|e| e.center())
             .chain(self.connections.iter().flat_map(|conn| conn.points()))
             .collect();
 
@@ -303,8 +303,7 @@ impl PidPane {
             .unwrap();
         let max = Vec2::new(max_x, max_y);
 
-        let center_g = (min + max) / 2.0;
-        self.grid.zero_pos = ui_center - center_g * self.grid.size();
+        self.grid.zero_pos = ui_center - min.midpoint(max) * self.grid.size();
     }
 
     fn handle_zoom(&mut self, ui: &Ui, theme: Theme, pointer_pos: Vec2) {
diff --git a/src/ui/panes/pid_drawing_tool/elements.rs b/src/ui/panes/pid_drawing_tool/elements.rs
index e3748a197fb3831d392aa7da02f5895c8a24e96c..7db6c7239208c62e83a4dcf92e0cd17ec43bb63f 100644
--- a/src/ui/panes/pid_drawing_tool/elements.rs
+++ b/src/ui/panes/pid_drawing_tool/elements.rs
@@ -108,9 +108,9 @@ impl Element {
         self.symbol.size()
     }
 
-    /// Position of the element's top-left corner
-    pub fn position(&self) -> Vec2 {
-        self.position
+    /// Position of the element's center in grid frame
+    pub fn center(&self) -> Vec2 {
+        self.position + Mat2::from_angle(self.rotation) * self.size() * 0.5
     }
 
     pub fn draw(&self, grid: &GridInfo, ui: &Ui, theme: Theme) {