{"id":8527,"date":"2026-08-11T17:55:52","date_gmt":"2026-08-11T20:55:52","guid":{"rendered":"https:\/\/fisica2.fica.unsl.edu.ar\/?page_id=8527"},"modified":"2026-08-21T10:06:52","modified_gmt":"2026-08-21T13:06:52","slug":"movimiento_mru_mrua","status":"publish","type":"page","link":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/","title":{"rendered":"movimiento_MRU_MRUA"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8527\" class=\"elementor elementor-8527\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0e73543 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0e73543\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0c286f0\" data-id=\"0c286f0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a8c0d06 elementor-widget elementor-widget-html\" data-id=\"a8c0d06\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>FISAR_SIM \u2013 MRUA | FICA \u2013 UNSL<\/title>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.7\/dist\/chart.umd.min.js\"><\/script>\r\n<style>\r\n\/* ============================================\r\n   FISAR_SIM \u2013 MRUA \u2013 Universidad Nacional de San Luis\r\n   Layout: viewport-fitting con CSS Grid robusto\r\n   ============================================ *\/\r\n:root {\r\n  --bg: #f8f9fa; --surface: #ffffff; --border: #e0e4e8;\r\n  --text: #1a1a2e; --text2: #1a1a2e; --text3: #2d2f45;\r\n  --primary: #0d7377; --primary-light: #14a3a8; --primary-dark: #095456;\r\n  --accent: #e8871e;\r\n  --vel-color: #2e7d32; --acc-color: #c62828; --pos-color: #1565c0;\r\n  --cmp-color: #7b1fa2;\r\n  --radius: 10px; --radius-sm: 6px;\r\n  --shadow-sm: 0 1px 3px rgba(0,0,0,0.08);\r\n  --font: 'Segoe UI', system-ui, -apple-system, sans-serif;\r\n  --mono: 'SF Mono','Fira Code','Consolas', monospace;\r\n}\r\n* { margin: 0; padding: 0; box-sizing: border-box; }\r\nhtml, body {\r\n  min-height: 100%;\r\n  overflow-y: auto;\r\n  font-family: var(--font);\r\n  background: var(--bg);\r\n  color: var(--text);\r\n  font-size: 14px;\r\n  line-height: 1.5;\r\n}\r\n\r\n\/* === HEADER === *\/\r\n.header {\r\n  background: var(--surface);\r\n  border-bottom: 1px solid var(--border);\r\n  padding: 10px 24px;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 16px;\r\n  height: 54px;\r\n  flex-shrink: 0;\r\n}\r\n.brand-top { font-size: 0.75rem; font-weight: 700; color: var(--primary); letter-spacing: 2px; text-transform: uppercase; }\r\n.brand-sub { font-size: 0.7rem; color: var(--text3); }\r\n.header h1 { font-size: 1.1rem; font-weight: 600; }\r\n.header .subtitle { font-size: 0.78rem; color: var(--text2); font-weight: 400; }\r\n\r\n\/* === MAIN: CSS Grid con filas proporcionales === *\/\r\n.main {\r\n  display: grid;\r\n  grid-template-rows: auto 240px auto auto auto;\r\n  gap: 8px;\r\n  padding: 8px 10px;\r\n}\r\n\r\n\/* === TOP ROW: 3 columnas === *\/\r\n.top-row {\r\n  display: grid;\r\n  grid-template-columns: 220px 1fr 220px;\r\n  gap: 8px;\r\n  min-height: 0;\r\n}\r\n\r\n\/* === CARDS === *\/\r\n.card {\r\n  background: var(--surface);\r\n  border: 1px solid var(--border);\r\n  border-radius: var(--radius);\r\n  box-shadow: var(--shadow-sm);\r\n  overflow: hidden;\r\n  display: flex;\r\n  flex-direction: column;\r\n}\r\n.card-header {\r\n  padding: 6px 12px;\r\n  font-size: 0.75rem;\r\n  font-weight: 600;\r\n  color: var(--text2);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  border-bottom: 1px solid var(--border);\r\n  background: #fafbfc;\r\n  flex-shrink: 0;\r\n}\r\n.card-body { padding: 10px 12px; flex: 1; min-height: 0; overflow-y: auto; }\r\n.card-body::-webkit-scrollbar { width: 3px; }\r\n.card-body::-webkit-scrollbar-thumb { background: #c8cbd0; border-radius: 2px; }\r\n\r\n\/* === SIDEBAR (izquierda y derecha) === *\/\r\n.sidebar-left, .sidebar-right {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 6px;\r\n}\r\n.sidebar-left .card, .sidebar-right .card {\r\n  flex: 1 1 auto;\r\n  min-height: 0;\r\n}\r\n\r\n\/* === PAR\u00c1METROS (sin slider) === *\/\r\n.param-group { margin-bottom: 6px; }\r\n.param-group:last-child { margin-bottom: 0; }\r\n.param-row {\r\n  display: flex; align-items: center; justify-content: space-between; gap: 6px;\r\n}\r\n.param-row .param-name {\r\n  font-size: 0.82rem; font-weight: 500; white-space: nowrap;\r\n}\r\n.param-row .unit { font-size: 0.72rem; color: var(--text3); margin-left: 2px; }\r\n.param-row input[type=\"number\"] {\r\n  width: 72px; padding: 3px 5px; border: 1px solid var(--border);\r\n  border-radius: var(--radius-sm); font-family: var(--mono); font-size: 0.82rem;\r\n  text-align: center; outline: none;\r\n}\r\n.param-row input[type=\"number\"]:focus { border-color: var(--primary); }\r\n\r\n\/* === PRESETS === *\/\r\n.preset-grid { display: flex; flex-wrap: wrap; gap: 4px; }\r\n.preset-btn {\r\n  padding: 4px 10px; font-size: 0.72rem; border: 1px solid var(--border);\r\n  border-radius: var(--radius-sm); background: #fafbfc; cursor: pointer;\r\n  text-align: center; color: var(--text2); transition: all 0.15s; font-family: var(--font);\r\n}\r\n.preset-btn:hover { background: var(--primary); color: #fff; border-color: var(--primary); }\r\n\r\n\/* === OPCIONES DE VISUALIZACI\u00d3N === *\/\r\n.option-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-size: 0.78rem; }\r\n.option-row input[type=\"checkbox\"] { accent-color: var(--primary); width: 14px; height: 14px; cursor: pointer; }\r\n.opt-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; }\r\n\r\n\/* === CONTROLES === *\/\r\n.controls-row { display: flex; gap: 6px; flex-wrap: wrap; }\r\n.btn {\r\n  display: inline-flex; align-items: center; justify-content: center; gap: 5px;\r\n  padding: 6px 12px; border: 1px solid var(--border); border-radius: var(--radius-sm);\r\n  background: var(--surface); font-family: var(--font); font-size: 0.78rem;\r\n  font-weight: 500; cursor: pointer; color: var(--text); transition: all 0.15s;\r\n  white-space: nowrap; min-height: 32px;\r\n}\r\n.btn:hover { background: #f0f1f3; border-color: #c8cbd0; }\r\n.btn:active { transform: scale(0.97); }\r\n.btn-primary { background: var(--primary); color: #fff; border-color: var(--primary); }\r\n.btn-primary:hover { background: var(--primary-dark); }\r\n.btn-sm { padding: 4px 9px; font-size: 0.72rem; min-height: 26px; }\r\n.btn-icon { padding: 6px 10px; font-size: 1rem; }\r\n.speed-selector {\r\n  display: flex; margin-left: auto; border: 1px solid var(--border);\r\n  border-radius: var(--radius-sm); overflow: hidden;\r\n}\r\n.speed-btn {\r\n  padding: 5px 9px; border: none; background: var(--surface); font-family: var(--mono);\r\n  font-size: 0.7rem; cursor: pointer; color: var(--text2);\r\n  border-right: 1px solid var(--border); transition: all 0.15s;\r\n}\r\n.speed-btn:last-child { border-right: none; }\r\n.speed-btn:hover { background: #f0f1f3; }\r\n.speed-btn.active { background: var(--primary); color: #fff; }\r\n\r\n\/* === CANVAS CENTRAL === *\/\r\n.canvas-col {\r\n  display: flex;\r\n  flex-direction: column;\r\n  min-height: 0;\r\n}\r\n.time-display {\r\n  text-align: center; padding: 4px 0; font-family: var(--mono);\r\n  font-size: 1rem; font-weight: 600; color: var(--primary-dark);\r\n  background: var(--surface); border: 1px solid var(--border);\r\n  border-bottom: none; border-radius: var(--radius) var(--radius) 0 0;\r\n  flex-shrink: 0;\r\n}\r\n.canvas-container {\r\n  height: 140px; min-height: 100px; position: relative;\r\n  background: var(--surface); border-left: 1px solid var(--border);\r\n  border-right: 1px solid var(--border);\r\n}\r\n.canvas-container canvas { width: 100%; height: 100%; display: block; }\r\n.controls-bar {\r\n  display: flex; align-items: center; gap: 5px; padding: 6px 10px;\r\n  background: var(--surface); border: 1px solid var(--border);\r\n  border-top: none; border-radius: 0 0 var(--radius) var(--radius);\r\n  flex-shrink: 0; flex-wrap: wrap;\r\n}\r\n\r\n\/* === VARIABLES EN TIEMPO REAL === *\/\r\n.info-row {\r\n  display: flex; justify-content: space-between; align-items: center;\r\n  padding: 3px 0; border-bottom: 1px solid #f0f1f3;\r\n}\r\n.info-row:last-child { border-bottom: none; }\r\n.info-label { font-size: 0.78rem; font-weight: 500; color: var(--text2); }\r\n.info-value { font-family: var(--mono); font-size: 0.8rem; font-weight: 600; }\r\n.iv-t { color: var(--primary); }\r\n.iv-x { color: var(--pos-color); }\r\n.iv-v { color: var(--vel-color); }\r\n.iv-a { color: var(--acc-color); }\r\n.iv-dx { color: var(--accent); }\r\n\r\n\/* === EVENT BOX === *\/\r\n.event-box {\r\n  margin-top: 8px; padding: 6px 8px; background: #fff8e1;\r\n  border-left: 3px solid var(--accent); border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\r\n  font-size: 0.74rem; display: none;\r\n}\r\n.event-box.visible { display: block; }\r\n.event-title { font-weight: 600; color: #e65100; margin-bottom: 2px; }\r\n.event-detail { color: var(--text2); font-family: var(--mono); font-size: 0.7rem; }\r\n\r\n\/* === MODELO MATEM\u00c1TICO (sin MathJax, HTML puro) === *\/\r\n.math-panel {\r\n  padding: 8px 6px; background: #f7f8fa; border-radius: var(--radius-sm);\r\n  text-align: center; line-height: 1.8;\r\n}\r\n.math-panel div { margin: 1px 0; }\r\n.eq { font-family: 'Times New Roman', 'Georgia', serif; font-size: 1.05rem; }\r\n.eq-var { font-style: italic; }\r\n.eq-unit { font-size: 0.72rem; color: var(--text3); font-family: var(--font); font-style: normal; margin-left: 4px; }\r\n.eq-sup { font-size: 0.72em; vertical-align: super; }\r\n.eq-sub { font-size: 0.72em; vertical-align: sub; }\r\n.eq-half { font-size: 0.82em; }\r\n\r\n\/* === OVERLAY MODAL === *\/\r\n.overlay {\r\n  display: none; position: fixed; inset: 0; z-index: 900;\r\n  background: rgba(0,0,0,0.4); align-items: center; justify-content: center;\r\n}\r\n.overlay.open { display: flex; }\r\n.overlay-box {\r\n  background: var(--surface); border-radius: var(--radius); box-shadow: 0 8px 30px rgba(0,0,0,0.2);\r\n  max-width: 480px; width: 90%; max-height: 80vh; overflow-y: auto;\r\n}\r\n.overlay-header {\r\n  padding: 10px 16px; border-bottom: 1px solid var(--border);\r\n  display: flex; justify-content: space-between; align-items: center;\r\n  font-size: 0.85rem; font-weight: 600; color: var(--text2); text-transform: uppercase; letter-spacing: 0.5px;\r\n}\r\n.overlay-close {\r\n  background: none; border: none; font-size: 1.2rem; cursor: pointer;\r\n  color: var(--text3); padding: 2px 6px; border-radius: 4px;\r\n}\r\n.overlay-close:hover { background: #f0f1f3; color: var(--text); }\r\n.overlay-body { padding: 14px 16px; }\r\n\r\n\/* === PEDAG\u00d3GICO === *\/\r\n.pedagogical-list { list-style: none; padding: 0; }\r\n.pedagogical-list li {\r\n  padding: 4px 0 4px 14px; font-size: 0.75rem; color: var(--text2);\r\n  border-bottom: 1px solid #f0f1f3; position:relative; word-break:break-word; line-height:1.35;\r\n}\r\n.pedagogical-list li:last-child { border-bottom: none; }\r\n.pedagogical-list li::before {\r\n  content: '\u25cf'; color: var(--primary); font-size: 0.45rem;\r\n  position: absolute; left: 2px; top: 8px;\r\n}\r\n\r\n\/* === GRAPHS ROW === *\/\r\n.graphs-row {\r\n  display: grid;\r\n  grid-template-columns: repeat(3, 1fr);\r\n  gap: 8px;\r\n}\r\n.graph-card { min-height: 200px; overflow: hidden; }\r\n.graph-card .card-body { position: relative; padding: 4px 6px 2px; }\r\n.graph-card canvas { width: 100% !important; height: 100% !important; }\r\n\r\n\/* === EXTRAS ROW === *\/\r\n.extras-row {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1.2fr 0.8fr;\r\n  gap: 8px;\r\n}\r\n.extras-row .card-body { overflow: visible; }\r\n\r\n\/* === BOTTOM ROW === *\/\r\n.bottom-row {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 8px;\r\n  flex-shrink: 0;\r\n}\r\n.exp-controls { display: flex; gap: 5px; flex-wrap: wrap; margin-bottom: 6px; }\r\n.data-table-wrap {\r\n  max-height: 80px; overflow-y: auto; border: 1px solid var(--border); border-radius: var(--radius-sm);\r\n}\r\n.data-table-wrap table { width: 100%; border-collapse: collapse; font-size: 0.72rem; }\r\n.data-table-wrap th, .data-table-wrap td { padding: 3px 8px; text-align: center; border-bottom: 1px solid #f0f1f3; }\r\n.data-table-wrap th { background: #fafbfc; font-weight: 600; color: var(--text2); position: sticky; top: 0; }\r\n.empty-msg { padding: 10px; text-align: center; color: var(--text3); font-size: 0.75rem; }\r\n.data-table-wrap::-webkit-scrollbar { width: 4px; }\r\n.data-table-wrap::-webkit-scrollbar-thumb { background: #c8cbd0; border-radius: 2px; }\r\n\r\n\/* === FOOTER === *\/\r\n.footer {\r\n  text-align: center; padding: 8px 24px; font-size: 0.65rem; color: var(--text3);\r\n  border-top: 1px solid var(--border); background: var(--surface);\r\n}\r\n\r\n\/* === TOAST === *\/\r\n.toast {\r\n  position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(10px);\r\n  padding: 8px 16px; background: var(--text); color: #fff; border-radius: var(--radius-sm);\r\n  font-size: 0.8rem; opacity: 0; transition: all 0.3s; z-index: 1000; pointer-events: none;\r\n}\r\n.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }\r\n\r\n\/* === RESPONSIVE === *\/\r\n@media (max-width: 1100px) {\r\n  .top-row { grid-template-columns: 200px 1fr 200px; }\r\n}\r\n@media (max-width: 900px) {\r\n  .main { grid-template-rows: auto auto auto auto auto; }\r\n  .top-row { grid-template-columns: 1fr; }\r\n  .graphs-row { grid-template-columns: 1fr; }\r\n  .extras-row { grid-template-columns: 1fr; }\r\n  .bottom-row { grid-template-columns: 1fr; }\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<!-- =============== HEADER =============== -->\r\n<header class=\"header\">\r\n  <div>\r\n    <span class=\"brand-top\"><a href=\"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/FISAR_SIM\/\"><img decoding=\"async\" src=\"https:\/\/fisica2.fica.unsl.edu.ar\/wp-content\/uploads\/2026\/08\/FISAR_SIM_2.png\r\n\" alt=\"FISAR_SIM\"  width=\"80\" o height=\"37\"><\/a><\/span><br> <span class=\"brand-sub\">FICA \u2013 Universidad Nacional de San Luis<\/span>\r\n\r\n  <\/div>\r\n  <div>\r\n    <h1>Cinem\u00e1tica. Movimiento Rectil\u00edneo MRU y MRUA<\/h1>\r\n    <span class=\"subtitle\">Exploraci\u00f3n interactiva de la posici\u00f3n, velocidad y aceleraci\u00f3n<\/span>\r\n  <\/div>\r\n<\/header>\r\n\r\n<!-- =============== MAIN CONTENT =============== -->\r\n<main class=\"main\">\r\n\r\n  <!-- ====== FILA SUPERIOR: Par\u00e1metros | Canvas | Variables ====== -->\r\n  <div class=\"top-row\">\r\n\r\n    <!-- COLUMNA IZQUIERDA -->\r\n    <div class=\"sidebar-left\">\r\n      <!-- Par\u00e1metros -->\r\n      <div class=\"card\">\r\n        <div class=\"card-header\">Par\u00e1metros<\/div>\r\n        <div class=\"card-body\">\r\n          <div class=\"param-group\">\r\n            <div class=\"param-row\">\r\n              <span><span class=\"param-name\">x\u2080<\/span><span class=\"unit\">m<\/span><\/span>\r\n              <input type=\"number\" id=\"input-x0\" min=\"-50\" max=\"50\" step=\"0.5\" value=\"0\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"param-group\">\r\n            <div class=\"param-row\">\r\n              <span><span class=\"param-name\">v\u2080<\/span><span class=\"unit\">m\/s<\/span><\/span>\r\n              <input type=\"number\" id=\"input-v0\" min=\"-20\" max=\"20\" step=\"0.5\" value=\"5\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"param-group\">\r\n            <div class=\"param-row\">\r\n              <span><span class=\"param-name\">a<\/span><span class=\"unit\">m\/s\u00b2<\/span><\/span>\r\n              <input type=\"number\" id=\"input-a\" min=\"-10\" max=\"10\" step=\"0.1\" value=\"2\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"param-group\">\r\n            <div class=\"param-row\">\r\n              <span><span class=\"param-name\">t m\u00e1ximo<\/span><span class=\"unit\">s<\/span><\/span>\r\n              <input type=\"number\" id=\"input-tmax\" min=\"2\" max=\"30\" step=\"1\" value=\"10\">\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- COLUMNA CENTRAL: Canvas + Controles -->\r\n    <div class=\"canvas-col\">\r\n      <div class=\"time-display\" id=\"time-display\">t = 0.00 s<\/div>\r\n      <div class=\"canvas-container\">\r\n        <canvas id=\"simCanvas\"><\/canvas>\r\n      <\/div>\r\n      <div class=\"controls-bar\">\r\n        <div class=\"controls-row\">\r\n          <button class=\"btn btn-primary btn-icon\" id=\"btn-play\" title=\"Iniciar (Espacio)\">\u25b6<\/button>\r\n          <button class=\"btn btn-icon\" id=\"btn-pause\" title=\"Pausar\">\u23f8<\/button>\r\n          <button class=\"btn btn-icon\" id=\"btn-reset\" title=\"Reiniciar (R)\">\u21bb<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-step\" title=\"Paso a paso (\u2192)\">Paso \u2192<\/button>\r\n        <\/div>\r\n        <span style=\"font-size:0.75rem;color:var(--text3);margin-left:6px;\">Velocidad:<\/span>\r\n        <div class=\"speed-selector\">\r\n          <button class=\"speed-btn\" data-speed=\"0.25\">0.25\u00d7<\/button>\r\n          <button class=\"speed-btn\" data-speed=\"0.5\">0.5\u00d7<\/button>\r\n          <button class=\"speed-btn active\" data-speed=\"1\">1\u00d7<\/button>\r\n          <button class=\"speed-btn\" data-speed=\"2\">2\u00d7<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- COLUMNA DERECHA -->\r\n    <div class=\"sidebar-right\">\r\n      <!-- Variables en tiempo real -->\r\n      <div class=\"card\">\r\n        <div class=\"card-header\">Variables en tiempo real<\/div>\r\n        <div class=\"card-body\">\r\n          <div class=\"info-row\"><span class=\"info-label\">Tiempo (t)<\/span><span class=\"info-value iv-t\" id=\"info-t\">0.00 s<\/span><\/div>\r\n          <div class=\"info-row\"><span class=\"info-label\">Posici\u00f3n (x)<\/span><span class=\"info-value iv-x\" id=\"info-x\">0.00 m<\/span><\/div>\r\n          <div class=\"info-row\"><span class=\"info-label\">Velocidad (v)<\/span><span class=\"info-value iv-v\" id=\"info-v\">5.00 m\/s<\/span><\/div>\r\n          <div class=\"info-row\"><span class=\"info-label\">Aceleraci\u00f3n (a)<\/span><span class=\"info-value iv-a\" id=\"info-a\">2.00 m\/s\u00b2<\/span><\/div>\r\n          <div class=\"info-row\"><span class=\"info-label\">Desplazamiento (\u0394x)<\/span><span class=\"info-value iv-dx\" id=\"info-dx\">0.00 m<\/span><\/div>\r\n          <div class=\"event-box\" id=\"event-box\">\r\n            <div class=\"event-title\" id=\"event-title\"><\/div>\r\n            <div class=\"event-detail\" id=\"event-detail\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <!-- \u00bfQu\u00e9 podemos observar? (abre overlay) -->\r\n      <div class=\"card\">\r\n        <div class=\"card-header\" style=\"cursor:pointer;\" id=\"ped-header\">\r\n          \u00bfQu\u00e9 podemos observar? <span style=\"float:right;font-size:0.7rem;\">\u2192<\/span>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ====== FILA GR\u00c1FICAS ====== -->\r\n  <div class=\"graphs-row\">\r\n    <div class=\"card graph-card\">\r\n      <div class=\"card-header\">Posici\u00f3n vs. Tiempo<\/div>\r\n      <div class=\"card-body\"><canvas id=\"chartX\"><\/canvas><\/div>\r\n    <\/div>\r\n    <div class=\"card graph-card\">\r\n      <div class=\"card-header\">Velocidad vs. Tiempo<\/div>\r\n      <div class=\"card-body\"><canvas id=\"chartV\"><\/canvas><\/div>\r\n    <\/div>\r\n    <div class=\"card graph-card\">\r\n      <div class=\"card-header\">Aceleraci\u00f3n vs. Tiempo<\/div>\r\n      <div class=\"card-body\"><canvas id=\"chartA\"><\/canvas><\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ====== FILA EXTRAS: Presets | Modelo matem\u00e1tico | Opciones ====== -->\r\n  <div class=\"extras-row\">\r\n    <div class=\"card\">\r\n      <div class=\"card-header\">Experimentos predefinidos<\/div>\r\n      <div class=\"card-body\">\r\n        <div class=\"preset-grid\">\r\n          <button class=\"preset-btn\" data-preset=\"reposo\">Reposo con aceleraci\u00f3n<\/button>\r\n          <button class=\"preset-btn\" data-preset=\"acelerado\">Movimiento acelerado<\/button>\r\n          <button class=\"preset-btn\" data-preset=\"frenado\">Frenado<\/button>\r\n          <button class=\"preset-btn\" data-preset=\"cambio\">Cambio de sentido<\/button>\r\n          <button class=\"preset-btn\" data-preset=\"uniforme\">Movimiento uniforme<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"card\">\r\n      <div class=\"card-header\">Modelo matem\u00e1tico<\/div>\r\n      <div class=\"card-body\">\r\n        <div class=\"math-panel\" id=\"math-panel\">\r\n          <div id=\"eq-x\"><\/div>\r\n          <div id=\"eq-v\"><\/div>\r\n          <div id=\"eq-a\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"card\">\r\n      <div class=\"card-header\">Opciones de visualizaci\u00f3n<\/div>\r\n      <div class=\"card-body\">\r\n        <label class=\"option-row\"><input type=\"checkbox\" id=\"chk-vel\" checked><span class=\"opt-dot\" style=\"background:var(--vel-color)\"><\/span>Vector velocidad<\/label>\r\n        <label class=\"option-row\"><input type=\"checkbox\" id=\"chk-acc\" checked><span class=\"opt-dot\" style=\"background:var(--acc-color)\"><\/span>Vector aceleraci\u00f3n<\/label>\r\n        <label class=\"option-row\"><input type=\"checkbox\" id=\"chk-trail\" checked><span>Estela del m\u00f3vil<\/span><\/label>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ====== FILA INFERIOR: Experimento + Comparaci\u00f3n ====== -->\r\n  <div class=\"bottom-row\">\r\n    <div class=\"card\">\r\n      <div class=\"card-header\">Modo experimento<\/div>\r\n      <div class=\"card-body\">\r\n        <div class=\"exp-controls\">\r\n          <button class=\"btn btn-sm btn-primary\" id=\"btn-register\">Registrar dato<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-delete-last\">Eliminar \u00faltimo<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-clear-data\">Limpiar tabla<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-export-csv\">Exportar CSV<\/button>\r\n        <\/div>\r\n        <div class=\"data-table-wrap\" id=\"data-table-wrap\">\r\n          <div class=\"empty-msg\" id=\"empty-msg\">No hay datos registrados.<\/div>\r\n          <table id=\"data-table\" style=\"display:none;\">\r\n            <thead><tr><th>t (s)<\/th><th>x (m)<\/th><th>v (m\/s)<\/th><th>a (m\/s\u00b2)<\/th><\/tr><\/thead>\r\n            <tbody id=\"data-tbody\"><\/tbody>\r\n          <\/table>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"card\">\r\n      <div class=\"card-header\">Comparaci\u00f3n de movimientos<\/div>\r\n      <div class=\"card-body\">\r\n        <p style=\"font-size:0.76rem;color:var(--text2);margin-bottom:8px;\">Guard\u00e1 la configuraci\u00f3n actual y luego modific\u00e1 los par\u00e1metros para comparar.<\/p>\r\n        <div style=\"display:flex;gap:5px;flex-wrap:wrap;\">\r\n          <button class=\"btn btn-sm\" id=\"btn-save-a\" style=\"border-color:var(--pos-color);color:var(--pos-color);\">Guardar como Exp. A<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-save-b\" style=\"border-color:var(--cmp-color);color:var(--cmp-color);\">Guardar como Exp. B<\/button>\r\n          <button class=\"btn btn-sm\" id=\"btn-clear-cmp\">Limpiar comparaci\u00f3n<\/button>\r\n        <\/div>\r\n        <div id=\"cmp-display\" style=\"margin-top:8px;\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n<\/main>\r\n\r\n<!-- =============== OVERLAY: \u00bfQu\u00e9 podemos observar? =============== -->\r\n<div class=\"overlay\" id=\"ped-overlay\">\r\n  <div class=\"overlay-box\">\r\n    <div class=\"overlay-header\">\r\n      \u00bfQu\u00e9 podemos observar?\r\n      <button class=\"overlay-close\" id=\"ped-close\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"overlay-body\">\r\n      <ul class=\"pedagogical-list\">\r\n        <li>La <b>pendiente<\/b> de la gr\u00e1fica <span class=\"eq-var\">x<\/span>(<span class=\"eq-var\">t<\/span>) representa la <b>velocidad instant\u00e1nea<\/b>.<\/li>\r\n        <li>La <b>pendiente<\/b> de la gr\u00e1fica <span class=\"eq-var\">v<\/span>(<span class=\"eq-var\">t<\/span>) representa la <b>aceleraci\u00f3n<\/b>.<\/li>\r\n        <li>El <b>\u00e1rea bajo la curva<\/b> <span class=\"eq-var\">v<\/span>(<span class=\"eq-var\">t<\/span>) representa el <b>desplazamiento<\/b>.<\/li>\r\n        <li>En MRUA la aceleraci\u00f3n permanece <b>constante<\/b>.<\/li>\r\n        <li>Si <span class=\"eq-var\">v<\/span> = 0, el m\u00f3vil puede encontrarse en un <b>punto de retorno<\/b>.<\/li>\r\n        <li>Hac\u00e9 clic en un gr\u00e1fico para navegar a ese instante.<\/li>\r\n      <\/ul>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- =============== FOOTER =============== -->\r\n<footer class=\"footer\">\r\n  FISAR_SIM \u2013 F\u00edsica 2 \u2013 Universidad Nacional de San Luis<br>\r\n  Simulaci\u00f3n educativa de Movimiento Rectil\u00edneo Uniformemente Acelerado\r\n<\/footer>\r\n\r\n<!-- Toast -->\r\n<div class=\"toast\" id=\"toast\"><\/div>\r\n\r\n<!-- =============== JAVASCRIPT =============== -->\r\n<script>\r\n\/\/ =====================================================================\r\n\/\/ FISAR_SIM \u2013 MRUA Simulator\r\n\/\/ Universidad Nacional de San Luis \u2013 F\u00edsica 2\r\n\/\/ =====================================================================\r\n\r\n\/\/ ===== CONFIGURACI\u00d3N GENERAL =====\r\nvar CFG = {\r\n  dt: 0.04,           \/\/ Paso de integraci\u00f3n para gr\u00e1ficas\r\n  stepSize: 0.05,     \/\/ Paso del modo paso-a-paso\r\n  trailLen: 40,       \/\/ Cantidad de puntos de estela\r\n  vecScaleV: 8,       \/\/ Escala visual del vector velocidad\r\n  vecScaleA: 15,      \/\/ Escala visual del vector aceleraci\u00f3n\r\n  carW: 44,           \/\/ Ancho del auto (px)\r\n  carH: 20,           \/\/ Alto del cuerpo del auto (px)\r\n  carTopH: 16,        \/\/ Alto del techo del auto (px)\r\n  wheelR: 6,          \/\/ Radio de las ruedas (px)\r\n  margin: { l: 50, r: 30, t: 35, b: 45 },\r\n  col: {\r\n    track: '#d1d5db',\r\n    axis: '#9ca3af',\r\n    origin: '#374151',\r\n    grid: '#f0f1f3',\r\n    pos: '#1565c0',\r\n    vel: '#2e7d32',\r\n    acc: '#c62828',\r\n    car: '#0d7377',\r\n    carDk: '#095456',\r\n    win: '#e0f2fe',\r\n    wheel: '#1e293b',\r\n    hub: '#94a3b8',\r\n    x0Mark: '#e8871e',\r\n    retMark: '#d32f2f',\r\n    cmp: '#7b1fa2',\r\n    trail: 'rgba(13,115,119,0.25)'\r\n  }\r\n};\r\n\r\n\/\/ ===== PRESETS DE EXPERIMENTOS =====\r\nvar PRESETS = {\r\n  reposo:   { x0: 0,  v0: 0,  a: 2,  tMax: 10 },\r\n  acelerado:{ x0: 0,  v0: 5,  a: 2,  tMax: 10 },\r\n  frenado:  { x0: 0,  v0: 10, a: -2, tMax: 10 },\r\n  cambio:   { x0: 10, v0: -8, a: 2,  tMax: 10 },\r\n  uniforme: { x0: 0,  v0: 5,  a: 0,  tMax: 10 }\r\n};\r\n\r\n\/\/ ===== ESTADO DE LA SIMULACI\u00d3N =====\r\nvar sim = {\r\n  x0: 0, v0: 5, a: 2, tMax: 10,\r\n  t: 0, playing: false, speed: 1,\r\n  showVel: true, showAcc: true, showTrail: true,\r\n  lastTs: null, finished: false\r\n};\r\n\r\n\/\/ Datos de gr\u00e1ficas\r\nvar gData = { t: [], x: [], v: [], a: [] };\r\nvar lastGT = -1;\r\n\r\n\/\/ Datos del modo experimento\r\nvar expData = [];\r\n\r\n\/\/ Estado de comparaci\u00f3n\r\nvar cmp = { a: null, b: null, showA: false, showB: false };\r\n\r\n\/\/ Referencias al canvas y charts\r\nvar canvas, ctx, cW, cH, dpr;\r\nvar chartX, chartV, chartA;\r\n\r\n\/\/ =====================================================================\r\n\/\/ F\u00cdSICA \u2013 Ecuaciones del MRUA\r\n\/\/ =====================================================================\r\n\r\n\/** Posici\u00f3n: x(t) = x\u2080 + v\u2080\u00b7t + \u00bd\u00b7a\u00b7t\u00b2 *\/\r\nfunction calcX(t, x0, v0, a) {\r\n  return x0 + v0 * t + 0.5 * a * t * t;\r\n}\r\n\r\n\/** Velocidad: v(t) = v\u2080 + a\u00b7t *\/\r\nfunction calcV(t, v0, a) {\r\n  return v0 + a * t;\r\n}\r\n\r\n\/** Rango \u00f3ptimo de x para los ejes del canvas *\/\r\nfunction xRange(x0, v0, a, tM) {\r\n  var xS = x0, xE = calcX(tM, x0, v0, a);\r\n  var mn = Math.min(xS, xE), mx = Math.max(xS, xE);\r\n  if (a !== 0) {\r\n    var tv = -v0 \/ a;\r\n    if (tv > 0 && tv < tM) {\r\n      var xv = calcX(tv, x0, v0, a);\r\n      mn = Math.min(mn, xv);\r\n      mx = Math.max(mx, xv);\r\n    }\r\n  }\r\n  var rng = mx - mn;\r\n  var pad = Math.max(rng * 0.15, 5);\r\n  return { min: mn - pad, max: mx + pad };\r\n}\r\n\r\n\/** Rango \u00f3ptimo de v para los ejes *\/\r\nfunction vRange(v0, a, tM) {\r\n  var mn = Math.min(v0, calcV(tM, v0, a));\r\n  var mx = Math.max(v0, calcV(tM, v0, a));\r\n  var pad = Math.max((mx - mn) * 0.15, 2);\r\n  return { min: mn - pad, max: mx + pad };\r\n}\r\n\r\n\/** Encuentra el instante donde v = 0 (punto de retorno) *\/\r\nfunction findStop(v0, a, tM) {\r\n  if (a === 0) return null;\r\n  var ts = -v0 \/ a;\r\n  return (ts > 0.001 && ts < tM - 0.001) ? ts : null;\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ UTILIDADES\r\n\/\/ =====================================================================\r\n\r\nfunction fmt(n, d) { d = d || 2; return Number(n).toFixed(d); }\r\n\r\nvar toastTO;\r\nfunction showToast(msg) {\r\n  var el = document.getElementById('toast');\r\n  el.textContent = msg;\r\n  el.classList.add('show');\r\n  clearTimeout(toastTO);\r\n  toastTO = setTimeout(function() { el.classList.remove('show'); }, 2200);\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ CANVAS \u2013 Dibujo de la escena de simulaci\u00f3n\r\n\/\/ =====================================================================\r\n\r\nfunction initCanvas() {\r\n  canvas = document.getElementById('simCanvas');\r\n  ctx = canvas.getContext('2d');\r\n  resizeCanvas();\r\n}\r\n\r\nfunction resizeCanvas() {\r\n  var r = canvas.parentElement.getBoundingClientRect();\r\n  dpr = window.devicePixelRatio || 1;\r\n  canvas.width = r.width * dpr;\r\n  canvas.height = r.height * dpr;\r\n  canvas.style.width = r.width + 'px';\r\n  canvas.style.height = r.height + 'px';\r\n  cW = r.width;\r\n  cH = r.height;\r\n  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n}\r\n\r\n\/** Calcula par\u00e1metros de dibujo para el frame actual *\/\r\nfunction getDraw() {\r\n  var m = CFG.margin;\r\n  var dW = cW - m.l - m.r;\r\n  var dH = cH - m.t - m.b;\r\n  var trY = m.t + dH * 0.6;\r\n  var xR = xRange(sim.x0, sim.v0, sim.a, sim.tMax);\r\n  var xSp = xR.max - xR.min;\r\n  var ppm = dW \/ xSp;\r\n  function xPx(v) { return m.l + (v - xR.min) * ppm; }\r\n  return { m: m, dW: dW, dH: dH, trY: trY, xR: xR, xSp: xSp, ppm: ppm, xPx: xPx };\r\n}\r\n\r\n\/** Dibuja toda la escena *\/\r\nfunction drawScene() {\r\n  ctx.clearRect(0, 0, cW, cH);\r\n  var dp = getDraw();\r\n  var m = dp.m, trY = dp.trY, xPx = dp.xPx, xR = dp.xR;\r\n  var font = getComputedStyle(document.body).fontFamily;\r\n\r\n  \/\/ Fondo\r\n  ctx.fillStyle = '#fafbfc';\r\n  ctx.fillRect(0, 0, cW, cH);\r\n\r\n  \/\/ Grid vertical\r\n  var xSp = dp.xSp;\r\n  var step = 1;\r\n  if (xSp > 200) step = 20;\r\n  else if (xSp > 100) step = 10;\r\n  else if (xSp > 50) step = 5;\r\n  else if (xSp > 20) step = 2;\r\n  var st = Math.ceil(xR.min \/ step) * step;\r\n  ctx.font = '10px ' + font;\r\n  ctx.textAlign = 'center';\r\n  for (var val = st; val <= xR.max; val += step) {\r\n    var px = xPx(val);\r\n    if (px < m.l - 5 || px > cW - m.r + 5) continue;\r\n    \/\/ L\u00ednea grid\r\n    ctx.strokeStyle = CFG.col.grid; ctx.lineWidth = 1;\r\n    ctx.beginPath(); ctx.moveTo(px, m.t); ctx.lineTo(px, trY + 10); ctx.stroke();\r\n    \/\/ Tick\r\n    ctx.strokeStyle = '#9ca3af';\r\n    ctx.beginPath(); ctx.moveTo(px, trY - 4); ctx.lineTo(px, trY + 4); ctx.stroke();\r\n    \/\/ Etiqueta\r\n    ctx.fillStyle = '#1a1a2e';\r\n    ctx.font = 'bold 10px ' + font;\r\n    ctx.fillText(fmt(val, step < 1 ? 1 : 0), px, trY + 18);\r\n    ctx.font = '10px ' + font;\r\n  }\r\n  ctx.textAlign = 'start';\r\n\r\n  \/\/ Eje x\r\n  var tL = m.l - 10, tR = cW - m.r + 10;\r\n  ctx.fillStyle = '#e5e7eb';\r\n  ctx.fillRect(tL, trY + CFG.wheelR + 2, tR - tL, 4);\r\n  ctx.strokeStyle = CFG.col.axis; ctx.lineWidth = 1.5;\r\n  ctx.beginPath(); ctx.moveTo(tL, trY); ctx.lineTo(tR, trY); ctx.stroke();\r\n  \/\/ Flecha\r\n  ctx.fillStyle = CFG.col.axis;\r\n  ctx.beginPath(); ctx.moveTo(tR, trY); ctx.lineTo(tR - 10, trY - 5); ctx.lineTo(tR - 10, trY + 5); ctx.closePath(); ctx.fill();\r\n  ctx.fillStyle = '#1a1a2e';\r\n  ctx.font = 'bold 12px ' + font; ctx.fillText('x', tR - 4, trY - 10);\r\n\r\n  \/\/ Marca del origen (x=0)\r\n  var oPx = xPx(0);\r\n  if (oPx >= tL && oPx <= tR) {\r\n    ctx.strokeStyle = CFG.col.origin; ctx.lineWidth = 2;\r\n    ctx.beginPath(); ctx.moveTo(oPx, trY - 14); ctx.lineTo(oPx, trY + 14); ctx.stroke();\r\n    ctx.fillStyle = CFG.col.origin;\r\n    ctx.font = 'bold 12px ' + font;\r\n    ctx.textAlign = 'center'; ctx.fillText('0', oPx, trY + 28); ctx.textAlign = 'start';\r\n  }\r\n\r\n  \/\/ Marca x\u2080\r\n  var x0Px = xPx(sim.x0);\r\n  if (x0Px >= tL && x0Px <= tR) {\r\n    drawMark(x0Px, trY, 'x\\u2080=' + fmt(sim.x0, 1), CFG.col.x0Mark, true, font);\r\n  }\r\n\r\n  \/\/ Marca punto de retorno\r\n  var tStop = findStop(sim.v0, sim.a, sim.tMax);\r\n  if (tStop !== null && sim.t >= tStop) {\r\n    var xS = calcX(tStop, sim.x0, sim.v0, sim.a);\r\n    var xSPx = xPx(xS);\r\n    if (xSPx >= tL && xSPx <= tR) {\r\n      drawMark(xSPx, trY, 'retorno', CFG.col.retMark, false, font);\r\n    }\r\n  }\r\n\r\n  \/\/ Autos de comparaci\u00f3n (Exp A y B)\r\n  if (cmp.showA && cmp.a) {\r\n    var xA = calcX(sim.t, cmp.a.x0, cmp.a.v0, cmp.a.a);\r\n    drawCar(xPx(xA), trY, calcV(sim.t, cmp.a.v0, cmp.a.a), true);\r\n  }\r\n  if (cmp.showB && cmp.b) {\r\n    var xB = calcX(sim.t, cmp.b.x0, cmp.b.v0, cmp.b.a);\r\n    drawCar(xPx(xB), trY, calcV(sim.t, cmp.b.v0, cmp.b.a), true);\r\n  }\r\n\r\n  \/\/ Estela del m\u00f3vil\r\n  if (sim.showTrail && gData.t.length > 1) {\r\n    var tc = Math.min(gData.t.length, CFG.trailLen);\r\n    var si = gData.t.length - tc;\r\n    for (var i = si; i < gData.t.length; i++) {\r\n      var al = ((i - si) \/ tc) * 0.4;\r\n      var px = xPx(gData.x[i]);\r\n      if (px >= tL && px <= tR) {\r\n        ctx.fillStyle = 'rgba(13,115,119,' + al + ')';\r\n        ctx.beginPath(); ctx.arc(px, trY - CFG.carH - 2, 3, 0, Math.PI * 2); ctx.fill();\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ M\u00f3vil principal\r\n  var curX = calcX(sim.t, sim.x0, sim.v0, sim.a);\r\n  var curV = calcV(sim.t, sim.v0, sim.a);\r\n  drawCar(xPx(curX), trY, curV, false);\r\n\r\n  \/\/ Vectores de velocidad y aceleraci\u00f3n\r\n  var vY = trY - CFG.carH - CFG.carTopH - 8;\r\n  if (sim.showVel) drawVec(ctx, xPx(curX), vY, curV * CFG.vecScaleV, CFG.col.vel, 'v');\r\n  if (sim.showAcc && sim.a !== 0) drawVec(ctx, xPx(curX), vY - 18, sim.a * CFG.vecScaleA, CFG.col.acc, 'a');\r\n\r\n  \/\/ Etiqueta de posici\u00f3n debajo del auto\r\n  ctx.fillStyle = CFG.col.pos;\r\n  ctx.font = 'bold 11px ' + font;\r\n  ctx.textAlign = 'center';\r\n  ctx.fillText('x = ' + fmt(curX) + ' m', xPx(curX), trY + CFG.wheelR + 22);\r\n  ctx.textAlign = 'start';\r\n}\r\n\r\n\/** Dibuja una marca con tri\u00e1ngulo y etiqueta *\/\r\nfunction drawMark(px, trY, lbl, col, above, font) {\r\n  ctx.fillStyle = col;\r\n  ctx.font = 'bold 10px ' + font;\r\n  ctx.textAlign = 'center';\r\n  var yOff = above ? trY + CFG.wheelR + 38 : trY - CFG.carH - CFG.carTopH - 30;\r\n  ctx.fillText(lbl, px, yOff);\r\n  var tipY = above ? trY + CFG.wheelR + 20 : trY - CFG.carH - CFG.carTopH - 16;\r\n  ctx.beginPath();\r\n  ctx.moveTo(px, tipY);\r\n  ctx.lineTo(px - 5, tipY + (above ? 8 : -8));\r\n  ctx.lineTo(px + 5, tipY + (above ? 8 : -8));\r\n  ctx.closePath(); ctx.fill();\r\n  ctx.textAlign = 'start';\r\n}\r\n\r\n\/** Dibuja el auto (m\u00f3vil) *\/\r\nfunction drawCar(px, trY, vel, isCmp) {\r\n  var w = CFG.carW, h = CFG.carH, th = CFG.carTopH, wr = CFG.wheelR;\r\n  var dir = vel >= 0 ? 1 : -1;\r\n  var bc = isCmp ? CFG.col.cmp : CFG.col.car;\r\n  var dk = isCmp ? '#5c1380' : CFG.col.carDk;\r\n  ctx.save();\r\n  ctx.translate(px, trY - wr);\r\n  if (dir < 0) ctx.scale(-1, 1);\r\n\r\n  \/\/ Sombra\r\n  ctx.fillStyle = 'rgba(0,0,0,0.08)';\r\n  ctx.beginPath(); ctx.ellipse(0, wr + 3, w \/ 2 + 2, 4, 0, 0, Math.PI * 2); ctx.fill();\r\n  \/\/ Cuerpo\r\n  ctx.fillStyle = bc; rRect(ctx, -w\/2, -h, w, h, 5); ctx.fill();\r\n  \/\/ Techo\r\n  ctx.fillStyle = dk;\r\n  ctx.beginPath();\r\n  ctx.moveTo(-w\/2 + 8, -h); ctx.lineTo(-w\/2 + 14, -h - th);\r\n  ctx.lineTo(w\/2 - 10, -h - th); ctx.lineTo(w\/2 - 4, -h);\r\n  ctx.closePath(); ctx.fill();\r\n  \/\/ Ventana\r\n  ctx.fillStyle = isCmp ? '#f3e5f5' : CFG.col.win;\r\n  ctx.beginPath();\r\n  ctx.moveTo(-w\/2 + 11, -h - 1); ctx.lineTo(-w\/2 + 16, -h - th + 3);\r\n  ctx.lineTo(w\/2 - 12, -h - th + 3); ctx.lineTo(w\/2 - 7, -h - 1);\r\n  ctx.closePath(); ctx.fill();\r\n  \/\/ Luz trasera\r\n  ctx.fillStyle = '#fbbf24'; ctx.fillRect(w\/2 - 3, -h + 4, 3, 5);\r\n  \/\/ Ruedas\r\n  ctx.fillStyle = CFG.col.wheel;\r\n  ctx.beginPath(); ctx.arc(-w\/2 + 10, 0, wr, 0, Math.PI * 2); ctx.fill();\r\n  ctx.beginPath(); ctx.arc(w\/2 - 10, 0, wr, 0, Math.PI * 2); ctx.fill();\r\n  \/\/ Hubcaps\r\n  ctx.fillStyle = CFG.col.hub;\r\n  ctx.beginPath(); ctx.arc(-w\/2 + 10, 0, wr * 0.4, 0, Math.PI * 2); ctx.fill();\r\n  ctx.beginPath(); ctx.arc(w\/2 - 10, 0, wr * 0.4, 0, Math.PI * 2); ctx.fill();\r\n\r\n  ctx.restore();\r\n}\r\n\r\n\/** Dibuja un vector flecha *\/\r\nfunction drawVec(c, sx, sy, len, col, lbl) {\r\n  if (Math.abs(len) < 1) return;\r\n  var cl = Math.sign(len) * Math.min(Math.abs(len), 120);\r\n  var ex = sx + cl;\r\n  var d = Math.sign(cl);\r\n  var hl = 8;\r\n  var font = getComputedStyle(document.body).fontFamily;\r\n  ctx.save();\r\n  ctx.strokeStyle = col; ctx.fillStyle = col;\r\n  ctx.lineWidth = 2.5; ctx.lineCap = 'round';\r\n  ctx.beginPath(); ctx.moveTo(sx, sy); ctx.lineTo(ex - d * hl, sy); ctx.stroke();\r\n  ctx.beginPath();\r\n  ctx.moveTo(ex, sy); ctx.lineTo(ex - d * hl, sy - 5); ctx.lineTo(ex - d * hl, sy + 5);\r\n  ctx.closePath(); ctx.fill();\r\n  ctx.font = 'bold 11px ' + font;\r\n  ctx.textAlign = 'center';\r\n  ctx.fillText(lbl, (sx + ex) \/ 2, sy - 9);\r\n  ctx.textAlign = 'start';\r\n  ctx.restore();\r\n}\r\n\r\n\/** Rect\u00e1ngulo redondeado *\/\r\nfunction rRect(c, x, y, w, h, r) {\r\n  r = Math.max(0, Math.min(r, Math.min(w, h) \/ 2));\r\n  c.beginPath();\r\n  c.moveTo(x + r, y); c.lineTo(x + w - r, y);\r\n  c.arcTo(x + w, y, x + w, y + r, r);\r\n  c.lineTo(x + w, y + h - r); c.arcTo(x + w, y + h, x + w - r, y + h, r);\r\n  c.lineTo(x + r, y + h); c.arcTo(x, y + h, x, y + h - r, r);\r\n  c.lineTo(x, y + r); c.arcTo(x, y, x + r, y, r);\r\n  c.closePath();\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ CHART.JS \u2013 Gr\u00e1ficas x(t), v(t), a(t)\r\n\/\/ =====================================================================\r\n\r\n\/** Plugin: l\u00ednea vertical indicadora del tiempo actual *\/\r\nvar vLinePlugin = {\r\n  id: 'vLine',\r\n  afterDraw: function(chart) {\r\n    var xv = chart.options.plugins.vLineVal;\r\n    if (xv === undefined || xv === null) return;\r\n    var xs = chart.scales.x, ys = chart.scales.y;\r\n    var cx = xs.getPixelForValue(xv);\r\n    var cc = chart.ctx;\r\n    cc.save();\r\n    cc.strokeStyle = 'rgba(0,0,0,0.25)'; cc.lineWidth = 1; cc.setLineDash([4, 4]);\r\n    cc.beginPath(); cc.moveTo(cx, ys.top); cc.lineTo(cx, ys.bottom); cc.stroke();\r\n    \/\/ Punto en la curva\r\n    if (chart.data.datasets[0] && chart.data.datasets[0].data.length > 0) {\r\n      var data = chart.data.datasets[0].data;\r\n      var closest = data[0], md = Math.abs(data[0].x - xv);\r\n      for (var i = 1; i < data.length; i++) {\r\n        var d = Math.abs(data[i].x - xv);\r\n        if (d < md) { md = d; closest = data[i]; }\r\n      }\r\n      var yPx = ys.getPixelForValue(closest.y);\r\n      cc.setLineDash([]);\r\n      cc.fillStyle = chart.data.datasets[0].borderColor || '#333';\r\n      cc.beginPath(); cc.arc(cx, yPx, 5, 0, Math.PI * 2); cc.fill();\r\n      cc.strokeStyle = '#fff'; cc.lineWidth = 2; cc.stroke();\r\n    }\r\n    cc.restore();\r\n  }\r\n};\r\nChart.register(vLinePlugin);\r\n\r\n\/** Crea un gr\u00e1fico Chart.js *\/\r\nfunction makeChart(id, label, color, yLbl) {\r\n  return new Chart(document.getElementById(id).getContext('2d'), {\r\n    type: 'line',\r\n    data: {\r\n      datasets: [\r\n        {\r\n          label: label, data: [], borderColor: color,\r\n          backgroundColor: color + '18', fill: false,\r\n          pointRadius: 0, borderWidth: 2.5, tension: 0.1\r\n        },\r\n        {\r\n          label: 'Exp. A', data: [], borderColor: CFG.col.pos,\r\n          backgroundColor: 'transparent', borderDash: [6, 4],\r\n          pointRadius: 0, borderWidth: 1.8, tension: 0.1, hidden: true\r\n        },\r\n        {\r\n          label: 'Exp. B', data: [], borderColor: CFG.col.cmp,\r\n          backgroundColor: 'transparent', borderDash: [6, 4],\r\n          pointRadius: 0, borderWidth: 1.8, tension: 0.1, hidden: true\r\n        }\r\n      ]\r\n    },\r\n    options: {\r\n      responsive: true, maintainAspectRatio: false, animation: false,\r\n      interaction: { mode: 'nearest', axis: 'x', intersect: false },\r\n      onClick: function(evt, els, chart) {\r\n        var rect = chart.canvas.getBoundingClientRect();\r\n        var mx = evt.native.clientX - rect.left;\r\n        var tv = chart.scales.x.getValueForPixel(mx);\r\n        if (tv !== undefined && tv >= 0 && tv <= sim.tMax) {\r\n          setSimTime(tv); updateAll();\r\n        }\r\n      },\r\n      scales: {\r\n        x: {\r\n          type: 'linear',\r\n          title: { display: true, text: 't (s)', font: { size: 11, weight: '600' }, color: '#1a1a2e' },\r\n          min: 0, max: sim.tMax,\r\n          grid: { color: '#e5e7eb' },\r\n          ticks: { font: { size: 10, weight: '600' }, color: '#1a1a2e' }\r\n        },\r\n        y: {\r\n          title: { display: true, text: yLbl, font: { size: 11, weight: '600' }, color: '#1a1a2e' },\r\n          grid: { color: '#e5e7eb' },\r\n          ticks: { font: { size: 10, weight: '600' }, color: '#1a1a2e' }\r\n        }\r\n      },\r\n      plugins: {\r\n        legend: { display: false },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(0,0,0,0.8)',\r\n          titleFont: { size: 11 },\r\n          bodyFont: { size: 11, family: 'monospace' },\r\n          callbacks: {\r\n            title: function(items) { return 't = ' + fmt(items[0].parsed.x) + ' s'; },\r\n            label: function(item) { return item.dataset.label + ' = ' + fmt(item.parsed.y); }\r\n          }\r\n        }\r\n      },\r\n      vLineVal: 0\r\n    }\r\n  });\r\n}\r\n\r\nfunction initCharts() {\r\n  chartX = makeChart('chartX', 'x(t)', CFG.col.pos, 'x (m)');\r\n  chartV = makeChart('chartV', 'v(t)', CFG.col.vel, 'v (m\/s)');\r\n  chartA = makeChart('chartA', 'a(t)', CFG.col.acc, 'a (m\/s\u00b2)');\r\n  updateChartAxes();\r\n}\r\n\r\n\/** Actualiza los rangos de los ejes de los gr\u00e1ficos *\/\r\nfunction updateChartAxes() {\r\n  var xR = xRange(sim.x0, sim.v0, sim.a, sim.tMax);\r\n  var vR = vRange(sim.v0, sim.a, sim.tMax);\r\n  chartX.options.scales.x.max = sim.tMax;\r\n  chartX.options.scales.y.min = xR.min;\r\n  chartX.options.scales.y.max = xR.max;\r\n  chartV.options.scales.x.max = sim.tMax;\r\n  chartV.options.scales.y.min = vR.min;\r\n  chartV.options.scales.y.max = vR.max;\r\n  chartA.options.scales.x.max = sim.tMax;\r\n  chartA.options.scales.y.min = sim.a < 0 ? sim.a - 1 : -1;\r\n  chartA.options.scales.y.max = sim.a > 0 ? sim.a + 1 : 1;\r\n  if (sim.a === 0) { chartA.options.scales.y.min = -1; chartA.options.scales.y.max = 1; }\r\n  \/\/ Ajustar por comparaciones\r\n  if (cmp.a) {\r\n    var xRA = xRange(cmp.a.x0, cmp.a.v0, cmp.a.a, sim.tMax);\r\n    var vRA = vRange(cmp.a.v0, cmp.a.a, sim.tMax);\r\n    chartX.options.scales.y.min = Math.min(chartX.options.scales.y.min, xRA.min);\r\n    chartX.options.scales.y.max = Math.max(chartX.options.scales.y.max, xRA.max);\r\n    chartV.options.scales.y.min = Math.min(chartV.options.scales.y.min, vRA.min);\r\n    chartV.options.scales.y.max = Math.max(chartV.options.scales.y.max, vRA.max);\r\n  }\r\n  if (cmp.b) {\r\n    var xRB = xRange(cmp.b.x0, cmp.b.v0, cmp.b.a, sim.tMax);\r\n    var vRB = vRange(cmp.b.v0, cmp.b.a, sim.tMax);\r\n    chartX.options.scales.y.min = Math.min(chartX.options.scales.y.min, xRB.min);\r\n    chartX.options.scales.y.max = Math.max(chartX.options.scales.y.max, xRB.max);\r\n    chartV.options.scales.y.min = Math.min(chartV.options.scales.y.min, vRB.min);\r\n    chartV.options.scales.y.max = Math.max(chartV.options.scales.y.max, vRB.max);\r\n  }\r\n}\r\n\r\n\/** Agrega un punto de datos a las gr\u00e1ficas *\/\r\nfunction addGP(t) {\r\n  if (t <= lastGT) return;\r\n  var x = calcX(t, sim.x0, sim.v0, sim.a);\r\n  var v = calcV(t, sim.v0, sim.a);\r\n  gData.t.push(t); gData.x.push(x); gData.v.push(v); gData.a.push(sim.a);\r\n  lastGT = t;\r\n  chartX.data.datasets[0].data.push({ x: t, y: x });\r\n  chartV.data.datasets[0].data.push({ x: t, y: v });\r\n  chartA.data.datasets[0].data.push({ x: t, y: sim.a });\r\n}\r\n\r\n\/** Reconstruye todos los datos de gr\u00e1fica hasta el tiempo actual *\/\r\nfunction rebuildGD() {\r\n  gData = { t: [], x: [], v: [], a: [] };\r\n  lastGT = -1;\r\n  chartX.data.datasets[0].data = [];\r\n  chartV.data.datasets[0].data = [];\r\n  chartA.data.datasets[0].data = [];\r\n  var t = 0;\r\n  while (t <= sim.t + 0.001) {\r\n    addGP(Math.min(t, sim.t));\r\n    t += CFG.dt;\r\n  }\r\n  if (sim.t > 0) addGP(sim.t);\r\n}\r\n\r\n\/** Actualiza las gr\u00e1ficas (sin animaci\u00f3n) *\/\r\nfunction updateCharts() {\r\n  chartX.options.plugins.vLineVal = sim.t;\r\n  chartV.options.plugins.vLineVal = sim.t;\r\n  chartA.options.plugins.vLineVal = sim.t;\r\n  updateCmpGraphs();\r\n  chartX.update('none');\r\n  chartV.update('none');\r\n  chartA.update('none');\r\n}\r\n\r\n\/** Actualiza las curvas de comparaci\u00f3n en los gr\u00e1ficos *\/\r\nfunction updateCmpGraphs() {\r\n  [['a', cmp.a, 1], ['b', cmp.b, 2]].forEach(function(pair) {\r\n    var key = pair[0], cfg = pair[1], di = pair[2];\r\n    var dsX = chartX.data.datasets[di];\r\n    var dsV = chartV.data.datasets[di];\r\n    var dsA = chartA.data.datasets[di];\r\n    if (cmp['show' + key.toUpperCase()] && cfg) {\r\n      dsX.data = []; dsV.data = []; dsA.data = [];\r\n      for (var t = 0; t <= sim.tMax; t += CFG.dt) {\r\n        dsX.data.push({ x: t, y: calcX(t, cfg.x0, cfg.v0, cfg.a) });\r\n        dsV.data.push({ x: t, y: calcV(t, cfg.v0, cfg.a) });\r\n        dsA.data.push({ x: t, y: cfg.a });\r\n      }\r\n      dsX.data.push({ x: sim.tMax, y: calcX(sim.tMax, cfg.x0, cfg.v0, cfg.a) });\r\n      dsV.data.push({ x: sim.tMax, y: calcV(sim.tMax, cfg.v0, cfg.a) });\r\n      dsA.data.push({ x: sim.tMax, y: cfg.a });\r\n      dsX.hidden = false; dsV.hidden = false; dsA.hidden = false;\r\n    } else {\r\n      dsX.data = []; dsV.data = []; dsA.data = [];\r\n      dsX.hidden = true; dsV.hidden = true; dsA.hidden = true;\r\n    }\r\n  });\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ INFORMACI\u00d3N EN PANTALLA\r\n\/\/ =====================================================================\r\n\r\nfunction updateInfo() {\r\n  var x = calcX(sim.t, sim.x0, sim.v0, sim.a);\r\n  var v = calcV(sim.t, sim.v0, sim.a);\r\n  var dx = x - sim.x0;\r\n\r\n  document.getElementById('time-display').textContent = 't = ' + fmt(sim.t) + ' s';\r\n  document.getElementById('info-t').textContent = fmt(sim.t) + ' s';\r\n  document.getElementById('info-x').textContent = fmt(x) + ' m';\r\n  document.getElementById('info-v').textContent = fmt(v) + ' m\/s';\r\n  document.getElementById('info-a').textContent = fmt(sim.a) + ' m\/s\u00b2';\r\n  document.getElementById('info-dx').textContent = fmt(dx) + ' m';\r\n\r\n  \/\/ Detecci\u00f3n de punto de retorno\r\n  var tStop = findStop(sim.v0, sim.a, sim.tMax);\r\n  var eb = document.getElementById('event-box');\r\n  var et = document.getElementById('event-title');\r\n  var ed = document.getElementById('event-detail');\r\n  if (tStop !== null && sim.t >= tStop - 0.1) {\r\n    var xS = calcX(tStop, sim.x0, sim.v0, sim.a);\r\n    eb.classList.add('visible');\r\n    et.textContent = sim.t >= tStop\r\n      ? '\\u25cf Cambio de sentido'\r\n      : '\\u25cf Acerc\u00e1ndose al punto de retorno';\r\n    ed.textContent = 'v = 0 en t = ' + fmt(tStop) + ' s, x = ' + fmt(xS) + ' m';\r\n  } else {\r\n    eb.classList.remove('visible');\r\n  }\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ ECUACIONES \u2013 HTML puro (compatible WordPress\/Elementor)\r\n\/\/ =====================================================================\r\n\r\n\/** Construye un t\u00e9rmino HTML con signo *\/\r\nfunction buildTerm(coeff, varHTML, isFirst) {\r\n  if (coeff === 0) return '';\r\n  var abs = Math.abs(coeff);\r\n  var s = isFirst ? (coeff < 0 ? '\u2212' : '') : (coeff > 0 ? ' + ' : ' \u2212 ');\r\n  return s + fmt(abs) + varHTML;\r\n}\r\n\r\n\/** Actualiza las ecuaciones del modelo matem\u00e1tico con HTML *\/\r\nfunction updateEquations() {\r\n  var x0 = sim.x0, v0 = sim.v0, a = sim.a;\r\n  var elX = document.getElementById('eq-x');\r\n  var elV = document.getElementById('eq-v');\r\n  var elA = document.getElementById('eq-a');\r\n\r\n  var halfA = 0.5 * a;\r\n\r\n  \/\/ --- x(t) = x\u2080 + v\u2080\u00b7t + \u00bd\u00b7a\u00b7t\u00b2 ---\r\n  var xHTML = '<span class=\"eq\">';\r\n  xHTML += '<span class=\"eq-var\">x<\/span>(<span class=\"eq-var\">t<\/span>) = ';\r\n  var first = true;\r\n  if (x0 !== 0) { xHTML += buildTerm(x0, '', true); first = false; }\r\n  if (v0 !== 0) { xHTML += buildTerm(v0, ' \u00b7 <span class=\"eq-var\">t<\/span>', first); first = false; }\r\n  if (a !== 0) { xHTML += buildTerm(halfA, ' \u00b7 <span class=\"eq-var\">t<\/span><span class=\"eq-sup\">2<\/span>', first); first = false; }\r\n  if (first) xHTML += '0';\r\n  xHTML += '<\/span> <span class=\"eq-unit\">[m]<\/span>';\r\n\r\n  \/\/ --- v(t) = v\u2080 + a\u00b7t ---\r\n  var vHTML = '<span class=\"eq\">';\r\n  vHTML += '<span class=\"eq-var\">v<\/span>(<span class=\"eq-var\">t<\/span>) = ';\r\n  first = true;\r\n   if (v0 !== 0 || a === 0) { vHTML += fmt(v0); first = false; }\r\n   if (a !== 0) { vHTML += buildTerm(a, ' \u00b7 <span class=\"eq-var\">t<\/span>', first); }\r\n  vHTML += '<\/span> <span class=\"eq-unit\">[m\/s]<\/span>';\r\n\r\n  \/\/ --- a(t) = a (constante) ---\r\n  var aHTML = '<span class=\"eq\">';\r\n  aHTML += '<span class=\"eq-var\">a<\/span>(<span class=\"eq-var\">t<\/span>) = ' + fmt(a);\r\n  aHTML += '<\/span> <span class=\"eq-unit\">[m\/s\u00b2]<\/span>';\r\n\r\n  elX.innerHTML = xHTML;\r\n  elV.innerHTML = vHTML;\r\n  elA.innerHTML = aHTML;\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ CONTROLES DE SIMULACI\u00d3N\r\n\/\/ =====================================================================\r\n\r\nfunction setSimTime(t) {\r\n  sim.t = Math.max(0, Math.min(t, sim.tMax));\r\n  if (sim.t >= sim.tMax) {\r\n    sim.t = sim.tMax;\r\n    sim.playing = false;\r\n    sim.finished = true;\r\n    updatePlayBtn();\r\n  }\r\n  rebuildGD();\r\n}\r\n\r\nfunction play() {\r\n  if (sim.finished) resetSim();\r\n  sim.playing = true;\r\n  sim.lastTs = null;\r\n  updatePlayBtn();\r\n}\r\n\r\nfunction pause() {\r\n  sim.playing = false;\r\n  updatePlayBtn();\r\n}\r\n\r\nfunction resetSim() {\r\n  sim.t = 0; sim.playing = false; sim.finished = false; sim.lastTs = null;\r\n  gData = { t: [], x: [], v: [], a: [] };\r\n  lastGT = -1;\r\n  chartX.data.datasets[0].data = [];\r\n  chartV.data.datasets[0].data = [];\r\n  chartA.data.datasets[0].data = [];\r\n  addGP(0);\r\n  updatePlayBtn();\r\n  updateAll();\r\n}\r\n\r\nfunction stepFwd() {\r\n  if (sim.finished) return;\r\n  pause();\r\n  setSimTime(sim.t + CFG.stepSize);\r\n  updateAll();\r\n}\r\n\r\nfunction updatePlayBtn() {}\r\n\r\n\/\/ =====================================================================\r\n\/\/ PAR\u00c1METROS \u2013 Sincronizaci\u00f3n slider \u2194 input\r\n\/\/ =====================================================================\r\n\r\nfunction syncP(iId, key, min, max) {\r\n  var inp = document.getElementById(iId);\r\n  var upd = function(v) {\r\n    v = parseFloat(v);\r\n    if (isNaN(v)) return;\r\n    v = Math.max(min, Math.min(max, v));\r\n    sim[key] = v;\r\n    inp.value = v;\r\n    onParamChange();\r\n  };\r\n  inp.addEventListener('change', function() { upd(inp.value); });\r\n  inp.addEventListener('keydown', function(e) { if (e.key === 'Enter') inp.blur(); });\r\n}\r\n\r\nfunction onParamChange() {\r\n  updateChartAxes();\r\n  updateEquations();\r\n  resetSim();\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ PRESETS\r\n\/\/ =====================================================================\r\n\r\nfunction loadPreset(n) {\r\n  var p = PRESETS[n];\r\n  if (!p) return;\r\n  sim.x0 = p.x0; sim.v0 = p.v0; sim.a = p.a; sim.tMax = p.tMax;\r\n  document.getElementById('input-x0').value = p.x0;\r\n  document.getElementById('input-v0').value = p.v0;\r\n  document.getElementById('input-a').value = p.a;\r\n  document.getElementById('input-tmax').value = p.tMax;\r\n  onParamChange();\r\n  showToast('Preset cargado: ' + n);\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ MODO EXPERIMENTO\r\n\/\/ =====================================================================\r\n\r\nfunction regData() {\r\n  var x = calcX(sim.t, sim.x0, sim.v0, sim.a);\r\n  var v = calcV(sim.t, sim.v0, sim.a);\r\n  expData.push({ t: sim.t, x: x, v: v, a: sim.a });\r\n  renderTbl();\r\n  showToast('Dato registrado en t = ' + fmt(sim.t) + ' s');\r\n}\r\n\r\nfunction delLast() {\r\n  if (!expData.length) return;\r\n  expData.pop();\r\n  renderTbl();\r\n}\r\n\r\nfunction clearData() {\r\n  expData = [];\r\n  renderTbl();\r\n}\r\n\r\nfunction renderTbl() {\r\n  var tb = document.getElementById('data-tbody');\r\n  var tbl = document.getElementById('data-table');\r\n  var em = document.getElementById('empty-msg');\r\n  if (!expData.length) {\r\n    tbl.style.display = 'none'; em.style.display = 'block'; tb.innerHTML = '';\r\n    return;\r\n  }\r\n  tbl.style.display = 'table'; em.style.display = 'none';\r\n  tb.innerHTML = expData.map(function(d) {\r\n    return '<tr><td>' + fmt(d.t) + '<\/td><td>' + fmt(d.x) + '<\/td><td>' + fmt(d.v) + '<\/td><td>' + fmt(d.a) + '<\/td><\/tr>';\r\n  }).join('');\r\n}\r\n\r\nfunction exportCSV() {\r\n  if (!expData.length) { showToast('No hay datos'); return; }\r\n  var csv = 't (s);x (m);v (m\/s);a (m\/s\u00b2)\\n';\r\n  expData.forEach(function(d) {\r\n    csv += fmt(d.t) + ';' + fmt(d.x) + ';' + fmt(d.v) + ';' + fmt(d.a) + '\\n';\r\n  });\r\n  var b = new Blob([csv], { type: 'text\/csv;charset=utf-8;' });\r\n  var u = URL.createObjectURL(b);\r\n  var a = document.createElement('a');\r\n  a.href = u; a.download = 'mrua_datos.csv'; a.click();\r\n  URL.revokeObjectURL(u);\r\n  showToast('CSV exportado');\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ COMPARACI\u00d3N DE MOVIMIENTOS\r\n\/\/ =====================================================================\r\n\r\nfunction saveCmp(w) {\r\n  cmp[w] = { x0: sim.x0, v0: sim.v0, a: sim.a, tMax: sim.tMax };\r\n  cmp['show' + w.toUpperCase()] = true;\r\n  updateCmpDisplay();\r\n  updateChartAxes();\r\n  updateCharts();\r\n  showToast('Experimento ' + w.toUpperCase() + ' guardado');\r\n}\r\n\r\nfunction clearCmp() {\r\n  cmp = { a: null, b: null, showA: false, showB: false };\r\n  updateCmpDisplay();\r\n  updateChartAxes();\r\n  updateCharts();\r\n  showToast('Comparaci\u00f3n limpiada');\r\n}\r\n\r\nfunction updateCmpDisplay() {\r\n  var el = document.getElementById('cmp-display');\r\n  var h = '';\r\n  if (cmp.a) {\r\n    var c = cmp.a;\r\n    h += '<div style=\"font-size:0.76rem;margin-bottom:5px;padding:5px 8px;background:#e3f2fd;border-radius:4px;border-left:3px solid ' + CFG.col.pos + ';\"><b style=\"color:' + CFG.col.pos + ';\">Exp. A:<\/b> x\u2080=' + fmt(c.x0, 1) + ' m, v\u2080=' + fmt(c.v0, 1) + ' m\/s, a=' + fmt(c.a, 1) + ' m\/s\u00b2<\/div>';\r\n  }\r\n  if (cmp.b) {\r\n    var c = cmp.b;\r\n    h += '<div style=\"font-size:0.76rem;padding:5px 8px;background:#f3e5f5;border-radius:4px;border-left:3px solid ' + CFG.col.cmp + ';\"><b style=\"color:' + CFG.col.cmp + ';\">Exp. B:<\/b> x\u2080=' + fmt(c.x0, 1) + ' m, v\u2080=' + fmt(c.v0, 1) + ' m\/s, a=' + fmt(c.a, 1) + ' m\/s\u00b2<\/div>';\r\n  }\r\n  if (!cmp.a && !cmp.b) {\r\n    h = '<span style=\"font-size:0.76rem;color:var(--text3);\">Sin experimentos guardados.<\/span>';\r\n  }\r\n  el.innerHTML = h;\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ ACTUALIZACI\u00d3N GENERAL Y LOOP DE ANIMACI\u00d3N\r\n\/\/ =====================================================================\r\n\r\nfunction updateAll() {\r\n  drawScene();\r\n  updateCharts();\r\n  updateInfo();\r\n}\r\n\r\nfunction animLoop(ts) {\r\n  if (sim.playing) {\r\n    if (sim.lastTs === null) sim.lastTs = ts;\r\n    var dt = (ts - sim.lastTs) \/ 1000;\r\n    sim.lastTs = ts;\r\n    sim.t += dt * sim.speed;\r\n    if (sim.t >= sim.tMax) {\r\n      sim.t = sim.tMax;\r\n      sim.playing = false;\r\n      sim.finished = true;\r\n      updatePlayBtn();\r\n    }\r\n    \/\/ Agregar puntos de gr\u00e1fica seg\u00fan avance\r\n    var np = Math.floor(sim.t \/ CFG.dt) + 1;\r\n    while (gData.t.length < np && lastGT < sim.t) {\r\n      var nt = lastGT + CFG.dt;\r\n      if (nt <= sim.t) addGP(nt);\r\n      else { addGP(sim.t); break; }\r\n    }\r\n  } else {\r\n    sim.lastTs = null;\r\n  }\r\n  updateAll();\r\n  requestAnimationFrame(animLoop);\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ EVENT LISTENERS\r\n\/\/ =====================================================================\r\n\r\nfunction initEvents() {\r\n  \/\/ Controles de simulaci\u00f3n\r\n  document.getElementById('btn-play').addEventListener('click', play);\r\n  document.getElementById('btn-pause').addEventListener('click', pause);\r\n  document.getElementById('btn-reset').addEventListener('click', resetSim);\r\n  document.getElementById('btn-step').addEventListener('click', stepFwd);\r\n\r\n  \/\/ Selector de velocidad\r\n  document.querySelectorAll('.speed-btn').forEach(function(b) {\r\n    b.addEventListener('click', function() {\r\n      document.querySelectorAll('.speed-btn').forEach(function(x) { x.classList.remove('active'); });\r\n      b.classList.add('active');\r\n      sim.speed = parseFloat(b.dataset.speed);\r\n    });\r\n  });\r\n\r\n  \/\/ Sincronizaci\u00f3n de par\u00e1metros\r\n  syncP('input-x0', 'x0', -50, 50);\r\n  syncP('input-v0', 'v0', -20, 20);\r\n  syncP('input-a', 'a', -10, 10);\r\n  syncP('input-tmax', 'tMax', 2, 30);\r\n\r\n  \/\/ Presets\r\n  document.querySelectorAll('.preset-btn').forEach(function(b) {\r\n    b.addEventListener('click', function() { loadPreset(b.dataset.preset); });\r\n  });\r\n\r\n  \/\/ Opciones de visualizaci\u00f3n\r\n  document.getElementById('chk-vel').addEventListener('change', function(e) { sim.showVel = e.target.checked; });\r\n  document.getElementById('chk-acc').addEventListener('change', function(e) { sim.showAcc = e.target.checked; });\r\n  document.getElementById('chk-trail').addEventListener('change', function(e) { sim.showTrail = e.target.checked; });\r\n\r\n  \/\/ Modo experimento\r\n  document.getElementById('btn-register').addEventListener('click', regData);\r\n  document.getElementById('btn-delete-last').addEventListener('click', delLast);\r\n  document.getElementById('btn-clear-data').addEventListener('click', clearData);\r\n  document.getElementById('btn-export-csv').addEventListener('click', exportCSV);\r\n\r\n  \/\/ Comparaci\u00f3n\r\n  document.getElementById('btn-save-a').addEventListener('click', function() { saveCmp('a'); });\r\n  document.getElementById('btn-save-b').addEventListener('click', function() { saveCmp('b'); });\r\n  document.getElementById('btn-clear-cmp').addEventListener('click', clearCmp);\r\n\r\n  \/\/ Overlay pedag\u00f3gico\r\n  var pedOverlay = document.getElementById('ped-overlay');\r\n  document.getElementById('ped-header').addEventListener('click', function() {\r\n    pedOverlay.classList.add('open');\r\n  });\r\n  document.getElementById('ped-close').addEventListener('click', function() {\r\n    pedOverlay.classList.remove('open');\r\n  });\r\n  pedOverlay.addEventListener('click', function(e) {\r\n    if (e.target === pedOverlay) pedOverlay.classList.remove('open');\r\n  });\r\n\r\n  \/\/ Atajos de teclado\r\n  document.addEventListener('keydown', function(e) {\r\n    if (e.target.tagName === 'INPUT') return;\r\n    if (e.code === 'Space') { e.preventDefault(); sim.playing ? pause() : play(); }\r\n    if (e.code === 'ArrowRight') { e.preventDefault(); stepFwd(); }\r\n    if (e.code === 'KeyR') { e.preventDefault(); resetSim(); }\r\n  });\r\n\r\n  \/\/ Resize\r\n  window.addEventListener('resize', function() { resizeCanvas(); updateAll(); });\r\n}\r\n\r\n\/\/ =====================================================================\r\n\/\/ INICIALIZACI\u00d3N\r\n\/\/ =====================================================================\r\n\r\nfunction init() {\r\n  initCanvas();\r\n  initCharts();\r\n  initEvents();\r\n  addGP(0);\r\n  updateEquations();\r\n  updateAll();\r\n  requestAnimationFrame(animLoop);\r\n}\r\n\r\nif (document.readyState === 'loading') {\r\n  document.addEventListener('DOMContentLoaded', init);\r\n} else {\r\n  init();\r\n}\r\n<\/script>\r\n\r\n\r\n<style>\r\n  .btn-guia {\r\n    position: fixed;\r\n    bottom: 24px;\r\n    left: 24px;\r\n    z-index: 999;\r\n    background: #3fb950;\r\n    color: #0d1117;\r\n    font-family: 'Space Grotesk', sans-serif;\r\n    font-size: 0.82rem;\r\n    font-weight: 700;\r\n    letter-spacing: 1px;\r\n    text-transform: uppercase;\r\n    padding: 10px 18px;\r\n    border-radius: 8px;\r\n    border: none;\r\n    cursor: pointer;\r\n    box-shadow: 0 4px 20px rgba(63,185,80,0.35);\r\n    transition: transform 0.2s, box-shadow 0.2s;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }\r\n  .btn-guia:hover {\r\n    transform: translateY(-2px);\r\n    box-shadow: 0 6px 24px rgba(63,185,80,0.5);\r\n  }\r\n  .btn-guia svg { width: 15px; height: 15px; flex-shrink: 0; }\r\n  .guia-panel {\r\n    position: fixed;\r\n    bottom: 72px;\r\n    left: 24px;\r\n    width: 400px;\r\n    max-height: 70vh;\r\n    z-index: 1000;\r\n    background: #ffffff;\r\n    border: 1px solid #d0d7de;\r\n    border-radius: 12px;\r\n    box-shadow: 0 16px 48px rgba(0,0,0,0.4);\r\n    display: none;\r\n    flex-direction: column;\r\n    overflow: hidden;\r\n    font-family: 'Space Grotesk', sans-serif;\r\n  }\r\n  .guia-panel.visible { display: flex; }\r\n  .guia-header {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 12px 16px;\r\n    border-bottom: 1px solid #d0d7de;\r\n    flex-shrink: 0;\r\n    background: #f6f8fa;\r\n  }\r\n  .guia-header-title {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    font-size: 0.85rem;\r\n    font-weight: 700;\r\n    color: #1f2328;\r\n  }\r\n  .guia-header-title svg { width: 15px; height: 15px; color: #3fb950; }\r\n  .guia-close {\r\n    background: none;\r\n    border: none;\r\n    color: #1a1a2e;\r\n    font-size: 1rem;\r\n    cursor: pointer;\r\n    padding: 2px 7px;\r\n    border-radius: 4px;\r\n    transition: color 0.2s, background 0.2s;\r\n    line-height: 1;\r\n  }\r\n  .guia-close:hover { color: #1f2328; background: rgba(0,0,0,0.06); }\r\n  .guia-body {\r\n    overflow-y: auto;\r\n    padding: 18px 18px 20px;\r\n    color: #1f2328;\r\n    font-size: 0.83rem;\r\n    line-height: 1.65;\r\n    background: #ffffff;\r\n  }\r\n  .guia-body::-webkit-scrollbar { width: 5px; }\r\n  .guia-body::-webkit-scrollbar-track { background: transparent; }\r\n  .guia-body::-webkit-scrollbar-thumb { background: #d0d7de; border-radius: 3px; }\r\n  .guia-section-title {\r\n    font-size: 1rem;\r\n    font-weight: 700;\r\n    color: #1f2328;\r\n    margin: 0 0 12px 0;\r\n    padding-bottom: 8px;\r\n    border-bottom: 1px solid #d0d7de;\r\n  }\r\n  .guia-block { margin-bottom: 14px; }\r\n  .guia-label {\r\n    font-size: 0.72rem;\r\n    text-transform: uppercase;\r\n    letter-spacing: 1px;\r\n    color: #1a1a2e;\r\n    margin-bottom: 4px;\r\n  }\r\n  .guia-text { color: #1f2328; }\r\n  .guia-formula {\r\n    background: #f6f8fa;\r\n    border: 1px solid #d0d7de;\r\n    border-radius: 6px;\r\n    padding: 10px 14px;\r\n    text-align: center;\r\n    font-family: 'JetBrains Mono', monospace;\r\n    font-size: 0.88rem;\r\n    color: #0550ae;\r\n    margin: 10px 0;\r\n  }\r\n  .guia-steps { list-style: none; margin: 0; padding: 0; counter-reset: steps; }\r\n  .guia-steps li {\r\n    counter-increment: steps;\r\n    display: flex;\r\n    gap: 10px;\r\n    margin-bottom: 8px;\r\n    align-items: flex-start;\r\n    color: #1f2328;\r\n  }\r\n  .guia-steps li::before {\r\n    content: counter(steps);\r\n    background: #dafbe1;\r\n    color: #1a7f37;\r\n    font-size: 0.72rem;\r\n    font-weight: 700;\r\n    width: 20px;\r\n    height: 20px;\r\n    border-radius: 50%;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    flex-shrink: 0;\r\n    margin-top: 1px;\r\n    border: 1px solid #1a7f37;\r\n  }\r\n  .guia-result {\r\n    background: #dafbe1;\r\n    border-left: 3px solid #1a7f37;\r\n    border-radius: 0 6px 6px 0;\r\n    padding: 10px 14px;\r\n    color: #1f2328;\r\n    font-size: 0.82rem;\r\n    margin-top: 10px;\r\n  }\r\n  .guia-params {\r\n    background: #f6f8fa;\r\n    border: 1px solid #d0d7de;\r\n    border-radius: 6px;\r\n    padding: 10px 14px;\r\n    font-size: 0.8rem;\r\n    color: #1f2328;\r\n  }\r\n  .guia-params span { color: #0550ae; font-family: 'JetBrains Mono', monospace; }\r\n  .var { font-family: 'JetBrains Mono', monospace; }\r\n  .var.pos { color: #cf222e; }\r\n  .var.neg { color: #0550ae; }\r\n  .var.neu { color: #7d4e00; }\r\n  .var.ok  { color: #1a7f37; }\r\n<\/style>\r\n\r\n<div class=\"guia-panel\" id=\"guiaPanel\">\r\n  <div class=\"guia-header\">\r\n    <div class=\"guia-header-title\">\r\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"\/><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"\/><\/svg>\r\n      Gu\u00eda de uso\r\n    <\/div>\r\n    <button class=\"guia-close\" onclick=\"toggleGuia()\">\u2715<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"guia-body\">\r\n\r\n    <!--\u2605 BORRAR DESDE AQUI \u2605-->\r\n\r\n<div style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\r\n    <h3 style=\"color: #0056b3;\">Laboratorio de Cinem\u00e1tica: Movimiento Rectil\u00edneo (MRU y MRUA)<\/h3>\r\n\r\n    <p><strong>Objetivo:<\/strong> Comparar y analizar las caracter\u00edsticas del Movimiento Rectil\u00edneo Uniforme (MRU) y el Movimiento Rectil\u00edneo Uniformemente Acelerado (MRUA), estudiando sus leyes horarias y la interpretaci\u00f3n gr\u00e1fica de sus variables cinem\u00e1ticas.<\/p>\r\n    \r\n    <p><strong>Descripci\u00f3n breve:<\/strong> Simulaci\u00f3n interactiva que permite estudiar el desplazamiento en una dimensi\u00f3n bajo condiciones de velocidad constante o aceleraci\u00f3n uniforme. Permite contrastar de forma simult\u00e1nea ambos tipos de movimiento y validar anal\u00edticamente c\u00f3mo la presencia o ausencia de aceleraci\u00f3n modifica las trayectorias temporales:<\/p>\r\n\r\n    <div style=\"text-align: center; margin: 20px 0; background: #f0f4f8; padding: 10px; border-radius: 5px;\">\r\n        <strong>MRU:<\/strong> \\( x(t) = x_0 + v \\cdot t \\) &nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp; <strong>MRUA:<\/strong> \\( x(t) = x_0 + v_0 t + \\frac{1}{2} a t^2 \\)\r\n    <\/div>\r\n\r\n    <p><strong>C\u00f3mo usar (pasos):<\/strong><\/p>\r\n    <ul style=\"margin-left: 20px;\">\r\n        <li>Seleccionar el modo de estudio (MRU o MRUA) o activar la simulaci\u00f3n comparativa de dos m\u00f3viles en paralelo.<\/li>\r\n        <li>Establecer los par\u00e1metros iniciales de posici\u00f3n (\\(x_0\\)), velocidad inicial (\\(v_0\\)) y aceleraci\u00f3n (\\(a\\)).<\/li>\r\n        <li>Iniciar el movimiento y observar el desplazamiento del m\u00f3vil junto con la generaci\u00f3n en tiempo real de los gr\u00e1ficos de posici\u00f3n, velocidad y aceleraci\u00f3n en funci\u00f3n del tiempo.<\/li>\r\n        <li>Utilizar el marcador o pausar la animaci\u00f3n en intervalos regulares para medir los tiempos transcurridos y registrar los datos experimentales.<\/li>\r\n        <li>Analizar las pendientes de las curvas obtenidas: la pendiente de \\(x(t)\\) representa la velocidad, mientras que la pendiente de \\(v(t)\\) indica la aceleraci\u00f3n.<\/li>\r\n    <\/ul>\r\n\r\n    <p><strong>Par\u00e1metros ajustables:<\/strong> Posici\u00f3n inicial (\\(m\\)), velocidad inicial (\\(m\/s\\)), aceleraci\u00f3n (\\(m\/s^2\\)), escala temporal y selecci\u00f3n del modo de simulaci\u00f3n.<\/p>\r\n\r\n    <p style=\"background-color: #f8f9fa; padding: 15px; border-left: 5px solid #0056b3;\">\r\n        <strong>Resultados esperados \/ observaciones:<\/strong> En el MRU, la velocidad permanece constante y la posici\u00f3n var\u00eda de forma lineal (recta). En el MRUA, la velocidad cambia de forma lineal y la posici\u00f3n sigue una trayectoria parab\u00f3lica. Se comprueba que el \u00e1rea bajo la curva del gr\u00e1fico de velocidad en funci\u00f3n del tiempo \\(v(t)\\) equivale exactamente al desplazamiento total del m\u00f3vil.\r\n    <\/p>\r\n<\/div>\r\n\r\n\r\n   <!--\u2605 BORRAR HASTA AQUI \u2605-->\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n<button class=\"btn-guia\" onclick=\"toggleGuia()\">\r\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"\/><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"\/><\/svg>\r\n  Gu\u00eda de uso\r\n<\/button>\r\n\r\n<script>\r\n  function toggleGuia() {\r\n    document.getElementById('guiaPanel').classList.toggle('visible');\r\n  }\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>FISAR_SIM \u2013 MRUA | FICA \u2013 UNSL FICA \u2013 Universidad Nacional de San Luis Cinem\u00e1tica. Movimiento Rectil\u00edneo MRU y MRUA Exploraci\u00f3n interactiva de la posici\u00f3n,&hellip;<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-8527","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>movimiento_MRU_MRUA - F\u00edsica 2<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"movimiento_MRU_MRUA - F\u00edsica 2\" \/>\n<meta property=\"og:description\" content=\"FISAR_SIM \u2013 MRUA | FICA \u2013 UNSL FICA \u2013 Universidad Nacional de San Luis Cinem\u00e1tica. Movimiento Rectil\u00edneo MRU y MRUA Exploraci\u00f3n interactiva de la posici\u00f3n,&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/\" \/>\n<meta property=\"og:site_name\" content=\"F\u00edsica 2\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-21T13:06:52+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/index.php\\\/movimiento_mru_mrua\\\/\",\"url\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/index.php\\\/movimiento_mru_mrua\\\/\",\"name\":\"movimiento_MRU_MRUA - F\u00edsica 2\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#website\"},\"datePublished\":\"2026-08-11T20:55:52+00:00\",\"dateModified\":\"2026-08-21T13:06:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/index.php\\\/movimiento_mru_mrua\\\/#breadcrumb\"},\"inLanguage\":\"es-AR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/index.php\\\/movimiento_mru_mrua\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/index.php\\\/movimiento_mru_mrua\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"movimiento_MRU_MRUA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#website\",\"url\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/\",\"name\":\"F\u00edsica 2\",\"description\":\"FICA - UNSL\",\"publisher\":{\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es-AR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#organization\",\"name\":\"SAC- Secretar\u00eda General FICA\",\"url\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-AR\",\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/SG-Logo.png\",\"contentUrl\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/SG-Logo.png\",\"width\":4483,\"height\":1231,\"caption\":\"SAC- Secretar\u00eda General FICA\"},\"image\":{\"@id\":\"https:\\\/\\\/fisica2.fica.unsl.edu.ar\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"movimiento_MRU_MRUA - F\u00edsica 2","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/","og_locale":"es_ES","og_type":"article","og_title":"movimiento_MRU_MRUA - F\u00edsica 2","og_description":"FISAR_SIM \u2013 MRUA | FICA \u2013 UNSL FICA \u2013 Universidad Nacional de San Luis Cinem\u00e1tica. Movimiento Rectil\u00edneo MRU y MRUA Exploraci\u00f3n interactiva de la posici\u00f3n,&hellip;","og_url":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/","og_site_name":"F\u00edsica 2","article_modified_time":"2026-08-21T13:06:52+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/","url":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/","name":"movimiento_MRU_MRUA - F\u00edsica 2","isPartOf":{"@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#website"},"datePublished":"2026-08-11T20:55:52+00:00","dateModified":"2026-08-21T13:06:52+00:00","breadcrumb":{"@id":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/#breadcrumb"},"inLanguage":"es-AR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/movimiento_mru_mrua\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https:\/\/fisica2.fica.unsl.edu.ar\/"},{"@type":"ListItem","position":2,"name":"movimiento_MRU_MRUA"}]},{"@type":"WebSite","@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#website","url":"https:\/\/fisica2.fica.unsl.edu.ar\/","name":"F\u00edsica 2","description":"FICA - UNSL","publisher":{"@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fisica2.fica.unsl.edu.ar\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-AR"},{"@type":"Organization","@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#organization","name":"SAC- Secretar\u00eda General FICA","url":"https:\/\/fisica2.fica.unsl.edu.ar\/","logo":{"@type":"ImageObject","inLanguage":"es-AR","@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#\/schema\/logo\/image\/","url":"https:\/\/fisica2.fica.unsl.edu.ar\/wp-content\/uploads\/2021\/11\/SG-Logo.png","contentUrl":"https:\/\/fisica2.fica.unsl.edu.ar\/wp-content\/uploads\/2021\/11\/SG-Logo.png","width":4483,"height":1231,"caption":"SAC- Secretar\u00eda General FICA"},"image":{"@id":"https:\/\/fisica2.fica.unsl.edu.ar\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/pages\/8527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/comments?post=8527"}],"version-history":[{"count":46,"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/pages\/8527\/revisions"}],"predecessor-version":[{"id":8747,"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/pages\/8527\/revisions\/8747"}],"wp:attachment":[{"href":"https:\/\/fisica2.fica.unsl.edu.ar\/index.php\/wp-json\/wp\/v2\/media?parent=8527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}