#A model of a sail ship. #Written By Guy Engelhard (s2508059) DrawLadder=FUNCTION(HeadPoint, Base1, Base2, NumRungs,RungRadius) :Side1: MidCyl: Side2: NewCyl: RungList: CurRung: Side1=Cylin(HeadPoint,Base1-HeadPoint,RungRadius): Side2=Cylin(HeadPoint,Base2-HeadPoint,RungRadius): MidCyl=Cylin(HeadPoint,0.5*(Base2+Base1)-HeadPoint,RungRadius): RungList=list(Cylin(1/NumRungs*(Base1-HeadPoint)+HeadPoint, 1/NumRungs*(Base2-HeadPoint)- 1/NumRungs*(Base1-HeadPoint),RungRadius)): For(CurRung=2,1,NumRungs-1, RungList=RungList+list(Cylin(CurRung/NumRungs*(Base1-HeadPoint)+HeadPoint, CurRung/NumRungs*(Base2-HeadPoint)- CurRung/NumRungs*(Base1-HeadPoint),RungRadius))): return=list(Side1,Side2,MidCyl,RungList); SailMesh= list (list (ctlpt(E3, -0.85, -0.7, 0.0), ctlpt(E3, -0.85, -0.3, 0.0), ctlpt(E3, -0.85, 0.3, 0.0), ctlpt(E3, -0.85, 0.7, 0.0)), list (ctlpt(E3, -0.65, -0.9, 0.7), ctlpt(E3, -0.65, -0.45, 0.7), ctlpt(E3, -0.65, 0.45, 0.7), ctlpt(E3, -0.65, 0.9, 0.7)), list (ctlpt(E3, 0.35, -1.0, 1.0), ctlpt(E3, 0.35, -0.5, 1.0), ctlpt(E3, 0.35, 0.5, 1.0), ctlpt(E3, 0.35, 1.0, 1.0)), list (ctlpt(E3, 0.85, -1.0, 0.0), ctlpt(E3, 0.35, -0.5, 1.0), ctlpt(E3, 0.35, 0.5, 1.0), ctlpt(E3, 0.85, 1.0, 0.0))); SternSailMesh= list (list ( ctlpt(E3, -3, 0, 6), ctlpt(E3, -2.7, 0, 4), ctlpt(E3, -2.8, 0, 2), ctlpt(E3, -3.4, 0, 1)), list (ctlpt(E3, -2.3, 0, 6), ctlpt(E3, -2.45, 0, 4), ctlpt(E3, -2.6, 0, 2), ctlpt(E3, -2.7, 0, 2-3.0/3.8)), list (ctlpt(E3, -1.5, 0, 6), ctlpt(E3, -1.55, 0, 4), ctlpt(E3, -1.6, 0, 2), ctlpt(E3, -1.7, 0, 2-2.0/3.8)), list (ctlpt(E3, 0, 0, 6), ctlpt(E3, 0, 0, 4), ctlpt(E3, 0, 0, 3), ctlpt(E3, 0, 0, 2-0.3/3.8))); FlagMesh= list (list (ctlpt(E3, 0.1, 0, 9.9), ctlpt(E3, 0.5, 0.4, 9.8), ctlpt(E3, 1, -0.4, 9.7), ctlpt(E3, 1.2, 0.2, 9.6), ctlpt(E3, 1.4, -0.2, 9.5), ctlpt(E3, 1.6, 0, 9.5)), list (ctlpt(E3, 0.1, 0, 9.7), ctlpt(E3, 0.5, 0.4, 9.65), ctlpt(E3, 1, -0.4, 9.6), ctlpt(E3, 1.2, 0.2, 9.55), ctlpt(E3, 1.4, -0.2.45, 9.5), ctlpt(E3, 1.6, 0, 9.5)), list (ctlpt(E3, 0.1, 0, 9.5), ctlpt(E3, 0.55, 0.4, 9.5), ctlpt(E3, 1, -0.4, 9.5), ctlpt(E3, 1.2, 0.2, 9.5), ctlpt(E3, 1.4, -0.2, 9.5), ctlpt(E3, 1.6, 0, 9.5)), list (ctlpt(E3, 0.1, 0, 9.3), ctlpt(E3, 0.5, 0.4, 9.35), ctlpt(E3, 1, -0.4, 9.4), ctlpt(E3, 1.2, 0.2, 9.45), ctlpt(E3, 1.4, -0.2, 9.5), ctlpt(E3, 1.6, 0, 9.5)), list (ctlpt(E3, 0.1, 0, 9.1), ctlpt(E3, 0.5, 0.4, 9.2), ctlpt(E3, 1, -0.4, 9.3), ctlpt(E3, 1.2, 0.2, 9.4), ctlpt(E3, 1.4, -0.2, 9.5), ctlpt(E3, 1.6, 0, 9.5))); Sail=sbspline(4,4,SailMesh,list(list(KV_OPEN),list(KV_OPEN))); attrib(Sail,"rgb","40,150,20"); SternSail=sbspline(4,4,SternSailMesh,list(list(KV_OPEN),list(KV_OPEN)))*rotz(20); attrib(SternSail,"rgb","40,150,20"); Flag=sbspline(4,4,FlagMesh,list(list(KV_OPEN),list(KV_OPEN))); Flag=Flag*Rotz(220); attrib(Flag,"rgb","255,20,20"); SailMat1=scale(Vector(2.0/1.7,3.1/2.0,1.0))*rotz(90)*rotx(-90)*trans(Vector(0,0,8)); SailMat2=scale(Vector(2.0/1.7,3.3/2.0,1.0))*rotz(90)*rotx(-90)*trans(Vector(0,0,6)); SailMat3=scale(Vector(2.0/1.7,3.5/2.0,1.0))*rotz(90)*rotx(-90)*trans(Vector(0,0,4)); SailMat4=scale(Vector(2.5/1.7,3.7/2.0,1.0))*rotz(90)*rotx(-90)*trans(Vector(0,0,1.7)); Sail1=Sail*SailMat1; Sail2=Sail*SailMat2; Sail3=Sail*SailMat3; Sail4=Sail*SailMat4; Sails=list(Sail1,Sail2,Sail3,Sail4); VertPole=Cylin(Vector(0,0,0),Vector(0,0,10),0.1); attrib(VertPole,"rgb","150,80,0"); HorzPole1=Cylin(Vector(-1.5,0,9),Vector(3,0,0),0.05); attrib(HorzPole1,"rgb","150,80,0"); HorzPole2=Cylin(Vector(-1.6,0,7),Vector(3.2,0,0),0.05); attrib(HorzPole2,"rgb","150,80,0"); HorzPole3=Cylin(Vector(-1.7,0,5),Vector(3.4,0,0),0.05); attrib(HorzPole3,"rgb","150,80,0"); HorzPole4=Cylin(Vector(-1.8,0,3),Vector(3.6,0,0),0.05); attrib(HorzPole4,"rgb","150,80,0"); SternPole1=Cylin(Vector(0.3,0,6),Vector(-3.4,0,0),0.05)*rotz(20); attrib(SternPole1,"rgb","150,80,0"); SternPole2=Cylin(Vector(0.3,0,2),Vector(-3.8,0,-1),0.05)*rotz(20); attrib(SternPole2,"rgb","150,80,0"); SailPole=list(VertPole,HorzPole1,HorzPole2,HorzPole3,HorzPole4,Flag); WholeSail1=list(SailPole,Sails)*Scale(Vector(0.15,0.15,0.15))*Rotz(120); WholeSail2=list(SailPole,Sails,SternPole1,SternPole2,SternSail)*Scale(Vector(0.12,0.12,0.12))*Rotz(120)*Trans(Vector(0.4,0,0)); WholeSail3=list(SailPole,Sails)*Scale(Vector(0.12,0.12,0.12))*Rotz(120)*Trans(Vector(-0.5,0,0)); ShipBodyMesh= list (list (ctlpt(P3, 1, -3/4, 0, 0.1), ctlpt(P3, 1, -3/4, 0, 0.1), ctlpt(P3, 1, -3/4, 0, -0.1), ctlpt(P3, 1, -3/4, 0, -0.1), ctlpt(P3, 1, -3/4, 0, 0.1), ctlpt(P3, 1, -3/4, 0, 0.1)), list (ctlpt(P3, 1, -2.5/4, 0.2, 0.1), ctlpt(P3, 1, -2.5/4, 0.2, 0.1), ctlpt(P3, 1, -2.5/4, 0.2, -0.1), ctlpt(P3, 1, -2.5/4, -0.2, -0.1), ctlpt(P3, 1, -2.5/4, -0.2, 0.1), ctlpt(P3, 1, -2.5/4, -0.2, 0.1)), list (ctlpt(P3, 2, -4/4, 0.4, 0.2), ctlpt(P3, 2, -4/4, 0.4, 0.2), ctlpt(P3, 2, -4/4, 0.4, -0.2), ctlpt(P3, 2, -4/4, -0.4, -0.2), ctlpt(P3, 2, -4/4, -0.4, 0.2), ctlpt(P3, 2, -4/4, -0.4, 0.2)), list (ctlpt(P3, 1, -1/4, 0.2, 0.1), ctlpt(P3, 1, -1/4, 0.2, 0.1), ctlpt(P3, 1, -1/4, 0.2, -0.1), ctlpt(P3, 1, -1/4, -0.2, -0.1), ctlpt(P3, 1, -1/4, -0.2, 0.1), ctlpt(P3, 1, -1/4, -0.2, 0.1)), list (ctlpt(P3, 1, 0, 0.2, 0.1), ctlpt(P3, 1, 0, 0.2, 0.1), ctlpt(P3, 1, 0, 0.2, -0.1), ctlpt(P3, 1, 0, -0.2, -0.1), ctlpt(P3, 1, 0, -0.2, 0.1), ctlpt(P3, 1, 0, -0.2, 0.1)), list (ctlpt(P3, 1, 1/4, 0.2, 0.1), ctlpt(P3, 1, 1/4, 0.2, 0.1), ctlpt(P3, 1, 1/4, 0.2, -0.1), ctlpt(P3, 1, 1/4, -0.2, -0.1), ctlpt(P3, 1, 1/4, -0.2, 0.1), ctlpt(P3, 1, 1/4, -0.2, 0.1)), list (ctlpt(P3, 1, 1.5/4, 0.2, 0.1), ctlpt(P3, 1, 1.5/4, 0.2, 0.1), ctlpt(P3, 1, 1.5/4, 0.2, 0), ctlpt(P3, 1, 1.5/4, -0.2,0), ctlpt(P3, 1, 1.5/4, -0.2, 0.1), ctlpt(P3, 1, 1.5/4, -0.2, 0.1)), list (ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0), ctlpt(P3, 1, 2/4, -0.2,0), ctlpt(P3, 1, 2/4, -0.2, 0.1), ctlpt(P3, 1, 2/4, -0.2, 0.1))); ShipBowMesh= list (list (ctlpt(P3, 1, -3/4, 0.01, 0.09), ctlpt(P3, 1, -3/4, 0.01, 0.09), ctlpt(P3, 1, -3/4, 0.01, -0.1), ctlpt(P3, 1, -3/4, -0.01, -0.1), ctlpt(P3, 1, -3/4, -0.01, 0.09), ctlpt(P3, 1, -3/4, -0.01, 0.09)), list (ctlpt(P3, 1, -3.7/4, 0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0.01, 0), ctlpt(P3, 1, -3.7/4, -0.01, 0), ctlpt(P3, 1, -3.7/4, -0.01, 0.1), ctlpt(P3, 1, -3.7/4, -0.01, 0.1)), list (ctlpt(P3, 1, -3.7/4, 0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0.01, 0), ctlpt(P3, 1, -3.7/4, -0.01, 0), ctlpt(P3, 1, -3.7/4, -0.01, 0.1), ctlpt(P3, 1, -3.7/4, -0.01, 0.1)), list (ctlpt(P3, 1, -3.7/4, 0.01, 0.08), ctlpt(P3, 1, -3.7/4, 0.01, 0.08), ctlpt(P3, 1, -3.7/4, 0.01, 0.08), ctlpt(P3, 1, -3.7/4, -0.01, 0.08), ctlpt(P3, 1, -3.7/4, -0.01, 0.08), ctlpt(P3, 1, -3.7/4, -0.01, 0.08))); ShipSternBlockMesh= list (list ( ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0), ctlpt(P3, 1, 2/4, -0.2,0), ctlpt(P3, 1, 2/4, -0.2, 0.1), ctlpt(P3, 1, 2/4, -0.2, 0.1)), list( ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0.1), ctlpt(P3, 1, 2/4, 0.2, 0), ctlpt(P3, 1, 2/4, -0.2,0), ctlpt(P3, 1, 2/4, -0.2, 0.1), ctlpt(P3, 1, 2/4, -0.2, 0.1)), list( ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0,0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0)), list( ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0,0), ctlpt(P3, 1, 2/4+0.01, 0, 0), ctlpt(P3, 1, 2/4+0.01, 0, 0))); ShipBowSupportMesh1= list (list ( ctlpt(P3, 1, -2.2/4, -0.17, 0.03), ctlpt(P3, 1, -2.2/4, -0.16, 0.03), ctlpt(P3, 1, -2.2/4, -0.16, -0.03), ctlpt(P3, 1, -2.2/4, -0.17, -0.03)), list (ctlpt(P3, 1, -3/4, -0.04, 0.05), ctlpt(P3, 1, -3/4, -0.03, -0.05), ctlpt(P3, 1, -3/4, -0.03, -0.01), ctlpt(P3, 1, -3/4, -0.04, -0.01)), list (ctlpt(P3, 1, -3.3/4, -0.02, 0.08), ctlpt(P3, 1, -3.3/4, -0.01, 0.08), ctlpt(P3, 1, -3.3/4, -0.01, 0.02), ctlpt(P3, 1, -3.3/4, -0.02, 0.02)), list (ctlpt(P3, 1, -3.7/4, -0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0, 0.1), ctlpt(P3, 1, -3.7/4, 0, 0.04), ctlpt(P3, 1, -3.7/4, -0.01, 0.04))); ShipBowSupportMesh2= list (list ( ctlpt(P3, 1, -2.2/4, 0.17, 0.03), ctlpt(P3, 1, -2.2/4, 0.16, 0.03), ctlpt(P3, 1, -2.2/4, 0.16, -0.03), ctlpt(P3, 1, -2.2/4, 0.17, -0.03)), list (ctlpt(P3, 1, -3/4, 0.04, 0.05), ctlpt(P3, 1, -3/4, 0.03, -0.05), ctlpt(P3, 1, -3/4, 0.03, -0.01), ctlpt(P3, 1, -3/4, 0.04, -0.01)), list (ctlpt(P3, 1, -3.3/4, 0.02, 0.08), ctlpt(P3, 1, -3.3/4, 0.01, 0.08), ctlpt(P3, 1, -3.3/4, 0.01, 0.02), ctlpt(P3, 1, -3.3/4, 0.02, 0.02)), list (ctlpt(P3, 1, -3.7/4, 0.01, 0.1), ctlpt(P3, 1, -3.7/4, 0, 0.1), ctlpt(P3, 1, -3.7/4, 0, 0.04), ctlpt(P3, 1, -3.7/4, 0.01, 0.04))); ShipBody=sbspline(4,4,ShipBodyMesh,list(list(KV_PERIODIC),list(KV_OPEN))); attrib(ShipBody,"rgb","150,75,30"); ShipSternBlock=sbspline(4,4,ShipSternBlockMesh,list(list(KV_PERIODIC),list(KV_OPEN))); attrib(ShipSternBlock,"rgb","150,75,30"); ShipBow=sbspline(4,4,ShipBowMesh,list(list(KV_PERIODIC),list(KV_OPEN))); attrib(ShipBow,"rgb","250,250,250"); ShipBowSupport1=sbspline(4,4,ShipBowSupportMesh1,list(list(KV_PERIODIC),list(KV_OPEN))); attrib(ShipBowSupport1,"rgb","150,75,30"); ShipBowSupport2=sbspline(4,4,ShipBowSupportMesh2,list(list(KV_PERIODIC),list(KV_OPEN))); attrib(ShipBowSupport2,"rgb","150,75,30"); ShipRudder=box(Vector(2/4,0.02,0.09),-1,-0.04,-0.17); attrib(ShipRudder,"rgb","250,250,250"); BowPole=Cylin(Vector(-3.7/4, -0.01, 0.08),Vector(-0.15,0,0.1),0.01); attrib(BowPole,"rgb","150,80,0"); Ship=list(ShipBody,ShipRudder,ShipBow,ShipBowSupport1,ShipBowSupport2,BowPole,ShipSternBlock)*Scale(Vector(1,1,1.5))*Trans(Vector(0,0,-0.05)); ShipSails=list(WholeSail1,WholeSail2,WholeSail3); Ladder1=DrawLadder(Vector(-2,-0.5,6),Vector(-2.4,1.2,0.8),Vector(-2.8,1.2,0.8),10,0.05)*scale(vector(0.12,0.12,0.12))*trans(vector(0.7,0,0)); Ladder2=DrawLadder(Vector(-2,0,7),Vector(-1.2,1.1,0.8),Vector(-1.6,1.1,0.8),10,0.05)*scale(vector(0.12,0.12,0.12))*trans(vector(0.25,0,0)); Ladder3=DrawLadder(Vector(-2,0,7),Vector(-1.2,1.1,0.8),Vector(-1.6,1.1,0.8),10,0.05)*scale(vector(0.12,0.12,0.12))*trans(vector(-0.25,0,0)); Ladders=list(Ladder1,Ladder2,Ladder3); attrib(Ladders,"rgb","150,75,30"); Model=list(Ship,ShipSails,Ladders); viewclear(); viewobj(Model);