Cuerdas, poleas y resortes
ParcialCompone sistemas mecánicos mediante cuerpos y conexiones. Los presets frecuentes son deterministas, el DSL los expresa con exactitud (incluidas macros como atwood), y las composiciones abiertas usan IA.
Una escena estructurada con cuerpos, conectores y relaciones de contacto o unión.
/qf-dsl
S = atwood(5kg, 3kg)
label(S.m1, "m₁")
label(S.m2, "m₂")
equilibrium()atwood() es una macro direccionable: expande techo, polea, dos bloques y la cuerda, y cada pieza se puede nombrar (S.polea, S.m1.top). equilibrium() le pregunta al motor si el sistema está en equilibrio: acá responde que no, con la aceleración (2.45 m/s²) y la tensión (36.79 N) que resolvió, más los supuestos que usó.
/qf-dsl
S = atwood(5kg, 3kg)
equilibrium()
datos()
note(S.m1, "T = {{tension(S.cuerda)}} N")
/qf-style
decimal: comadatos() escribe en la figura lo que resolvió el motor —«No está en equilibrio», a = 2,45 m/s² y T = 36,79 N, con coma decimal por el estilo— y la nota lleva la tensión viva junto al bloque. Al cambiar una masa, las dos se rehacen.
/qf-dsl
techo = ceiling()
J = junction()
A = block(10kg)
c1 = rope(from=J, to=techo, direction=150)
c2 = rope(from=J, to=techo, direction=60)
c3 = rope(from=J, to=A.top)
fbd(J)
equilibrium()El nudo: direction= declara el ángulo de cada cuerda, de from= hacia to= (150 y 60 son 30° y 60° con el techo), y el motor las ata al techo donde esas rectas lo tocan. fbd(J) dibuja solo las tensiones del nudo, a escala entre sí, y equilibrium() las da todas: T(c1) = 49.05 N, T(c2) = 84.96 N y T(c3) = 98.10 N.
/qf-dsl
mesa = table()
a1 = anchor(mesa, at=1)
P = pulley(28)
pin(P.axle, a1)
A = block(3kg, "A")
on(A, mesa)
B = block(2kg, "B")
c = rope(from=A.right, via=[over(P)], to=B.top)
equilibrium()table() dibuja la mesa —tablero y patas— y anchor(mesa, at=1) monta el soporte de la polea en su esquina derecha. La polea queda afuera del canto, con su parte de arriba a la altura del amarre: el tramo de A sale horizontal y B cuelga vertical, afuera de la mesa. equilibrium() responde a = 3.92 m/s² y T = 11.77 N.
/qf-dsl
mesa = table()
a1 = anchor(mesa, at=1)
a2 = anchor(mesa, at=0)
P = pulley(28)
Q = pulley(28)
pin(P.axle, a1)
pin(Q.axle, a2)
A = block(3kg, "A")
on(A, mesa)
B = block(2kg, "B")
D = block(1kg, "D")
c = rope(from=A.right, via=[over(P)], to=B.top)
e = rope(from=A.left, via=[over(Q)], to=D.top)
equilibrium()Una polea en cada esquina: at=0 es la izquierda, y todo se dibuja en espejo. equilibrium() responde que D sube a 1.64 m/s², con T(c) = 16.35 N y T(e) = 11.45 N.
/qf-dsl
techo = ceiling()
F = pulley(24)
pin(F.axle, techo)
M = pulley(24)
c = rope()
m1 = block(1kg, "m₁")
m2 = block(3kg, "m₂")
attach(c.a, m1.top)
route(c, [over(F), over(M)])
attach(c.b, techo)
c2 = rope()
attach(c2.a, M.axle)
attach(c2.b, m2.top)
equilibrium()La polea MÓVIL: M no tiene pin y la cuerda c la rodea por abajo entre la polea fija F y el techo, así que cuelga en el seno, con sus dos tramos verticales, y m₂ cuelga de su eje. equilibrium() responde que m₁ sube a 2.80 m/s², con T(c) = 12.61 N y T(c2) = 25.23 N: la cuerda del eje tira con el doble.
Dibuja dos bloques unidos por una cuerda que pasa por una polea. A está sobre una mesa y B cuelga. Muestra la tensión./qf-dsl
pared = wall(left)
piso = floor()
A = block(2kg)
on(A, piso)
s = spring(k=200, rest=120)
attach(s.a, pared)
attach(s.b, A.left)El resorte sale de la pared a la altura del bloque, horizontal: su extremo en un soporte va donde su eje lo toca. Colgado de un techo, queda vertical; spring(orientation=) declara el eje.
Une un bloque a una pared mediante un resorte horizontal y etiqueta su constante como k.