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
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist : [email protected] / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
archive : https://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________