How to make a square topped, round rect bottomed graphic?

Mick Collins mickclns at
Thu Dec 2 16:13:44 EST 2010

I think I've seen all the previous replies.  If so, here's a different, more mathematical, approach that can be
combined with the gradient and other techniques mentioned before:

The main thing here is a function (pointsOfNorman, Norman because of the resemblance to a Norman window) that returns the points for a polygon graphic, given the starting point (X and Y), width, height, and ANGLE OF ROTATION and the first handler (doTest) is just there to test it with various parameters.  Is this overkill? too slow? or what?  I'd appreciate your comments.

on doTest
   -- before running this test, create a polygon graphic named "NW"
   put 250 into theLeft
   put 250 into theTop
   repeat with i = 1 to 37
      put 6*i - 5 into theWid
      put pi * (i-1)/18 into angRot
      repeat with j = 1 to 80
         put 2*j into theHeight
         -- this is how you use the function
         set the points of grc "NW" to \
         wait 0
      end repeat
   end repeat
end doTest

function pointsOfNorman L,T,wid,hite,rotAng
   --creates the points for a NormanWindow graphic (polygon)
   --"left", "top" (actually starting point), width, height, angle Of rotation 
   --                     (measured clockwise from rightward)
   --                     use 0*pi for semicircle down
   --                     use 0.5*pi for semicircle left
   --                     use 1*pi for semicircle up
   --                     use 1.5*pi for semicircle right
   --                     use 2*pi for semicircle down
   --                     (interpolate for a rotation other than these)
   -- first 3 points of rectangle
   put L,T into daPoints
   put round(L+wid*cos(rotAng)),round(T+wid*sin(rotAng)) into line 2 of daPoints
   put round(L+wid*cos(rotAng)-hite*sin(rotAng)),round(T+wid*sin(rotAng)+hite*cos(rotAng)) into line 3 of daPoints
   -- center of semiCircle
   put round(L+.5*wid*cos(rotAng)-hite*sin(rotAng)) into xCen
   put round(T+.5*wid*sin(rotAng)+hite*cos(rotAng)) into yCen
   put max(8, wid div 3) into numOfAngs -- number of straight lines to make semiCircle
   put wid / 2 into theRadius
   put 3 into lineNum 
   put pi / numOfAngs into deltaAng
   repeat with i = 1 to numOfAngs
      -- calculates the coordinates for the i-th point of the semicircle
      put deltaAng * i into theAng 
      add rotAng to theAng
      put xCen +theRadius*cos(theAng) into theX
      put yCen +theRadius*sin(theAng) into theY
      add 1 to lineNum
      put round(theX),round(theY) into line lineNum of daPoints
   end repeat
   -- and go back to the starting point
   add 1 to lineNum
   put L,T into line lineNum of daPoints
   return daPoints
end pointsOfNorman

Message: 4
Date: Wed, 1 Dec 2010 15:01:05 +0000
From: David Bovill <david at>
To: How to use Revolution <use-livecode at>
Subject: How to make a square topped, round rect bottomed graphic?
<AANLkTikQT9evU=ZWwnWXAHB6WS+Kfu-vHAAg=501bdBK at>
Content-Type: text/plain; charset=ISO-8859-1

What is the most efficient way to make this? I thought I could have a
polygon graphic which was opaque but not joined up and use that to add
square corners to a roundrect graphic background - but it seems that every
time I make it opaque it automatically joins the graphic points.

What I want to be able to do is have a vector graphic which has the option
to have rounded corners on either or both the top and bottom, whcih I can
script. The most efficient way I can thin of doing it at the moment is to
have a background roundrect graphic, on top of which I can place a polygon
line to create square corners, and a white opaque graphic just inside the
square boundary to cover up the round corners?

Is there a better way?

More information about the Use-livecode mailing list