QF DSL v1
Describe construcciones exactas y reproducibles. No es necesario para usar QF, pero es útil para secuencias largas y material reutilizable. Un error de escritura rechaza el script entero indicando la línea: nunca dibuja algo distinto de lo que pediste.
/qf-dsl sirve a tres gramáticas. Cuál se usa no depende de lo que escribas, sino del lienzo en el que estés: en geometría se parsea la construcción sintética; en el plano cartesiano, las gráficas; en física, la escena mecánica. Varios constructores se llaman igual en más de una —point, segment, circle, intersection, angle, label— a propósito.Geometría
Construcción sintética en un lienzo sin ejes: puntos, segmentos, polígonos y circunferencias, con sus puntos y figuras derivadas vivos — un cuadrado apoyado en un lado se rehace cuando ese lado se mueve.
/qf-dsl
T = triangle(A, B, C)
H = foot(B, A, C)
altura = segment(B, H)
M = midpoint(A, C)
mediana = segment(B, M)
G = centroid(T)Objetos básicos
- point(x, y)
- Punto libre
- segment(A, B)
- Segmento
- line(A, B)
- Recta
- circle(O, r)
- Circunferencia
- triangle(A, B, C)
- Triángulo
- quadrilateral(A, B, C, D)
- Cuadrilátero cualquiera; nombra sus lados AB, BC, CD, DA
- polygon(A, B, C, D, E)
- Polígono de n vértices
Puntos derivados
- midpoint(A, B)
- Punto medio
- foot(P, A, B)
- Pie perpendicular
- intersection(r, s)
- Intersección
- on_circle(c, 55)
- Punto atado a la circunferencia
- on_segment(s, 0.35)
- Atado al segmento: se desliza por él
- on_side(AB, 0.35)
- Atado a un lado del polígono
- center(Q)
- Centro de una figura
Relaciones
- parallel(A, B, P)
- Paralela
- perpendicular(A, B, P)
- Perpendicular
- perpendicular_bisector(A, B)
- Mediatriz
- tangent(c, P)
- Tangente
- secant(c, P)
- Secante
Figuras y marcas
- square_on(AB, external)
- Cuadrado sobre el lado de un polígono, hacia afuera
- square_on(A, B, left)
- Sobre dos puntos sueltos: izquierda o derecha de A→B
- angle(A, B, C)
- Marca de ángulo viva en el vértice B
- angle(A, B, C, alfa)
- La misma marca con símbolo en vez de medida
Centros y círculos
- centroid(T)
- Baricentro
- orthocenter(T)
- Ortocentro
- incenter(T)
- Incentro
- circumcenter(T)
- Circuncentro
- incircle(T)
- Círculo inscrito
- circumcircle(T)
- Círculo circunscrito
Plano cartesiano
Curvas, cónicas, regiones y sumas de Riemann. Aquí los ejes SON el sistema de coordenadas, así que no hay escala en píxeles que declarar.
/qf-dsl
window x: [-3, 4], y: [-2, 8]
f = plot(x^2)
g = plot(2*x + 1)
P = intersection(f, g)
S = area(f, g, [-1:3], donde g > f)Lienzo y parámetros
- window x: [-4, 4], y: [-1, 10]
- Ventana de los ejes
- axis x: "t (s)", y: "v"
- Etiquetas
- grid on · title "…"
- Rejilla y título
- param a = 2 in [-5, 5]
- Deslizador
Curvas y cónicas
- plot(x^2 + 2, [-1:3])
- Curva y = f(x), con dominio
- curve(cos(t), sin(t), [0:2*pi])
- Paramétrica
- polar(2*cos(3*theta), [0:2*pi])
- Polar
- circle((0, 0), 3)
- Circunferencia
- ellipse((1, 0), a=4, b=2)
- Elipse
- hyperbola((0,0), a=2, b=1)
- Hipérbola · parabola((0,0), p=2)
Puntos derivados
- intersection(f, g)
- TODAS las intersecciones, por x ascendente
- P[0] · P[1]
- Un miembro de la colección
- intersection(f, g, segunda)
- Atajo de P[1]
- roots(f)
- Cortes con el eje x
- at(f, 0)
- El punto (0, f(0))
- on_circle(k, 55)
- Sobre la cónica, en grados
Regiones y texto
- area(f, [0:3])
- Entre la curva y el eje x
- area(f, g, [0:3], donde g > f)
- Sombreado condicional
- region(arriba f)
- Inecuación y ≥ f(x)
- riemann(f, [0:3], n=8)
- Suma de Riemann
- inequality(2*x + 3*y <= 6)
- Semiplano
- note((1, 5), "…") · label(A, "P")
- Texto suelto y rótulo
Física (mecánica)
Cuerpos, soportes y conectores unidos por relaciones: no se declaran coordenadas — la posición de cada cuerpo sale del grafo (on, stack, pin, attach, route) y las fuerzas de un diagrama de cuerpo libre se deducen de él, no se dibujan a mano. Las magnitudes sí se pueden declarar en newtons cuando el enunciado las da, y el largo de cada flecha las respeta.
/qf-dsl
rampa = ramp(30)
A = block(4kg, "m₁")
on(A, rampa, at=0.55, mu=0.3)
fbd(A)
axes(A, decompose=on)
angle(rampa, "θ")Cuerpos
- block(4kg, "m₁")
- Bloque; masa y etiqueta opcionales
- sphere(2kg, r=20)
- Esfera, con radio en píxeles
- beam(length=220)
- Barra rígida (alias: bar)
- pulley(24)
- Polea, con su radio
Soportes
- floor()
- Piso horizontal
- ramp(30)
- Rampa, con su ángulo en grados
- surface(length=600)
- Superficie genérica; angle= opcional
- ceiling()
- Techo
- wall(left)
- Pared izquierda o derecha
- anchor(techo, at=0.3)
- Punto de anclaje sobre techo, superficie o barra
Conectores y fuerzas
- rope()
- Cuerda. Compacta: rope(from=A.top, via=[over(P)], to=B.top)
- rope(orientation=vertical)
- Eje declarado para el motor: vertical, horizontal, along_surface (sigue la tangente del apoyo) o free. El cálculo cree la declaración, no el trazo
- spring(k=200, rest=120)
- Resorte
- junction()
- Nudo donde concurren varias cuerdas
- force(50N, direction=down)
- Fuerza externa: right/up/left/down o un ángulo
Relaciones (la posición sale del grafo)
- on(A, rampa, at=0.55, mu=0.3)
- Apoyo sobre una superficie; mu= añade fricción
- stack(B, A)
- B apilado sobre A
- contact(b, mesa, at=0.4)
- Contacto genérico cuerpo–superficie
- pin(P1.axle, techo)
- Unión persistente del eje (polea, o barra con at=)
- attach(c1.a, A.top)
- Terminal de cuerda o resorte a un puerto del cuerpo; los soportes van SIN puerto: attach(c1.b, techo)
- route(c1, [over(P1), over(P2)])
- La cuerda rodea las poleas, en orden
- apply(F, viga.rightEnd)
- Aplica la fuerza sobre un punto del cuerpo
Vistas y layout
- fbd(A)
- Diagrama de cuerpo libre: las fuerzas se deducen del grafo
- forces(A, B)
- DCL de varios cuerpos a la vez
- fbd(A, weight=20N, normal=10N)
- Magnitudes declaradas en newtons: el largo de cada flecha las respeta (weight, normal, friction, tension)
- fbd(A, weight="Fg", weight_t="Fg·senθ")
- Rótulo por fuerza y por componente de la descomposición (_t tangencial, _n normal)
- fbd_scale(1.5)
- Calibrado global: multiplica el largo de todas las flechas del DCL
- equilibrium()
- ¿El sistema está en equilibrio? El motor resuelve y responde con las tensiones y normales que lo sostienen, más los supuestos que usó
- axes(A, decompose=on)
- Ejes vivos anclados al cuerpo (rotan con él); decompose descompone los vectores cercanos en componentes (mg·senθ, mg·cosθ). Etiquetas: axes(A, "t", "n")
- angle(rampa, "θ")
- Arco de ángulo sobre la rampa, con símbolo o medida
- label(A, "caja")
- Rótulo del objeto
- place(B, x=380, y=260, rot=15)
- Solo cuerpos que ninguna relación ubica
Macros direccionables
- S = atwood(5kg, 3kg)
- Máquina de Atwood; piezas: S.techo, S.polea, S.m1, S.m2, S.cuerda
- W = incline(30, 4kg)
- Plano inclinado con bloque; piezas: W.rampa, W.bloque
/qf-dsl. Cada nombre se define una vez y puede reutilizarse. Escribe /qf-dsl help en el asistente para ver la referencia del lienzo activo.