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 : ntg-context@ntg.nl / 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
___________________________________________________________________________________

Reply via email to