Procedure CurvedWall; CONST kDebugMode=TRUE; VAR startVector,termVector,chordVector,dirVector:VECTOR; P1X,P1Y,P2X,P2Y,P3X,P3Y:REAL; Radius,ChordLen,numSegs,startAngle,sweepAngle,dirAngle,temp:REAL; dL,i,W1X,W1Y,W2X,W2Y,adjust,base,depth,sA:REAL; Abort:BOOLEAN; q:STRING; Procedure DebugIt(debugEnable:BOOLEAN); BEGIN IF debugEnable THEN Message('SA=',startAngle:5:5,' Dir=',dirAngle:5:5,' Swp=',sweepAngle:5:5,' seg=',sA:5:5); END; Procedure MagicAdjustoCap(segSweep,wallWidth:REAL;VAR adjustValue:REAL); VAR t,v,w:REAL; BEGIN t:=wallWidth; v:=sin(Deg2Rad(segSweep/4)); w:=cos(Deg2Rad(segSweep/4)); adjustValue:=t*(v/w); END; Function AngleMunger(Input:REAL):REAL; VAR Output:REAL; BEGIN IF Input < 0 THEN BEGIN Output:=180+(180-Abs(Input)); END ELSE BEGIN Output:=Input; END; AngleMunger:=Output; END; Procedure CalcWallPoints(StartAngle,Sweep,R,CenX,CenY:REAL;VAR StartX,StartY:REAL); BEGIN StartX:=CenX+(R*(cos(Deg2Rad(StartAngle)))); StartY:=CenY+(R*(sin(Deg2Rad(StartAngle)))); END; {// Begin main routine } BEGIN i:=1; numSegs:=20; GetPt(P1X,P1Y); GetPtL(P1X,P1Y,P2X,P2Y); GetPtL(P1X,P1Y,P3X,P3Y); startVector[1]:=P2X-P1X; startVector[2]:=P2Y-P1Y; startVector[3]:=0; termVector[1]:=P3X-P1X; termVector[2]:=P3Y-P1Y; termVector[3]:=0; chordVector[1]:=P3X-P2X; chordVector[2]:=P3Y-P2Y; chordVector[3]:=0; dirVector:=Perp(startVector); dirVector[1]:= -dirVector[1]; dirVector[2]:= -dirVector[2]; Radius:=Norm(startVector); ChordLen:=(Norm(chordVector))/numSegs; dL:=Norm(dirVector); startAngle:=AngleMunger(Vec2Ang(startVector)); dirAngle:=AngleMunger(Vec2Ang(termVector)); IF ((dirAngle = 0) AND (startAngle > 180)) THEN dirAngle:=360; sA:=AngBVec(startVector,termVector); sweepAngle:=dirAngle - startAngle; IF sweepAngle = 0 THEN sweepAngle:=360; DebugIt(kDebugMode); sweepAngle:=sweepAngle/numSegs; MagicAdjustoCap(sweepAngle,GetWallWidth,adjust); CalcWallPoints(startAngle,sweepAngle,Radius,P1X,P1Y,W1X,W1Y); startAngle:=startAngle+sweepAngle; CalcWallPoints(startAngle,sweepAngle,Radius,P1X,P1Y,W2X,W2Y); MoveTo(W1X,W1Y); WallTo(W2X,W2Y); WallCap(TRUE,FALSE,FALSE,-adjust,adjust); WallCap(FALSE,FALSE,FALSE,adjust,-adjust); WHILE i <=numSegs DO BEGIN CalcWallPoints(startAngle,sweepAngle,Radius,P1X,P1Y,W2X,W2Y); WallTo(W2X,W2Y); WallCap(TRUE,FALSE,FALSE,-adjust,adjust);{// 0.7956} WallCap(FALSE,FALSE,FALSE,adjust,-adjust); startAngle:=startAngle+sweepAngle; i:=i+1; END; END; Run(CurvedWall); { Craig Hollinshead ------------------------------------------------ cholli@earthlink.net | chollinshead@excalib.com ================================================ }