It's also possible to write microprocessor assembly language in any
other language.
The following code generates the OP's list of points with nothing more
complicated than integer addition/subtraction inside the loop. It also
does the right thing if the radius is not an integer, and avoids the
OP's  "0.71 approx == sin(45 deg) aka 1/sqrt(2)" caper.

Wrt your Pythonic suggestion: "I'll bet this does the trick for you and
runs faster than what you've got": You lose on "does the trick" (should
be <= radsq). As for the second clause, a prerequisite to testing that
is to get the OP to say what his typical radius and typical enclosing
box size are (and get your point that they should not be the same).

Cheers,
John

# def octant(radius):
#     assert radius >= 0
#     filllist = []
#     dx = int(radius)
#     dy = 0
#     trigger = dx * dx - int(radius * radius)
#     dx_squared_delta = dx + dx - 1
#     dy_squared_delta = 1
#     while dy <= dx:
#         if trigger <= 0:
#             for x in range(dy, dx+1):
#                 filllist.append((x, dy))
#             dy += 1
#             trigger += dy_squared_delta
#             dy_squared_delta += 2
#         else:
#             dx -= 1
#             trigger -= dx_squared_delta
#             dx_squared_delta -= 2
#     filllist.sort()
#     print "%.2f %r" % (radius, filllist)

# if __name__ == "__main__":
#     octant(3.99)
#     octant(4)
#     octant(4.01)
#     octant(3.60)
#     octant(3.61)
#     octant(0.01)
#     octant(0)

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to