On Tue, 5 May 2009, Aditya Mahajan wrote:
Both Taco's and my solutions can be adapted so that you do not randomize the radius. (Taco's solution will also work for arbitrary object that can then be rotated by a random amount).
Here is another idea. Ask metapost to test for intersection, but code the rest of the logic in lua. Below is a proof of concept code for communicating with metapost. \startluacode circle = circle or {} function circle.path(x,y,r, name) local path = "path " .. name .. "; \n" .. name .. "= fullcircle scaled " .. 2*r .. " shifted (" .. x .. "," .. y ..") ; \n" return path end function circle.intersect(x1,y1,r1,x2,y2,r2) local mpx = metapost.format("metafun") local c = circle.path(x1,y1,r1, "c") local d = circle.path(x2,y2,r2, "d") local intersect = "pair n; n := c intersectiontimes d ; \n" local message = "if (xpart n) < 0 : \n" .. " message(\"**false**\") ; \n" .. "else : \n" .. " message(\"**true**\") ; \n" .. " endif \n" local file = c .. d .. intersect .. message -- print(file) local result = mpx:execute(file) local log = result.log if result.status < 2 then print("Metapost run successful *****************") circle.show_result(x1,y1,r1,x2,y2,r2,circle.parse(log)) else print("Metapost run unsuccessful *****************") end print(log) end function circle.parse(log) local space = lpeg.S(" \t\n") local yes = lpeg.C("**true**") local no = lpeg.C("**false**") local result = (yes + no) / circle.result local parser = space^0 * result * space^0 return parser:match(log) end function circle.result(str) return str == "**true**" end function circle.show_result(x1,y1,r1,x2,y2,r2,flag) local tprint = function(s) tex.sprint(tex.ctxcatcodes,s) end local result = "Circles (" .. x1 .. "," .. y1 .. "):" .. r1 .. " and (" .. x2 .. "," .. y2 .. "):" .. r2 .. " " if flag then result = result .. " intersect. " else result = result .. " do not intersect. " end tprint (result) end \stopluacode \starttext \startluacode circle.intersect(1,1,1,2,2,1.5) circle.intersect(1,1,1,3,3,0.5) \stopluacode \stoptext