# Warning! # # The code is _ugly_. I mean it. Don't read if not pressed to. resolution = 15; neck = 0.2; rneck = 0.18; neck2 = 0.35; bbrk = 0.6; bprebrk = 0.05; preneck = 0.15; pprebrk = 0.07; pbrk = 0.4; helrad = 0.02; bbase = 0.07 : bbase2 = 0.05 : bnarrow = 0.025 : bheight = 0.5 : bnheight = 0.4 : bupper = 0.04 : p_ent = FUNCTION() : t : curve = NIL() : FOR (t = 0, pprebrk / 24 , pprebrk / 2, curve = curve + LIST(CTLPT(E3, sqrt(sqrt(t)) * rneck / sqrt(sqrt(pprebrk / 2)) / 2.5, 0, t))) : FOR (t = 2 * pprebrk / 3, pprebrk / 9, pprebrk, curve = curve + LIST(CTLPT(E3, sqrt(sqrt(t)) * rneck / sqrt(sqrt(pprebrk)), 0, t))) : return = CBSPLINE(2, curve, LIST(KV_OPEN)) ; p_neck = FUNCTION() : t : curve = NIL() : FOR (t = pprebrk, (pbrk - pprebrk) / 4, pbrk, curve = curve + LIST(CTLPT(E3, rneck, 0, t))) : return = CBSPLINE(2, curve, LIST(KV_OPEN)) ; p_top = FUNCTION(upto) : t : curve = NIL() : FOR (t = pbrk, (upto - pbrk) / 2, upto, curve = curve + LIST(CTLPT(E3, rneck + (t - pbrk) * (neck2 - rneck) * 7, 0, t))) : return = CBSPLINE(2, curve, LIST(KV_OPEN)) ; b_ent = FUNCTION() : t : cr : cr = NIL() : FOR (t = 0, bprebrk / 2.5, bprebrk, cr = cr + LIST(CTLPT(E3, preneck + t * (neck - preneck) / bprebrk, 0, t))) : return = cr ; b_neck = FUNCTION() : t : cr : cr = NIL() : FOR (t = bprebrk, (bbrk - bprebrk) / 2.5, bbrk, cr = cr + LIST(CTLPT(E3, neck + (t - bprebrk) * (neck2 - neck) / (bbrk - bprebrk), 0, t))) : return = cr ; b_sph = FUNCTION(upto) : t : x : z : cr : cr = NIL() : FOR (t = bbrk, (upto - bbrk) / 8, upto, z = upto - (sqr(upto - t)) / (upto - bbrk) : x = 0.25 - sqr((upto - 0.5) - z) : if (x < 0, x = 0, x = sqrt(x)) : cr = cr + LIST(CTLPT(E3, x, 0, z))) : return = cr ; bubble_curve = FUNCTION(upto) : b_list = b_ent() + b_neck() + b_sph(upto) : return = CBSPLINE(3, b_list, LIST(KV_OPEN)) ; plug_curve = FUNCTION(upto) : step : curve : t : return = p_ent() + p_neck() + p_top(upto) ; bubble = FUNCTION() : bb : bb = SURFPREV(bubble_curve(1.35)) : COLOR(bb, WHITE) : ATTRIB(bb, "transp", 0.95) : return = bb ; bottle_bottom = FUNCTION(width, width2, upto) : cr : t : cr = NIL() : FOR (t = 0, upto / 6, upto * 5 / 6, cr = cr + LIST(CTLPT(E3, width + (width2 - width) * t / upto, 0, t))) : return = cr ; bottle_narrow = FUNCTION(from, width, upto) : cr : t : cr = NIL() : FOR (t = from, (upto - from) / 6, from + (upto - from) * 5 / 6, cr = cr + LIST(CTLPT(E3, width, 0, t))) : return = cr ; bottle_upper = FUNCTION(from, width) : cr : t : height : height = 0.05 : cr = NIL() : FOR (t = from, height / 4, from + height, cr = cr + LIST(CTLPT(E3, width, 0, t))) : return = cr ; bottle_curve = FUNCTION() : cr : cr = bottle_bottom(bbase, bbase2, bnheight) + bottle_narrow(bnheight, bnarrow, bheight) + bottle_upper(bheight, bupper) : return = CBSPLINE(3, cr, LIST(KV_OPEN)) ; mustasche = FUNCTION() : m1 : m2 : m3 : m4 : m5 : circ1 : circ2 : circ1 = CIRCLE(VECTOR(0, 0, 0), 0.005) : circ2 = CIRCLE(VECTOR(0, 0, 0), 0.003) : m1 = LIST(SWEEPSRF(circ1, CBSPLINE(2, LIST(CTLPT(E3, -bbase2, 0, bnheight * 5 / 6), CTLPT(E3, -0.15, 0, 0.8)), LIST(KV_OPEN)), OFF)) : COLOR(m1, GREEN) : m2 = LIST(SWEEPSRF(circ1, CBSPLINE(2, LIST(CTLPT(E3, bbase2, 0, bnheight * 5 / 6), CTLPT(E3, 0.15, 0, 0.8)), LIST(KV_OPEN)), OFF)) : COLOR(m2, GREEN) : m3 = LIST(SWEEPSRF(circ2, CBSPLINE(2, LIST(CTLPT(E3, -bupper * 2 / 3, bupper * 1 / 3, bheight), CTLPT(E3, -0.08, 0.05, 0.8)), LIST(KV_OPEN)), OFF)) : COLOR(m3, GREEN) : m4 = LIST(SWEEPSRF(circ2, CBSPLINE(2, LIST(CTLPT(E3, bupper * 2 / 3, bupper * 1 / 3, bheight), CTLPT(E3, 0.08, 0.05, 0.8)), LIST(KV_OPEN)), OFF)) : COLOR(m4, GREEN) : m5 = LIST(SWEEPSRF(circ1, CBSPLINE(2, LIST(CTLPT(E3, -0.15, 0, 0.8), CTLPT(E3, -0.08, 0.05, 0.8), CTLPT(E3, 0.08, 0.05, 0.8), CTLPT(E3, 0.15, 0, 0.8)), LIST(KV_OPEN)), OFF)) : COLOR(m5, GREEN) : return = m1 + m2 + m3 + m4 + m5 ; bottle = FUNCTION() : oo : oo = SURFPREV(bottle_curve()) : COLOR(oo, GREEN) : return = oo ; plug = FUNCTION() : pp : pp = SURFPREV(plug_curve(0.45)) : COLOR(pp, YELLOW) : return = pp ; hell = FUNCTION(upto, spins) : t : hell = NIL() : lX = rneck : lX1 = rneck : lY = 0 : lY1 = 0 : lZ = 0 : FOR (t = 2 * PI / 64, 2 * PI / 64, 2 * PI * spins - 2 * PI / 64, X = rneck * cos(t) : X1 = neck * cos(t) : Y = rneck * sin(t) : Y1 = neck * sin(t) : Z = t * upto / 2 / PI / spins : pt1 = VECTOR(lX, lY, lZ + helrad) : pt2 = VECTOR(lX1, lY1, lZ + helrad/2) : pt3 = VECTOR(lX1, lY1, lZ - helrad/2) : pt4 = VECTOR(lX, lY, lZ - helrad) : pt5 = VECTOR(X, Y, Z + helrad) : pt6 = VECTOR(X1, Y1, Z + helrad/2) : pt7 = VECTOR(X1, Y1, Z - helrad/2) : pt8 = VECTOR(X, Y, Z - helrad) : hell = hell + LIST(POLY(LIST(pt1, pt2, pt6, pt5 ), FALSE), POLY(LIST(pt2, pt3, pt7, pt6 ), FALSE), POLY(LIST(pt3, pt4, pt8, pt7 ), FALSE)) : lX = X : lX1 = X1 : lY = Y : lY1 = Y1 : lZ = Z) : t = 2 * PI * spins : X = rneck * cos(t) : X1 = neck * cos(t) : Y = rneck * sin(t) : Y1 = neck * sin(t) : Z = t * upto / 2 / PI / spins : pt1 = VECTOR(lX, lY, lZ + helrad) : pt2 = VECTOR(lX1, lY1, lZ + helrad/2) : pt3 = VECTOR(lX1, lY1, lZ - helrad/2) : pt4 = VECTOR(lX, lY, lZ - helrad) : pt5 = VECTOR(X, Y, Z + helrad) : pt6 = VECTOR(X1, Y1, Z + helrad/2) : pt7 = VECTOR(X1, Y1, Z - helrad/2) : pt8 = VECTOR(X, Y, Z - helrad) : hell = hell + LIST(POLY(LIST(pt1, pt2, pt6, pt5 ), FALSE), POLY(LIST(pt2, pt3, pt7, pt6 ), FALSE), POLY(LIST(pt3, pt4, pt8, pt7 ), FALSE)) : hellix = convex(MERGEPOLY(hell)) : COLOR(hellix, YELLOW) : return = hellix ; view_tree = LIST(bubble() * TRANS(VECTOR(0, 0, 0.4)), bottle() * TRANS(VECTOR(0, 0, 0.4)), mustasche() * TRANS(VECTOR(0, 0, 0.4)), hell(0.3 - helrad, 5) * TRANS(VECTOR(0, 0, 0.1)), plug()); viewdclear(); viewobj(view_tree);