---
tag: g002
title: Arc or Circle Move
brief: Add an arc or circle movement to the planner
author: thinkyhead
contrib: shitcreek, edwilliams16

group: motion
since: 1.0.0-beta
requires: ARC_SUPPORT

codes: [ G2, G3 ]
related: [ G17, G18, G19 ]

parameters:
- tag: X
  optional: true
  description: A coordinate on the X axis
  values:
  - tag: pos
    type: float

- tag: Y
  optional: true
  description: A coordinate on the Y axis
  values:
  - tag: pos
    type: float

- tag: Z
  optional: true
  description: A coordinate on the Z axis
  values:
  - tag: pos
    type: float

- tag: A
  optional: true
  since: 2.0.9
  requires: I_DRIVER_TYPE, AXIS4_NAME 'A'
  description: A coordinate on the A axis
  values:
  - tag: pos
    type: float

- tag: B
  optional: true
  since: 2.0.9
  requires: J_DRIVER_TYPE, AXIS5_NAME 'B'
  description: A coordinate on the B axis
  values:
  - tag: pos
    type: float

- tag: C
  optional: true
  since: 2.0.9
  requires: K_DRIVER_TYPE, AXIS6_NAME 'C'
  description: A coordinate on the C axis
  values:
  - tag: pos
    type: float

- tag: U
  optional: true
  since: 2.1
  requires: U_DRIVER_TYPE, AXIS7_NAME 'U'
  description: A coordinate on the U axis
  values:
  - tag: pos
    type: float

- tag: V
  optional: true
  since: 2.1
  requires: V_DRIVER_TYPE, AXIS8_NAME 'V'
  description: A coordinate on the V axis
  values:
  - tag: pos
    type: float

- tag: W
  optional: true
  since: 2.1
  requires: W_DRIVER_TYPE, AXIS9_NAME 'W'
  description: A coordinate on the W axis
  values:
  - tag: pos
    type: float

- tag: I
  type: float
  optional: false
  description: An offset from the current X position to use as the arc center
  values:
  - tag: offset
    type: float

- tag: J
  type: float
  optional: false
  description: An offset from the current Y position to use as the arc center
  values:
  - tag: offset
    type: float

- tag: R
  type: float
  optional: false
  description: A radius from the current XY position to use as the arc center
  values:
  - tag: radius
    type: float

- tag: E
  type: float
  optional: true
  description: The amount to extrude between the start point and end point
  values:
  - tag: pos
    type: float

- tag: F
  optional: true
  description: |
    The nominal movement rate. For moves involving all primary axes (XYZ), the feed rate is applied along the helical trajectory.

    The feedrate set here applies to subsequent moves that omit this parameter. Feedrate is interpreted according to the specification for LinuxCNC default state (trivial kinematics, `CANON_XYZ` feed reference mode, Units-Per-Minute mode). For details, refer to the [LinuxCNC documentation](//linuxcnc.org/docs/html/gcode/machining-center.html#sub:feed-rate).
  values:
  - tag: rate
    type: float
    optional: false

- tag: P
  optional: true
  requires: ARC_P_CIRCLES
  description: Specify complete circles.
  values:
  - tag: count
    type: int

- tag: S
  optional: true
  since: 2.0.8
  description: Set the Laser power for the move.
  values:
  - tag: power
    type: float

examples:
- pre: Move in a clockwise arc from the current position to [125, 32] with the center offset from the current position by (10.5, 10.5).
  code: G2 X125 Y32 I10.5 J10.5

- pre: Move in a counter-clockwise arc from the current position to [125, 32] with the center offset from the current position by (10.5, 10.5).
  code: G3 X125 Y32 I10.5 J10.5

- pre: Move in a complete clockwise circle with the center offset from the current position by [20, 20].
  code: G2 I20 J20

images:
- title: G3 command geometry
  caption: This illustrates a counter clockwise arc, starting at [9, 6]. It can be generated either by `G3 X2 Y7 I-4 J-3` or `G3 X2 Y7 R5`
  path: G3fig.png

---

`G2` adds a clockwise arc move to the planner; `G3` adds a counter-clockwise arc. An arc move starts at the current position and ends at the given XYZ, pivoting around a center-point offset given by `I` and `J` or `R`.

[`CNC_WORKSPACE_PLANES`](/docs/gcode/G017-G019.html) allows `G2/G3` to operate in the selected XY, ZX, or YZ workspace plane.

This command has two forms:
#### I J Form

 - `I` specifies an X offset. `J` specifies a Y offset.
 - At least one of the `I` `J` parameters is required.
 - `X` and `Y` can be omitted to do a complete circle.
 - The given `X` `Y` is not error-checked.
   The arc ends based on the angle of the destination.
 - Mixing `I` or `J` with `R` will throw an error.

#### R Form
 - `R` specifies the radius. `X` or `Y` is required.
 - Omitting both `X` and `Y` will throw an error.
 - `X` or `Y` must differ from the current XY position.
 - Mixing `R` with `I` or `J` will throw an error.

Arc moves actually generate several short straight-line moves, the length of which are determined by the configuration option `MM_PER_ARC_SEGMENT` (default 1mm). Any change in the position on the Z, A, B, C, U, V, and W axes is linearly interpolated over the whole arc.

'ARC_P_CIRCLES' enables the use of the 'P' parameter to specify complete circles
