import React, { useState } from 'react'; const ParallelPerpendicularWidget: React.FC = () => { const [slope, setSlope] = useState(2); const [showParallel, setShowParallel] = useState(true); const [showPerpendicular, setShowPerpendicular] = useState(true); const range = 10; const scale = 20; // 20px per unit const size = 300; const center = size / 2; const toPx = (v: number, isY = false) => isY ? center - v * scale : center + v * scale; const getLinePath = (m: number, b: number) => { // Find two points on edges of view box (-range, +range) // y = mx + b // Need to clip lines to viewBox to be nice const x1 = -range; const y1 = m * x1 + b; const x2 = range; const y2 = m * x2 + b; return `M ${toPx(x1)} ${toPx(y1, true)} L ${toPx(x2)} ${toPx(y2, true)}`; }; const perpSlope = slope === 0 ? 1000 : -1 / slope; // Hack for vertical return (
setSlope(parseFloat(e.target.value))} className="flex-1 h-2 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-indigo-600" /> {slope}
Key Rule: Perpendicular slopes are negative reciprocals ($m$ vs $-1/m$). Their product is always -1.
{/* Axes */} {/* Reference Line (Indigo) */} {/* Parallel Line (Sky) - Shifted up by 3 units */} {showParallel && ( )} {/* Perpendicular Line (Rose) - Through Origin */} {showPerpendicular && ( <> {/* Right Angle Marker approx */} )}
); }; export default ParallelPerpendicularWidget;