I am doing an image drawing and rendering library, and would like some feedback on this code, it simply draws a line in any direction.

The equation for that is:

m = (y2 - y1) / (x2 - x1)

b = y1 - m * x1

y = mx + b

It works but all these if statements are bothering me, and I am not sure if it's the best solution.

proc line*(img: var Image, x1, y1, x2, y2: int) =
  # Necessary pass the values to variables so we can manipulate them
    a1 = x1
    a2 = x2
    b1 = y1
    b2 = y2

  # To draw correctly we need to iterate over the longest axis
  if abs(a1 - a2) > abs(b1 - b2):
    swap(a1, b1)
    swap(a2, b2)

  # ¹ To make sure we are iterating from the lower to the higher
  if b1 > b2:
    swap(a1, a2)
    swap(b1, b2)

  let m = (a2 - a1) / (b2 - b1)
  let s = float(a1) - m * float(b1)

  # ¹ Since we swiped the axis we need to swap x and y
  if abs(x1 - x2) > abs(y1 - y2):
    for b in b1..b2:
      let a = float(b) * m + s
      img.pixel(b, toInt(a), img.strokeColor)
    for b in b1..b2:
      let a = float(b) * m + s
      img.pixel(toInt(a), b, img.strokeColor)
  • \$\begingroup\$ Hi, could you maybe expand a little bit more on what your code is doing? I think you're overcomplicating it with the axis swapping and all \$\endgroup\$ – IEatBagels Jul 5 at 15:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.