>************************************************************ >* >* Get x,y co-ords of shape fitting 2 concentric arcs >* between two angles. >* >* Assume :- >* Centre of circle is at 0,0 >* Arc is drawn clockwise from Angle1 to Angle2 >* Angles are measured anticlockwise from +ve x axis >* The arcs are substituted by lnNumSteps straight lines >* >************************************************************ > >* Test the function >=GetCoords(60, 0, 50, 100, 100) >=GetCoords(135, 30, 50, 100, 100) >=GetCoords(300, 30, 50, 100, 100) >=GetCoords(420, 300, 50, 100, 100) > >FUNCTION GetCoords >LPARAMETERS lnDegAngle1, lnDegAngle2, lnRadius1, lnRadius2, lnNumSteps > > * Improve the accuracy > lnOldDecimals = SET('Decimals') > SET DECIMALS TO 10 > > * Store for coordinates, x in [?,1], y in [?,2] > DIMENSION laCoords(4 + 2*lnNumSteps, 2) > > * Conversion factor from degrees to radians > lnDeg2Rad = 2 * 3.14159265358979 / 360 > lnRadAngle1 = lnDegAngle1 * lnDeg2Rad > lnRadAngle2 = lnDegAngle2 * lnDeg2Rad > > * Arc endpoint values placed in sequence in array > laCoords[1,1] = lnRadius1*COS(lnRadAngle1) > laCoords[1,2] = lnRadius1*SIN(lnRadAngle1) > laCoords[2,1] = lnRadius2*COS(lnRadAngle1) > laCoords[2,2] = lnRadius2*SIN(lnRadAngle1) > laCoords[lnNumSteps + 2 + 1,1] = lnRadius2*COS(lnRadAngle2) > laCoords[lnNumSteps + 2 + 1,2] = lnRadius2*SIN(lnRadAngle2) > laCoords[lnNumSteps + 2 + 2,1] = lnRadius1*COS(lnRadAngle2) > laCoords[lnNumSteps + 2 + 2,2] = lnRadius1*SIN(lnRadAngle2) > > * Calc angle increments for lnNumSteps > lnAngleInc = (lnRadAngle1 - lnRadAngle2)/lnNumSteps > > * Coordinates for the arcs > FOR t = 1 TO lnNumSteps > * Coordinates for the first arc, going clockwise > laCoords[t+2, 1] = lnRadius2*COS(lnRadAngle1 - t*lnAngleInc) > laCoords[t+2, 2] = lnRadius2*SIN(lnRadAngle1 - t*lnAngleInc) > * Coordinates for the second arc, going anticlock > laCoords[5 + 2*lnNumSteps - t, 1] = lnRadius1*COS(lnRadAngle1 - t*lnAngleInc) > laCoords[5 + 2*lnNumSteps - t, 2] = lnRadius1*SIN(lnRadAngle1 - t*lnAngleInc) > ENDFOR > > * Set up to draw > CLEAR > lnRadius = MAX(lnRadius1, lnRadius2) > lnExtra = 20 > lnOffSetX = lnRadius + lnExtra + 30 > lnOffSetY = lnOffSetX > > * Draw axes > _SCREEN.Line(lnOffSetX - lnRadius - lnExtra,; > lnOffSetY ,; > lnOffSetX + lnRadius + lnExtra,; > lnOffSetY) > _SCREEN.Line(lnOffSetX ,; > lnOffSetY - lnRadius - lnExtra,; > lnOffSetX ,; > lnOffSetY + lnRadius + lnExtra) > > * Draw polygon > lnNumLines = ALEN(laCoords, 1) - 1 > FOR t = 1 TO lnNumLines > _SCREEN.Line(laCoords[t, 1] + lnOffSetX, lnOffSetY - laCoords[t, 2] ,; > laCoords[t+1, 1] + lnOffSetX, lnOffSetY - laCoords[t+1, 2]) > ENDFOR > > * Restore old SETs > SET DECIMALS TO (lnOldDecimals) > > WAIT WINDOW > >ENDFUNC >