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

Mick Collins mickclns at mac.com
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 \
pointsOfNorman(theLeft,theTop,theWid,theHeight,angRot)

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
put round(theX),round(theY) into line lineNum of daPoints
end repeat

-- and go back to the starting point
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 vaudevillecourt.tv>
To: How to use Revolution <use-livecode at lists.runrev.com>
Subject: How to make a square topped, round rect bottomed graphic?
Message-ID:
<AANLkTikQT9evU=ZWwnWXAHB6WS+Kfu-vHAAg=501bdBK at mail.gmail.com>
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?

```