|
Teoria jest prosta : figury Chladniego to takie punkty D, dla których zachodzi równość:
sin(ax)sin(by)cos(β)+sin(bx)sin(ay)sin(β)=0
|
W ogólnym przypadku jednak nie ma matematycznych metod wyznaczania punktów (x,y) : F(x,y)=0.
Musimy coś zauważyć.
Odpowiedź na pytanie jak narysować? znajdziemy w naszym aplecie wybierając opcję "nierówność".
Okazuje się, że figura Chladniego to zbiór punktów leżących na granicy obszarów dla których, wędrując po kwadratowej płycie liniami poziomymi (lub pionowymi) stwierdzamy zmianę znaku funkcji F(x,y).
Stosując np "algorytm siłowy" tzn przeglądając dokładnie całą płytę badamy czy następuje zmiana znaku "pionowo" lub "poziomo".
void rysuj()
{ double x,y,wl,wp;
for(x=x_min;x<x_max;x+=dx)
for(y=y_min;y<y_max;y+=dy)
{
wl=f(x-p,y)*f(x+p,y);
wp=f(x,y-p)*f(x,y+p)
if(wl<0 || wp<0) punkt(x,y);
}
}
|
Zobacz jak figurę Chladniego rysuje program DERIVE
W doświadczeniach fizycznych uzyskuje się linie węzłowe fali pogrubione i nieraz nieregularne. Uzyskamy ten efekt prostą metodą ! Punkt (x,y) należy do linii węzłowej jesli stwierdzimy np, że |f(x,y)|<0.1.
W nowej wersji rozwiązanie przedstawia się następująco:
double f(pkt2d p)
{ double f1,f2;
f1= Math.sin(a*p.x)*Math.sin(b*p.y)*ca;
f2= Math.sin(b*p.x)*Math.sin(a*p.y)*sa;
return(f1 + f2);
}
//---------------------------------------------
void rysujCH(Graphics g)
{ pkt2d p=new pkt2d(0,0);
sa=Math.sin(alfa);ca=Math.cos(alfa);
for(p.x=x_min;p.x<x_max;p.x+=dx)
for(p.y=y_min;p.y<y_max;p.y+=dy)
if(Math.abs(f(p))<0.1)
{
g.setColor(Color.blue);
lo28.punkt(g,p); // ( * )
}
}
|
Polecenie (*) rysowania punktu powinno się zastąpić lo28.punkt(g,lo28.p2d(kx*(p.x-s.x),ky*(p.y-s.y))); tak by omawiany obszar płyty powiększyć do rozmiarów apletu. Szczegóły takiego skalowania na stronie o programowaniu grafiki R2.
procedura skalująca w tym przypadku powinna wyglądać tak:
void skaluj( )
{
x_min=0;x_max=Math.PI;
y_min=0;y_max=Math.PI;
dl=Math.PI;
sz=Math.PI;
s.war(Math.PI/2,Math.PI/2);
kx=2.0*lo28.max_x( )/dl;
ky=2.0*lo28.max_x( )/sz;
dx=dl/(2.1*lo28.sx);
dy=sz/(2.1*lo28.sx);
}
|
Jak narysować "wersję kolorową" również znaleźć można w tym artykule ( wykres nierówności).
|