> I can email an image to anyone that wants it, or you can draw it like
> this...
>
> I think this is what you want...
> Draw a point and a line vertically upwards of length R.
> Draw a large letter V (inverted cone) upwards from the point.
> Draw an arc, radius R to cut the V.
> Where the arc cuts the vertical draw a circle, radius r, to meet the edges
> of V.
> The edges of V are tangents.
> Draw radii to these tangents, making 90 degree angles with them.
> Mark r and R on the diagram.
> Now r/R = sin(A), where A is half the angle at the bottom of the V.
>
> Let's say there are n of these small circles, so that
> n*2*A = 360   (degrees)
> or
> n*2*A = 2*pi   (radians)
>
> You can decide n and find A and then find r/R (the angles are usually in
> radians).
> You can then decide R and find r (or other way around).
>
> Each time through the loop for <=n the new angle measured from
> the vertical
> in a clockwise direction is n*2*A.
> The place to draw each circle is x=Rsin(n*2*A) and y=Rcos(n*2*A)

I enjoyed this one, so I came back to it and wrote a complete solution. Put
a symbol in the library with id 'circle', then run this script:

function getRingRadius(tArray:Array):Number {
        var tMaxError = 0.1
        var tMax = 1024
        var tMin = 0
        do {
                var tCheck = (tMax + tMin) / 2
                var tSum = 0
                for (var i = 0; i<tArray.length; i++) {
                        tSum += Math.atan2(tArray[i],tCheck)
                }
                if (tSum>Math.PI) {
                        tMin = tCheck
                } else {
                        tMax = tCheck
                }
        } while (Math.abs(tSum - Math.PI)>tMaxError)
        return tCheck
}
var tRadii = new Array()
for (var i=0; i<10 ; i++) {
        tRadii.push(Math.random()*20+1)
}
var tRingRadius = getRingRadius(tRadii)
var tSquaredRadius = tRingRadius * tRingRadius
var tAngle = 0
for (var i=0; i<10 ; i++) {
        tCircle = this.attachMovie("circle", "circle"+i,
this.getNextHighestDepth())
        tCircle._width = tCircle._height = tRadii[i]*2
        tThisAngle = Math.atan2(tRadii[i], tRingRadius)
        tAngle += tThisAngle
        tDistance = Math.sqrt(tRadii[i]*tRadii[i] + tSquaredRadius)
        tCircle._x = 200 + tDistance * Math.cos(tAngle)
        tCircle._y = 200 + tDistance * Math.sin(tAngle)
        tAngle += tThisAngle
}

NB: my previous script had my max and min mixed up so it didn't work. This
one is correct.

Danny

_______________________________________________
Flashcoders@chattyfig.figleaf.com
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com

Reply via email to