| name | Implement Dynamic Tape Diagram |
| description | Create interactive tape diagram builders using p5.js where students construct algebraic equations by dragging and resizing parts. |
Implement Dynamic Tape Diagram
Use this skill when creating animations where students:
- Build tape diagrams by dragging variables (x) and constants into a bar
- Resize constants before adding them to the diagram
- See proportional relationships when setting a total value
- Visualize algebraic equations as bar models
When to Use This Pattern
Perfect for:
- "Build a tape diagram for x + 8 = 32"
- Interactive equation builders with visual models
- Exploring how changing parts affects the whole
- Understanding proportional relationships in algebra
- Visualizing variable vs. constant relationships
Not suitable for:
- Static tape diagrams (use basic p5 animation)
- Comparing multiple equations side-by-side
- Multi-step equation solving sequences (use phase-based animation)
Technology Stack
Uses p5.js for the interactive tape diagram because:
- Real-time drag-and-drop interaction
- Dynamic resizing of visual elements
- Mouse and touch event handling
- Smooth proportional animations
Configuration Options
Basic Configuration
// ==========================================
// CONFIGURATION - Easily modifiable
// ==========================================
// Palette items (draggable sources)
let paletteConfig = {
variable: {
x: 80,
y: 100,
w: 60,
h: 60,
color: [230, 57, 70], // Red for variables
label: 'x'
},
constant: {
x: 200,
y: 100,
w: 100, // Initial width (resizable)
h: 60,
minWidth: 40, // Minimum size
maxWidth: 300, // Maximum size
initialValue: 1,
maxValue: 20,
color: [6, 167, 125], // Green for constants
}
};
// Tape diagram drop zone
let tapeConfig = {
x: 50,
y: 320,
w: 500,
h: 100,
backgroundColor: [240, 240, 240],
borderColor: [150, 150, 150],
label: 'Drop parts here'
};
// Total value settings
let totalConfig = {
initial: 0, // Starting total value
min: 0,
max: 1000,
step: 1,
showProportions: true // Show calculated values when total is set
};
// Visual settings
let visualConfig = {
showEquation: true, // Display equation text
showInstructions: true, // Show helper text
animateTransitions: true, // Smooth width changes
highlightDropZone: true // Highlight when dragging
};
Features
Interactive Controls
Drag Variable (x)
- Drag from palette to drop zone
- Each x represents 1 unit
- Always distributes evenly in the diagram
Resize and Drag Constants
- Drag edges to resize the constant bar
- Shows current value as you resize
- Drag to drop zone when ready
- Each whole number proportionally sized
Total Value Input
- Click +/- buttons to adjust total
- When set, all parts resize proportionally
- Shows calculated values for each part
Part Management
- Click parts to select/deselect
- Click X button to remove parts
- Parts automatically distribute space
Visual Elements
- Palette area with draggable variable and constant
- Resize handles on constant bar (left and right edges)
- Drop zone with visual feedback
- Proportional tape bars showing equation parts
- Equation display showing current expression
- Calculated values when total is set
Common Patterns
Pattern 1: Simple Equation (x + 5 = 20)
let paletteConfig = {
variable: {
x: 80, y: 80, w: 60, h: 60,
color: [230, 57, 70],
label: 'x'
},
constant: {
x: 200, y: 80, w: 100, h: 60,
minWidth: 40, maxWidth: 200,
initialValue: 5, maxValue: 20,
color: [6, 167, 125]
}
};
let totalConfig = {
initial: 20,
min: 0,
max: 100,
step: 1,
showProportions: true
};
Pattern 2: Multiple Variables (2x + 10)
// Enable adding multiple x's
let paletteConfig = {
variable: {
x: 80, y: 80, w: 60, h: 60,
color: [230, 57, 70],
label: 'x',
allowMultiple: true // Can add multiple x's
},
constant: {
x: 200, y: 80, w: 100, h: 60,
minWidth: 40, maxWidth: 300,
initialValue: 1, maxValue: 30,
color: [6, 167, 125]
}
};
Pattern 3: Fraction Tape Diagrams
let paletteConfig = {
constant: {
x: 200, y: 80, w: 100, h: 60,
minWidth: 20, maxWidth: 400,
initialValue: 1,
maxValue: 12, // For showing 1/12, 2/12, etc.
color: [255, 153, 51], // Orange
showAsFraction: true // Display as fraction of whole
}
};
let totalConfig = {
initial: 1, // Whole = 1
min: 0,
max: 1,
step: 0,
showProportions: true
};
Mouse Interactions
Dragging from Palette
- Mouse down on variable or constant → start drag
- Move mouse → item follows cursor
- Release over drop zone → add to tape
- Release elsewhere → return to palette
Resizing Constant
- Mouse near left/right edge → show resize cursor
- Mouse down on edge → start resize
- Drag left/right → change width (snaps to whole numbers)
- Release → set new value
Managing Tape Parts
- Click on part → select (highlight)
- Click X button → remove part
- Parts automatically redistribute space
Drawing Logic
Proportional Sizing
When total value is set:
- Calculate total units: sum all part values (x=1, constant=its value)
- Calculate unit value: totalValue / totalUnits
- Each part width = (partValue / totalUnits) * tapeWidth
- Show actual values: partValue * unitValue
Drop Zone Feedback
- Hovering while dragging → highlight border
- Invalid drop → shake animation or visual feedback
- Valid drop → smooth transition into place
Code Structure
// State management
let tapeParts = []; // Parts in the main diagram
let isDragging = false; // Current drag state
let dragItem = null; // What's being dragged
let totalValue = 0; // Current total
function setup() {
createCanvas(600, 600);
textFont('Arial');
}
function draw() {
background(255);
drawPalette(); // Draggable sources
drawTotalInput(); // +/- controls
drawEquationDisplay(); // Show equation text
drawTapeDiagram(); // Main visualization
drawInstructions(); // Helper text
if (isDragging) {
drawDraggedItem(); // Follow cursor
}
}
function mousePressed() {
checkPaletteClick();
checkResizeHandles();
checkTotalButtons();
checkPartSelection();
}
function mouseDragged() {
updateDragPosition();
updateResizeWidth();
}
function mouseReleased() {
checkDropZone();
releaseDragItem();
}
Implementation Checklist
- Create palette area with variable and constant
- Implement drag from palette to drop zone
- Add resize handles to constant bar
- Show current value when resizing
- Implement drop zone with visual feedback
- Create tape parts array to store dropped items
- Calculate proportional widths based on values
- Implement total value +/- controls
- Show calculated actual values when total is set
- Add part selection (click to select)
- Add part removal (X button)
- Display equation as text
- Add helper instructions
- Test all mouse interactions
- Verify proportional sizing is correct
Tips and Best Practices
Proportional Calculations
- Always calculate total units first
- Handle zero cases (no total set, or totalUnits = 0)
- Use consistent rounding for display values
Visual Feedback
- Show resize cursor when near edges
- Highlight drop zone when dragging
- Animate width changes smoothly
- Use distinct colors for variable vs constant
User Experience
- Snap resize to whole numbers (easier to control)
- Provide clear instructions
- Show equation dynamically as parts are added
- Allow removing parts easily
Related Patterns
- Auto/Manual Toggle Pattern - For multi-phase solving
- Dynamic Graph - For coordinate plane interactions
- Color Palette - Standard colors to use
Examples
See snippets/dynamic-tape-diagram.ts for complete working code.
Common use cases in src/app/animations/examples/tapeDiagrams/:
- Simple equation builder (x + 5 = 20)
- Multi-variable builder (2x + 3)
- Fraction tape diagrams (showing parts of a whole)
Last Updated: November 2024 Maintained By: AI Coaching Platform Team