# A nice hexagonal table # Uriel Cohen & Yaniv Frishman # Januar 1997 # Top of the table HEXAGON = list(vector(10, 0, 0), vector(5, 8.66025, 0), vector(-5, 8.66025, 0), vector(-10, 0, 0), vector(-5, -8.66025, 0), vector(5, -8.66025, 0)); SECOND_MAT = scale(vector(0.96, 0.96, 1)) * trans(vector(0, 0, -0.2)); THIRD_MAT = scale(vector(0.7, 0.7, 1)); FTOP1 = poly(HEXAGON + list(vector(10, 0, 0)), TRUE); FTOP2 = FTOP1 * trans(vector(0, 0, 0.2)); STOP1 = FTOP1 * SECOND_MAT; STOP2 = FTOP2 * SECOND_MAT; TTOP1 = FTOP1 * THIRD_MAT * trans(vector(0, 0, -0.2)); TTOP2 = TTOP1 * trans(vector(0, 0, -0.5)); FTOP_BORDER = ruledsrf(FTOP1, FTOP2); STOP_BORDER = ruledsrf(STOP1, STOP2); TTOP_BORDER = ruledsrf(TTOP1, TTOP2); FTOP1 = poly(HEXAGON, FALSE); FTOP2 = FTOP1 * trans(vector(0, 0, 0.2)); STOP1 = FTOP1 * SECOND_MAT; STOP2 = FTOP2 * SECOND_MAT; TTOP1 = FTOP1 * THIRD_MAT * trans(vector(0, 0, -0.2)); TTOP2 = TTOP1 * trans(vector(0, 0, -0.5)); FIRST_TOP = list(FTOP_BORDER, FTOP1, FTOP2); SECOND_TOP = list(STOP_BORDER, STOP1, STOP2); THIRD_TOP = list(TTOP_BORDER, TTOP1, TTOP2); TOP = list(FIRST_TOP, SECOND_TOP, THIRD_TOP); attrib(TOP, "rgb", "128, 64, 0"); # One of the arched legs REFMAT = homomat( list( list( -1, 0, 0, 0 ), list( 0, -1, 0, 0 ), list( 0, 0, 1, 0 ), list( 0, 0, 0, 1 ) ) ); WIDTH = 0.15; ANGLE1 = PI / 4 - PI * 4 / 90; CURVE_OUT_TOP = arc(vector(cos(ANGLE1), sin(ANGLE1), 0), vector(0, 0, 0), vector(-cos(ANGLE1), sin(ANGLE1), 0)); ANGLE2 = PI * 50 / 180; CURVE_IN_TOP = arc(vector(cos(ANGLE2), sin(ANGLE2), 0), vector(0, 0, 0), vector(-cos(ANGLE2), sin(ANGLE2), 0)); CURVE_IN_TOP = CURVE_IN_TOP * scale(vector(0.8, 0.8, 1)); CURVE_IN_BOT = CURVE_OUT_TOP * REFMAT * trans(vector(-cos(ANGLE1), sin(ANGLE1), 0) + 0.8 * vector(-cos(ANGLE2), sin(ANGLE2), 0)); CURVE_OUT_BOT = CURVE_IN_TOP * REFMAT * trans(0.8 * vector(-cos(ANGLE2), sin(ANGLE2), 0) + vector(-cos(ANGLE1), sin(ANGLE1), 0)); CURVE_OUT = CURVE_OUT_TOP + (-CURVE_OUT_BOT); CURVE_IN = CURVE_IN_TOP + (-CURVE_IN_BOT); CURVE_SRF1 = ruledsrf(CURVE_OUT, CURVE_IN); TRANSMAT = trans(vector(0, 0, WIDTH)); CURVE_SRF2 = CURVE_SRF1 * TRANSMAT; CURVE_SIDE_IN = ruledsrf(CURVE_IN, CURVE_IN * TRANSMAT); CURVE_SIDE_OUT = ruledsrf(CURVE_OUT, CURVE_OUT * TRANSMAT); TOP_CIRCLE1 = cylin(vector(cos(ANGLE1)-0.18, sin(ANGLE1)-0.09, 0), vector(0, 0, WIDTH), 0.2); TOP_CIRCLE2 = cylin(vector(cos(ANGLE1)-0.18, sin(ANGLE1)-0.09, 0), vector(0, 0, WIDTH+0.04), 0.15) * trans(vector(0, 0, -0.02)); TOP_CIRCLE3 = cylin(vector(cos(ANGLE1)-0.18, sin(ANGLE1)-0.09, 0), vector(0, 0, WIDTH+0.08), 0.12) * trans(vector(0, 0, -0.04)); BOT_CIRCLE1 = cylin(vector(-2*cos(ANGLE1)-0.8*cos(ANGLE2)+0.18, 0.8*sin(ANGLE2)+0.09, 0), vector(0, 0, WIDTH), 0.2); BOT_CIRCLE2 = cylin(vector(-2*cos(ANGLE1)-0.8*cos(ANGLE2)+0.18, 0.8*sin(ANGLE2)+0.09, 0), vector(0, 0, WIDTH+0.04), 0.15) * trans(vector(0, 0, -0.02)); BOT_CIRCLE3 = cylin(vector(-2*cos(ANGLE1)-0.8*cos(ANGLE2)+0.18, 0.8*sin(ANGLE2)+0.09, 0), vector(0, 0, WIDTH+0.08), 0.12) * trans(vector(0, 0, -0.04)); attrib(CURVE_SRF1, "rgb", "128, 64, 0"); attrib(CURVE_SRF2, "rgb", "128, 64, 0"); attrib(CURVE_SIDE_IN, "rgb", "128, 64, 0"); attrib(CURVE_SIDE_OUT, "rgb", "128, 64, 0"); attrib(TOP_CIRCLE1, "rgb", "128, 64, 0"); attrib(BOT_CIRCLE1, "rgb", "128, 64, 0"); attrib(TOP_CIRCLE2, "rgb", "128, 30, 0"); attrib(BOT_CIRCLE2, "rgb", "128, 30, 0"); attrib(TOP_CIRCLE3, "rgb", "128, 30, 0"); attrib(BOT_CIRCLE3, "rgb", "128, 30, 0"); TOP_CIRCLE = list(TOP_CIRCLE1, TOP_CIRCLE2, TOP_CIRCLE3); BOT_CIRCLE = list(BOT_CIRCLE1, BOT_CIRCLE2, BOT_CIRCLE3); LEG = list(CURVE_SRF1, CURVE_SRF2, CURVE_SIDE_IN, CURVE_SIDE_OUT, TOP_CIRCLE, BOT_CIRCLE); LEG = LEG * scale(vector(4, 5, 5)) * rotz(85) * rotx(90); LEG = LEG * trans(vector(-3.7, 0.4, -4.18)); # The six legs LEGS = nil(); for (i=0, 60, 300, snoc(LEG * rotz(i), LEGS) ); # The base of the table: feet holder CURVED_EDGE1 = cbezier(list(ctlpt(E2, 5, 8.66025), ctlpt(E2, 0, 6.5), ctlpt(E2, -5, 8.66025))); CURVED_EDGE2 = CURVED_EDGE1 * rotz(60); CURVED_EDGE3 = CURVED_EDGE2 * rotz(60); CURVED_EDGE4 = CURVED_EDGE3 * rotz(60); CURVED_EDGE5 = CURVED_EDGE4 * rotz(60); CURVED_EDGE6 = CURVED_EDGE5 * rotz(60); CURVED_HEX_OUT = CURVED_EDGE1 + CURVED_EDGE2 + CURVED_EDGE3 + CURVED_EDGE4 + CURVED_EDGE5 + CURVED_EDGE6; CURVED_HEX_IN = CURVED_HEX_OUT * scale(vector(0.8, 0.8, 0.8)); CURVED_HEX_TOP = ruledsrf(CURVED_HEX_OUT, CURVED_HEX_IN); TRANSMAT = trans(vector(0, 0, -0.3)); CURVED_HEX_OUT2 = CURVED_HEX_OUT * TRANSMAT; CURVED_HEX_IN2 = CURVED_HEX_IN * TRANSMAT; CURVED_HEX_BOT = CURVED_HEX_TOP * TRANSMAT; CURVED_HEX_BOR_IN = ruledsrf(CURVED_HEX_IN, CURVED_HEX_IN2); CURVED_HEX_BOR_OUT = ruledsrf(CURVED_HEX_OUT, CURVED_HEX_OUT2); CURVED_HEX = list(CURVED_HEX_TOP, CURVED_HEX_BOT, CURVED_HEX_BOR_IN, CURVED_HEX_BOR_OUT); # A spherical foot ANGLE1 = PI * 7 / 18; ANGLE2 = PI / 4; FOOT_ARC = arc(vector(-cos(ANGLE1), 0, sin(ANGLE1)), vector(0, 0, 0), vector(-cos(ANGLE2), 0, -sin(ANGLE2))); FOOT_PROF = ctlpt(E3, -cos(ANGLE1), 0, sin(ANGLE1)+0.65) + FOOT_ARC + ctlpt(E3, 0, 0, -sin(ANGLE2)); FOOT = surfrev(FOOT_PROF); # Putting the foot into place FOOT = FOOT * trans(vector(9*0.5, 9*0.866025, -sin(ANGLE1)-0.65-0.3)); # Copying to obtain 6 feet FEET = nil(); for (i=0, 60, 300, snoc(FOOT * rotz(i), FEET) ); BASE = list(CURVED_HEX, FEET); BASE = BASE * scale(vector(0.9, 0.9, 1)) * trans(vector(0, 0, -12.36)); attrib(BASE, "rgb", "128, 64, 0"); TABLE = list(TOP, LEGS, BASE); interact(TABLE);