import React, { useState } from 'react'; const SystemVisualizerWidget: React.FC = () => { // Line 1: y = m1x + b1 const [m1, setM1] = useState(1); const [b1, setB1] = useState(2); // Line 2: y = m2x + b2 const [m2, setM2] = useState(-1); const [b2, setB2] = useState(6); // Visualization params const range = 10; const scale = 20; const size = 300; const center = size / 2; const toPx = (v: number, isY = false) => { return isY ? center - v * scale : center + v * scale; }; // Logic let intersectX = 0; let intersectY = 0; let solutionType = 'one'; // 'one', 'none', 'inf' if (m1 === m2) { if (b1 === b2) solutionType = 'inf'; else solutionType = 'none'; } else { intersectX = (b2 - b1) / (m1 - m2); intersectY = m1 * intersectX + b1; } const getLinePath = (m: number, b: number) => { 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)}`; }; return (
{/* Line 1 */}
Line 1: y = {m1}x + {b1}
setM1(parseFloat(e.target.value))} className="w-full h-1 bg-indigo-200 rounded accent-indigo-600"/> setB1(parseFloat(e.target.value))} className="w-full h-1 bg-indigo-200 rounded accent-indigo-600"/>
{/* Line 2 */}
Line 2: y = {m2}x + {b2}
setM2(parseFloat(e.target.value))} className="w-full h-1 bg-rose-200 rounded accent-rose-600"/> setB2(parseFloat(e.target.value))} className="w-full h-1 bg-rose-200 rounded accent-rose-600"/>
{/* Result */}
{solutionType === 'one' && `Intersection: (${intersectX.toFixed(1)}, ${intersectY.toFixed(1)})`} {solutionType === 'none' && "No Solution (Parallel Lines)"} {solutionType === 'inf' && "Infinite Solutions (Same Line)"}
{solutionType === 'one' && ( )}
); }; export default SystemVisualizerWidget;