%====================================================================== % This is % bishop.mf % % Copyright (C) 1989-93 by Elmar Bartel. % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 1, or (at your option) % any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. %====================================================================== % def slope(expr orig,middle,far,wd,angle) = begingroup save x, y, p; path p.l,p.r; pair inter; z0r= orig; z1r= middle; z2= far; penpos0(wd,90+angle); penpos1(wd,90); penpos2(wd,90+angle); forsuffixes e=l,r: p.e:= z2e{dir angle}.. z1e{right} .. {dir angle}z0e; endfor; inter = p.l intersectiontimes p.l reflectedabout (orig,orig+up); reverse p.r -- subpath (0,xpart inter) of p.l .. reverse subpath (0,xpart inter) of p.l reflectedabout (orig,orig+up) -- p.r reflectedabout (orig,orig+up) endgroup enddef; def MakeBishopPath = numeric TopDiameter; TopDiameter = .08qs; DefineFootBows( .13qs, % Distance to BottomSpace .39qs, % BowOneWidth .17qs, % FootHeight .31, % BowTwoLoc .12, % WidthToHeight .87, % BowTwoLen .65); % BowThreeLen x4l + x4r = qs; x4r - x4l = .45qs; x4 = x3; y4l = y4r = y4 = y3 + .16qs; % Sides of the shape with % vertical tangents x5 = x4; top (y5 + TopDiameter) = qs - TopSpace + .04qs; pair TopDir.l, TopDir.r; TopDir.l = dir 35; TopDir.r = (xpart TopDir.l, -ypart TopDir.l); numeric TopDiameter; TopDiameter = .10qs; path LeftShape,RightShape,BishopPath; LeftShape = z1l .. z2l .. z3l & z3l .. {up}z4l .. {TopDir.l}z5; RightShape= z5{TopDir.r} .. {down}z4r .. z3r & z3r .. z2r .. z1r; BishopPath = LeftShape & RightShape & Bow0 & cycle; path Peak; Peak:= fullcircle scaled TopDiameter shifted (z5+.5TopDiameter*up); path CrossV,CrossH; z7= .25[z3,z5]; z8= .62[z3,z5]; CrossV:= z7 .. z8; CrossH= CrossV rotatedaround (.5[z7,z8],90); path Slope; path s; numeric angle; angle= 60; x12 = SideSpace; y12 = BottomSpace; y11 = .5[y12,y10]; x11 = .65[x12,x10]; z10 = z0; s= slope(z10,z11,z12,2.7thin,35); Slope:= s .. point 0 of s & cycle; enddef; def MakeWhiteBishop = pickup chess_pen; clearit; draw BishopPath; forsuffixes $=2,3: draw Bow$; endfor draw Peak; draw CrossV; draw CrossH; %pickup inner_pen; draw Slope; WhiteMan:= currentpicture; enddef; def MakeBlackBishop = pickup chess_pen scaled 1.1; clearit; filldraw BishopPath; forsuffixes $=2,3: undraw ShortenPath(Bow$,1.2thin); endfor %undraw ShortenPath(ParallelPath(LeftShape,-thin),thin); %undraw ShortenPath(ParallelPath(RightShape,-thin),thin); filldraw Peak; undraw CrossV; undraw CrossH; pickup inner_pen; filldraw Slope; BlackMan:= currentpicture; enddef; def MakeOuterShape = clearit; pickup frame_pen; filldraw BishopPath; filldraw Peak; filldraw Slope; cullit; OuterShape:= currentpicture; enddef; MakeBishopPath; MakeWhiteBishop; MakeBlackBishop; MakeNeutral(WhiteMan,BlackMan); MakeOuterShape; %=========================================================== %% this one for testing %beginchar(Bishop+White+OnBlack, qs#, qs#, 0); % "White bishop on black field"; % MakeBlackField; % currentpicture:= currentpicture - OuterShape; % cullit; % currentpicture:= currentpicture + WhiteMan; % %currentpicture:= currentpicture + BlackMan; %endchar; %endinput %=========================================================== beginchar(Bishop+White+OnWhite, qs#, qs#, 0); "White bishop on white field"; currentpicture:= WhiteMan; endchar; beginchar(Bishop+White+OnWhite+LeftTurned, qs#, qs#, 0); "White bishop on white field rotated to the left"; currentpicture:= TurnLeft(WhiteMan); endchar; beginchar(Bishop+White+OnWhite+RightTurned, qs#, qs#, 0); "White bishop on white field rotated to the right"; currentpicture:= TurnRight(WhiteMan); endchar; beginchar(Bishop+White+OnWhite+UpSideDown, qs#, qs#, 0); "White bishop on white field upside down"; currentpicture:= TurnUpSideDown(WhiteMan); endchar; beginchar(Bishop+Black+OnWhite, qs#, qs#, 0); "Black bishop on white field"; currentpicture:= BlackMan; endchar; beginchar(Bishop+Black+OnWhite+LeftTurned, qs#, qs#, 0); "Black bishop on white field rotated to the left"; currentpicture:= TurnLeft(BlackMan); endchar; beginchar(Bishop+Black+OnWhite+RightTurned, qs#, qs#, 0); "Black bishop on white field rotated to the right"; currentpicture:= TurnRight(BlackMan); endchar; beginchar(Bishop+Black+OnWhite+UpSideDown, qs#, qs#, 0); "Black bishop on white field upside down"; currentpicture:= TurnUpSideDown(BlackMan); endchar; beginchar(Bishop+Neutral+OnWhite, qs#, qs#, 0); "Neutral bishop on white field"; currentpicture:= NeutralMan; endchar; beginchar(Bishop+Neutral+OnWhite+LeftTurned, qs#, qs#, 0); "Neutral bishop on white field rotated to the left"; currentpicture:= TurnLeft(NeutralMan); endchar; beginchar(Bishop+Neutral+OnWhite+RightTurned, qs#, qs#, 0); "Neutral bishop on white field rotated to the right"; currentpicture:= TurnRight(NeutralMan); endchar; beginchar(Bishop+Neutral+OnWhite+UpSideDown, qs#, qs#, 0); "Neutral bishop on white field upside down"; currentpicture:= TurnUpSideDown(NeutralMan); endchar; beginchar(Bishop+White+OnBlack, qs#, qs#, 0); "White bishop on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + WhiteMan; endchar; beginchar(Bishop+White+OnBlack+LeftTurned, qs#, qs#, 0); "White bishop on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(WhiteMan); endchar; beginchar(Bishop+White+OnBlack+RightTurned, qs#, qs#, 0); "White bishop on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(WhiteMan); endchar; beginchar(Bishop+White+OnBlack+UpSideDown, qs#, qs#, 0); "White bishop on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(WhiteMan); endchar; beginchar(Bishop+Neutral+OnBlack, qs#, qs#, 0); "Neutral bishop on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + NeutralMan; endchar; beginchar(Bishop+Neutral+OnBlack+LeftTurned, qs#, qs#, 0); "Neutral bishop on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(NeutralMan); endchar; beginchar(Bishop+Neutral+OnBlack+RightTurned, qs#, qs#, 0); "Neutral bishop on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(NeutralMan); endchar; beginchar(Bishop+Neutral+OnBlack+UpSideDown, qs#, qs#, 0); "Neutral bishop on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(NeutralMan); endchar; beginchar(Bishop+Black+OnBlack, qs#, qs#, 0); "Black bishop on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + BlackMan; endchar; beginchar(Bishop+Black+OnBlack+LeftTurned, qs#, qs#, 0); "Black bishop on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(BlackMan); endchar; beginchar(Bishop+Black+OnBlack+RightTurned, qs#, qs#, 0); "Black bishop on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(BlackMan); endchar; beginchar(Bishop+Black+OnBlack+UpSideDown, qs#, qs#, 0); "Black bishop on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(BlackMan); endchar; endinput