Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions src/components/content/InterfataCuadraturi.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import { esantioneaza, sparge } from "@/lib/plot-esantionare";
type Fila = "adaptiv" | "gauss";

const FILE: { id: Fila; eticheta: string }[] = [
{ id: "adaptiv", eticheta: "Cuadraturi adaptive" },
{ id: "adaptiv", eticheta: "Cuadraturi Adaptive" },
{ id: "gauss", eticheta: "Cuadraturi Gaussiene" },
];

Expand All @@ -68,12 +68,11 @@ const FUNCTIE_IMPLICITA: Record<Fila, string> = {
// Vârful ascuțit lângă zero și coada plată: exact cazul care cere panouri de
// lățimi diferite.
adaptiv: "oscilanta",
// Sinusul pe [0, π]. Cu patru noduri alese, formula greșește cu 1,6e-5; cu
// patru echidistante, cu 4,1e-2 — de două mii de ori mai mult, și se vede pe
// desen, fiindcă polinomul prin nodurile echidistante taie vizibil vârful.
// Pe funcția adaptivului, amândouă variantele greșesc grosolan și butoanele
// nu mai arată nimic.
gauss: "sinus",
// Radicalul pe [0, 1]. Tangenta verticală din zero e chiar cazul în care se
// vede de ce contează unde cad nodurile: cele echidistante trebuie să pună
// unul exact în capătul unde funcția urcă vertical, iar polinomul prin ele
// pleacă în jos înainte să urce. Cele alese stau înăuntru și nu ating capătul.
gauss: "radical",
};

/**
Expand Down
92 changes: 47 additions & 45 deletions src/components/content/InterfataDerivareNumerica.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -217,15 +217,20 @@ export function InterfataDerivareNumerica() {
</TabsList>
</Tabs>

{/* Graficul ia toată lățimea ramei, iar parametrii trec dedesubt, ca la
celelalte pagini de integrare. Într-o coloană laterală, desenul rămânea
îngust tocmai unde se compară două înclinări, iar panoul de alături îl
împingea din mijlocul ramei. */}
<div className="bg-suprafata border-bordura shadow-jos overflow-hidden rounded-xl border">
<div className="grid lg:grid-cols-[minmax(0,1fr)_clamp(300px,28%,400px)]">
<div className="flex min-w-0 flex-col gap-8 p-6 sm:p-8">
<div className="flex flex-col">
<div className="flex min-w-0 flex-col gap-8 p-4 sm:p-6">
<Plot
domeniuX={domeniuX}
domeniuY={domeniuY}
rezumat={`${formula.eticheta} pe ${functie.eticheta}`}
descriere={descrieDesenul(functie.eticheta, punct, h, aproximare, exact)}
inaltimeMaxima={380}
raport={2}
inaltimeMaxima={560}
>
<PlotCurba segmente={segmente} rol="functie" />

Expand Down Expand Up @@ -293,53 +298,48 @@ export function InterfataDerivareNumerica() {
setPas(PAS_IMPLICIT);
}}
incorporat
className="border-bordura min-w-0 border-t lg:border-t-0 lg:border-l"
className="border-bordura min-w-0 border-t"
>
{/* Dintr-o listă, nu dintr-un șir de butoane: butoanele se rupeau pe
trei rânduri și cereau citite toate ca să alegi unul. */}
<div className="grid gap-2 sm:col-span-2">
<label className="text-base font-medium" htmlFor="alegere-functie-derivare">
Funcția
</label>
<Select value={idFunctie} onValueChange={schimbaFunctia}>
<SelectTrigger
id="alegere-functie-derivare"
className="tinta-atingere w-full font-mono text-base"
>
<SelectValue />
</SelectTrigger>
<SelectContent>
{FUNCTII_DERIVARE.map((f) => (
<SelectItem key={f.id} value={f.id} className="font-mono">
f(x) = {f.eticheta}
</SelectItem>
))}
</SelectContent>
</Select>
<div className="grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
{/* Dintr-o listă, nu dintr-un șir de butoane: butoanele se rupeau
pe trei rânduri și cereau citite toate ca să alegi unul. */}
<div className="grid gap-2">
<label className="text-base font-medium" htmlFor="alegere-functie-derivare">
Funcția
</label>
<Select value={idFunctie} onValueChange={schimbaFunctia}>
<SelectTrigger
id="alegere-functie-derivare"
className="tinta-atingere w-full font-mono text-base"
>
<SelectValue />
</SelectTrigger>
<SelectContent>
{FUNCTII_DERIVARE.map((f) => (
<SelectItem key={f.id} value={f.id} className="font-mono">
<Notatie>{`f(x) = ${f.eticheta}`}</Notatie>
</SelectItem>
))}
</SelectContent>
</Select>
</div>

<NumberInput eticheta="x₀" valoare={x0} onChange={setX0} pas={0.1} />

<NumberInput
eticheta="Pasul h"
valoare={pas}
onChange={setPas}
min={PAS_MINIM}
max={PAS_MAXIM}
faraSageti
/>
</div>

<NumberInput
className="sm:col-span-2"
eticheta="x₀"
valoare={x0}
onChange={setX0}
pas={0.1}
/>

<NumberInput
className="sm:col-span-2"
eticheta="Pasul h"
valoare={pas}
onChange={setPas}
min={PAS_MINIM}
max={PAS_MAXIM}
faraSageti
/>

{/* Fiecare cifră în chenarul ei: într-o listă simplă, „exact" și
„aproximare" — două numere cu opt zecimale — se citeau ca un
singur bloc, tocmai unde diferența dintre ele e subiectul. */}
<dl className="grid gap-2 sm:col-span-2">
<dl className="grid gap-2 sm:grid-cols-2 lg:grid-cols-4">
{[
["h folosit acum", stiintific(h, 2)],
["f′(x₀) exact", zecimale(exact, 8)],
Expand All @@ -360,7 +360,9 @@ export function InterfataDerivareNumerica() {
))}
</dl>

<p className="text-text-slab text-base leading-relaxed">{functie.ceArata}</p>
<p className="text-text-slab max-w-prose text-base leading-relaxed">
{functie.ceArata}
</p>
</ControlPanel>
</div>
</div>
Expand Down
27 changes: 19 additions & 8 deletions src/components/content/InterfataEliminareGaussiana.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,11 @@ export function InterfataEliminareGaussiana() {
<div className="bg-suprafata border-bordura shadow-jos overflow-hidden rounded-xl border">
<div className="grid lg:grid-cols-[minmax(0,1fr)_clamp(300px,30%,400px)]">
<div className="flex min-w-0 flex-col items-center justify-center gap-6 overflow-x-auto p-5 sm:p-7">
<div className="flex items-start gap-4 sm:gap-6">
{/* `items-stretch`, nu `items-start`: coloana de scoruri își ia
înălțimea de la matrice, iar rândurile ei se împart în părți
egale — altfel scorul liniei a treia ajungea cu paisprezece
pixeli mai jos decât linia lui. */}
<div className="flex items-stretch gap-4 sm:gap-6">
<MatrixGrid
valori={pas?.matrice ?? matrice}
stari={stari}
Expand All @@ -162,7 +166,7 @@ export function InterfataEliminareGaussiana() {
etichetaColoane={(matrice[0] ?? []).map((_, j) =>
j < coeficienti ? `C${j + 1}` : "b",
)}
corp="mare"
corp="foarte-mare"
formateaza={cifra}
descriere={descriereMatricei(pas, rezultat.pasi.length, derulare.pas)}
/>
Expand Down Expand Up @@ -371,11 +375,18 @@ function ColoanaScoruri({
strategie === "partiala" ? "|aᵢₚ|" : strategie === "scalata" ? "|aᵢₚ| / sᵢ" : "max |aᵢⱼ|";

return (
<figure className="m-0 min-w-[5.5rem]">
<figcaption className="text-text-slab mb-2 text-center font-mono text-sm">
<figure className="m-0 flex min-w-[6.5rem] flex-col">
{/* Antetul ține exact înălțimea rândului de nume al matricei — 16 px de
rând plus `pb-0.5` —, ca boxurile de dedesubt să pornească de unde
pornesc liniile. Simbolul e mai mare, dar cu `leading-4`: crește
litera, nu rândul. */}
<figcaption className="text-text-slab mb-2 pb-0.5 text-center font-mono text-xl leading-4">
<Notatie>{antet}</Notatie>
</figcaption>
<ul className="m-0 grid list-none gap-1 p-0">
<ul
className="m-0 grid flex-1 list-none gap-2 p-0"
style={{ gridTemplateRows: `repeat(${linii}, minmax(0, 1fr))` }}
>
{Array.from({ length: linii }, (_, i) => {
const scor = alegere?.scoruri[i];
// Când toate scorurile sunt nule, nu există câștigător: linia „aleasă"
Expand All @@ -386,7 +397,7 @@ function ColoanaScoruri({
return (
<li
key={i}
className="border-bordura rounded-md border px-2 py-1.5 text-center font-mono text-base tabular-nums"
className="border-bordura flex flex-col items-center justify-center rounded-md border px-2 text-center font-mono text-lg tabular-nums"
style={{
color: gol ? undefined : culoareEticheta(castiga ? "pivot" : "anterior"),
borderColor: castiga ? culoareRol("pivot") : undefined,
Expand All @@ -400,8 +411,8 @@ function ColoanaScoruri({
<span
className={
alegere?.scalari?.[i] != null && !gol
? "text-text-slab block text-xs"
: "invisible block text-xs"
? "text-text-slab block text-[11px] leading-4"
: "invisible block text-[11px] leading-4"
}
aria-hidden={alegere?.scalari?.[i] == null || gol}
>
Expand Down
Loading