Guía/Referencia avanzada/QF DSL v1

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.

El prefijo /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.

Ejemplo completo
/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.

Ejemplo completo
/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.

Ejemplo completo
/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
Inicia cada script con /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.