Angle of Vector


I am trying to do something with exact angle performance between two edges, so far I handle it with the code as below

Although I know the with_angle function in EdgePairs class, but I still prefer exact angle value, not sure there is some mystic function ?

Somehow the calculation noise will take place ( out of domian - acos ) , but it's not problem, and can be solved by simple rounding

include RBA

v1 =,-17)
v2 =,-17)

dot = (v1.x * v2.x + v1.y * v2.y)/(v1.abs*v2.abs)
dot1 = dot.round(5) # remove calculate noise

p dot 
p dot1

arc1 = Math::acos(dot1)
arc = Math::acos(dot)

Thanks and Good Day


  • Hi Vincent,

    Floating-point arithmetics is never exactly accurate and errors accumulate. In side KLayout I am doing something like this:

    angle_with_noise = ...
    # for example, test if the angle is 45 degree:
    if (angle_with_noise - 45.0).abs < 1e-10

    The 1e-10 value is somewhat arbitrary - it should be large enough not to be noise sensitive, but small enough to be "precise".

    There is a rough estimate for the minimum angle between two edges which are not parallel: as the database is made from 32bit integer coordinates, the smallest possible angle is 1 DBU / 2^32 DBU which is about 2.5e-10 (rad). In degree units that is 1.5e-8 degree. The noise is about 1e-16 relative. For an angle value of 0..360 degree, this translates into 3.6e-14 max noise. So 1e-10 is somewhere in between and a good choice for differentiating noise from real angle differences.

    To compute the angle between two vectors, I'd propose this code:

    v1 = RBA::Vector::new(0, 1000)
    v2 = RBA::Vector::new(1234, 1234)
    vp = v1.vprod(v2)
    sp = v1.sprod(v2)
    angle = Math::atan2(vp, sp) * 180.0 / Math::PI

    This computes the angle between v1 and v2, the angles counted in counter-clockwise direction.


  • Hello Matthias,

    Thanks for detail explanation, it's helpful to learn more about K-layout :)

    Good Day

Sign In or Register to comment.