Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin





* * * * * 1 głosów

Jak opisać serce?

Napisane przez Ereinion, 28 June 2010 · 29481 wyświetleń

Inne
Wiele osób myśli zapewne, że święto zakochanych, czyli tak zwane Walentynki, odbywają się 14. lutego. Osoby te mają rację, bo tak faktycznie jest. W związku z tym zupełnie nie wiem dlaczego znak tego święta - symbol serca, pojawił się w moich rozważaniach już, a może dopiero, pod koniec czerwca. Tak czy inaczej postanowiłem zastanowić się jak w miarę dokładnie można opisać równaniami znany wszystkim kształt serca.

Wikipedia pod koniec >>>tego<<< artykułu rzecze tak: "Krzywą przypominającą swym kształtem serce, zwaną kardioidą przedstawia równanie (x^2 + y^2-1)^3 = x^2y^3 lub, we współrzędnych biegunowych, r = 1-\sin(\theta)."

Wpisujemy jedno z powyższych równań do programu rysującego wykresy i naszym oczom ukazuje się coś takiego:

Załączona grafika

Niby jest serce, ale jednak odczułem pewien niedosyt i postanowiłem samodzielnie stworzyć nieco inny kształt.

Pierwsze próby przyniosły coś takiego:

Załączona grafika

Część nad osią OX tworzą dwa półokręgi, a dolna część to po prostu dwa odcinki. Taką krzywą dostaniemy rysując w jednym układzie wykresy funkcji

f(x)=\sqrt{1-(|x|-1)^2} oraz g(x)=\frac{3}{2}  \cdot |x|-3 dla x \in \(-2;\, 2).

Widać już w jakim kierunku poszedłem, ale efekt wciąż nie jest zadowalający. Szczególnie przeszkadzały mi "kanty" w x=2 oraz x=-2.

Jak to wyeliminować? Ano można by wziąć trochę większe części okręgów niż tylko połowy i "przejść" do odcinków w takich punktach, aby nie powstały "kanty".

Ze względu na symetrię zajmiemy się znalezieniem takiego "punktu łagodnego przejścia" tylko w prawej połowie serca (czyli dla x-ów dodatnich).

Żeby znaleźć taki punkt musimy sobie najpierw ustalić współrzędne dolnego wierzchołka serca. Na poprzednim wykresie jest to punkt (0, \, -3).

Rozważmy ogólniejszą sytuację, mianowicie punkt W=(0, \, c), gdzie c jest ujemne (żeby dolny wierzchołek nie był wyżej od górnego, który ma współrzędne (0, \, 0) ).

Dodatkowo niech okręgi, których części będą tworzyć nasze serce mają środki w punktach (-1, \, 0) oraz (1, \, 0) i promienie równe 1. Niech nasz "punkt łagodnego przejścia", którego szukamy to będzie P=(x_1, \, y_1).

Punkt P należy do okręgu o równaniu (x-1)^2 + y^2=1 oraz do odcinka PW leżącego na prostej o równaniu (y-c)(x_1 - 0)=(y_1 - c)(x-x_1), które można zapisać w tradycyjnej postaci jako y=\(\frac{y_1 -c}{x_1}\) \cdot x+c.

Cała sztuczka polega teraz na zauważeniu, że "kantu" nie będzie wtedy, gdy styczna do okręgu w punkcie P pokrywać się będzie z prostą przechodzącą przez P i W.

Równanie stycznej do naszego okręgu w punkcie P to: (x_1 -1)(x-1)+y_1 \cdot y=1, co zapisane w wygodniejszej postaci wygląda tak: y=\(\frac{1-x_1}{y_1}\) \cdot x +\frac{x_1}{y_1}.

Skoro wspomniane proste mają się pokrywać, to odpowiednie współczynniki w ich równaniach muszą być równe. Stąd układ równań

\{ \frac{y_1 -c}{x_1}=\frac{1-x_1}{y_1} \\ c=\frac{x_1}{y_1}

Z układu tego łatwo wyznaczamy

\{ x_1=\frac{2c^2}{1+c^2} \\ y_1=\frac{2c}{1+c^2}

Znaleźliśmy więc punkt P w zależności od c.

Teraz tylko kwestia jak powiedzieć programowi, żeby nam przy danym c narysował fragment okręgu od punkt (0, \, 0) do P, a potem odcinek PW.

Tutaj chwilę musiałem pomyśleć, ale ostatecznie nasze serce (bez jednego punktu, co praktycznie nie wpływa na wykres) da się opisać jednym równaniem

\(\mbox{sgn}(\sqrt{x^2+(y-c)^2}+c)+1\) \cdot \((|x|-1)^2 +y^2-1\)+\(\mbox{sgn}(sqrt{x^2+(y-c)^2}+c)-1\) \cdot \(y+ \frac{c^2-1}{2c} \cdot |x| -c\)=0

Na pierwszy rzut oka nie wiadomo skąd ono się wzięło, ale pokrótce i niezbyt ściśle, to wygląda tak: te nawiasy z funkcją >signum< "sprawdzają" czy odległość danego punktu płaszczyzny od wierzchołka W jest mniejsza czy większa od |c| i w każdym z tych przypadków jeden z nawiasów "zeruje się" a drugi przyjmuje jakąś niezerową wartość.

Jak już nawiasy z funkcją signum "wykonają swoją robotę", to zostanie nam jeden nawias bez funkcji signum, mianowicie  \((|x|-1)^2 +y^2-1\) lub \(y+ \frac{c^2-1}{2c} \cdot |x| -c\). Zawartość pierwszego przypomina trochę równanie okręgu, a drugiego równanie prostej. Dodatkowo zastąpienie x przez |x| spowodowało odbicie wykresu względem osi OY.

Teraz już wszystko powinno się wyjaśnić Dołączona grafika

Pozostaje przypadek punktów dla których odległość od W jest równa c, ale że zaniedbanie przeze mnie tego przypadku nie okazało się w dalszej pracy zgubne w skutkach, to już się tym potem nie zajmowałem.

Teraz coś, co powinno trochę pomóc w zrozumieniu tego wpisu, mianowicie wykres tego groźnie wyglądającego równania dla c=-3

Załączona grafika

Jak widać, opłacało się trochę pomęczyć, bo efekt jest już zadowalający.

Ale oczywiście może być lepiej. Dobrze by było jakby nasze serce miało nieco bardziej opływowy kształt, szczególnie u dołu. Oznacza to zastąpienie odcinków jakimiś innymi, łagodnie "wygiętymi" krzywymi.

Najpierw kombinowałem z wykresem funkcji y=x^3 w okolicach punktu przegięcia, ale ostatecznie stwierdziłem, że lepszy efekt da fragment wykresu funkcji tangens.

Ze względu na skomplikowane obliczenia porzuciłem wszelkie analityczno-algebraiczne rozważania i po prostu metodą prób i błędów stworzyłem taki układ warunków

y=\sqrt{1-(|x|-1)^2} lub y=\tan(|x|-1)-1,7 \ \mbox{dla} \ x \in (-2, \, 2)

Zbiór punktów, których współrzędne spełniają powyższą alternatywę wygląda mniej więcej tak:

Załączona grafika

I na tym kształcie już poprzestałem Dołączona grafika

Jeśli ktoś znajdzie inny kształt serca lub ładniejsze równanie, które by go opisywało to zapraszam do podzielenia się swoimi wynikami.

  • 4



Nie no Ereinion przeszedłeś samego siebie :D Ja zaniemówiłem. Pełen szacunek dla Ciebie.
    • 1
Dzięki, bardzo mi miło i wiedząc, że komuś to się podoba, mam motywację do dalszej pracy :D
    • 0
podoba? to jest rewelacyjne :D
    • 0
bombowy wpis :D
    • 1
Ja też swego czasu szukałem krzywych które by przypominały "serduszka"Oto kod w Pascalu
{$N+}uses crt,graph;var c:byte;ch:char;type complex=recordre,im:double;end;function cbrt(x:real):real;var r,s:real;beginif x=0 then r:=1 elser:=abs(x);if s<0 then s:=-1;if s=0 then s:=0;if s>0 then s:=1;cbrt:=s*exp(ln(r)/3);end;function arccos(x:real):real;beginif x<0 thenarccos:=arctan(sqrt(1-sqr(x))/x)+pi;if x=0 thenarccos:=2*arctan(x+1);if x>0 thenarccos:=arctan(sqrt(1-sqr(x))/x);end;function pow(a:real;n:integer):real;var i:integer;x:real;beginx:=1;for i:=1 to abs(n) dox:=x*a;if n<0 then pow:=1/x elsepow:=x;end;procedure heart1;var x,y,z,r:real;i:longint;sciezka:string;Gd,Gm:Integer;c:word;beginwrite(&#39;Podaj r=&#39;);readln(r);write(&#39;Podaj c=&#39;);readln(c);Gd:=detect;sciezka:=&#39;C:\tp\bgi&#39;;initgraph(Gd,Gm,sciezka);for i:=-round(r*r) to round(r*r) dobeginx:=i/(r*r);y:=abs(x)-sqrt(1-sqr(x));z:=abs(x)+sqrt(1-sqr(x));putpixel(320-round(r*x),240-round(r*y),c);putpixel(320-round(r*x),240-round(r*z),c);end;repeat until keypressed;readln;closegraph;end;procedure heart2;var x,y,z,r:real;i:longint;sciezka:string;Gd,Gm:Integer;c:word;beginwrite(&#39;Podaj r=&#39;);readln(r);write(&#39;Podaj c=&#39;);readln(c);Gd:=detect;sciezka:=&#39;C:\tp\bgi&#39;;initgraph(Gd,Gm,sciezka);for i:=-round(r*r) to round(r*r) dobeginx:=i/(r*r);y:=sqrt(abs(x))-sqrt(1-sqr(x));z:=sqrt(abs(x))+sqrt(1-sqr(x));putpixel(320-round(r*x),240-round(r*y),c);putpixel(320-round(r*x),240-round(r*z),c);end;repeat until keypressed;readln;closegraph;end;procedure heart3;const max=720;var gm,gd:integer;i,p:longint;r,x:complex;color:word;beginwriteln(&#39;Podaj p i c &#39;);readln(p,color);gd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);for i:=-(max*p) to (max*p) dobeginr.im:=i/(max*p);r.re:=p*(1-abs(r.im))*(1+3*abs(r.im));x.re:=r.re*(sin(r.im));x.im:=r.re*(cos(r.im));putpixel(getmaxx div 2-round(x.re),getmaxy div 2-round(x.im-0.75*p),color);end;readln;closegraph;end;procedure heart4;const max=720;var gm,gd:integer;i,p:longint;r,x:complex;color:word;beginwriteln(&#39;Podaj p i c&#39;);readln(p,color);gd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);for i:=-(max*p) to (max*p) dobeginr.im:=i*pi/(max*p);r.re:=p*(abs(r.im))/pi;x.re:=r.re*(sin(r.im));x.im:=r.re*(cos(r.im));putpixel(getmaxx div 2-round(x.re),getmaxy div 2-round(x.im),color);end;readln;closegraph;end;procedure heart5;const max=720;var gm,gd:integer;i,p:longint;r,x:complex;color:word;begingd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);textcolor(14);writeln(&#39;Podaj p i c &#39;);readln(p,color);for i:=-(max*p) to (max*p) dobeginr.im:=i*pi/(max*p);r.re:=p*(1-cos(r.im/2));x.re:=r.re*(sin(r.im));x.im:=r.re*(cos(r.im));putpixel(getmaxx div 2-round(x.re),getmaxy div 2-round(x.im),color);end;readln;closegraph;end;procedure heart6;var x,y,z,r:double;i:longint;sciezka:string;Gd,Gm:Integer;c:word;beginwrite(&#39;Podaj r=&#39;);readln(r);write(&#39;Podaj c=&#39;);readln(c);Gd:=detect;sciezka:=&#39;C:\tp\bgi&#39;;initgraph(Gd,Gm,sciezka);for i:=-round(r*r) to round(r*r) dobeginx:=i/(r*r);y:=0.75*sqr(cbrt(x))+sqrt(1-sqr(x));z:=0.75*sqr(cbrt(x))-sqrt(1-sqr(x));putpixel(320-round(r*x),240-round(r*y),c);putpixel(320-round(r*x),240-round(r*z),c);end;repeat until keypressed;readln;closegraph;end;procedure heart7;const max=720;var gm,gd:integer;i,p:longint;x:complex;t,r:double;color:word;beginwriteln(&#39;Podaj p i c &#39;);readln(p,color);gd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);for i:=-(max*p) to (max*p) dobegint:=i/(max*p);if t=0 then r:=1 elser:=abs(t);x.re:=0.5*p*sin(2*t)*ln(r);x.im:=p*sqrt(abs(t))*cos(t);putpixel(getmaxx div 2-round(x.re),getmaxy div 2-round(x.im),color);end;readln;closegraph;end;procedure heart8;const max=720;var gm,gd:integer;i,p:longint;x:complex;t:double;color:word;beginwriteln(&#39;Podaj p i c &#39;);readln(p,color);gd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);for i:=-(max*p) to (max*p) dobegint:=6*i/(max*p);x.re:=p*((sqr(t)+abs(t)-6)/(sqr(t)+abs(t)+2))*2/3;x.im:=p*sqrt(36-sqr(t))*2/3;putpixel(getmaxx div 2-round(p*t),getmaxy div 2-round(x.re+x.im),color);putpixel(getmaxx div 2-round(p*t),getmaxy div 2-round(x.re-x.im),color);end;readln;closegraph;end;procedure heart9;var x,y,z,r:real;i:longint;sciezka:string;Gd,Gm:Integer;c:word;beginwrite(&#39;Podaj r=&#39;);readln(r);write(&#39;Podaj c=&#39;);readln(c);Gd:=detect;sciezka:=&#39;C:\tp\bgi&#39;;initgraph(Gd,Gm,sciezka);for i:=-round(r*r) to round(r*r) dobeginx:=2*i/(r*r);y:=sqrt(1-sqr(abs(x)-1));z:=arccos(1-abs(x))-pi;    {z:=-3*sqrt(1-sqrt(abs(x)/2))}putpixel(320-round(r*x),240-round(r*y),c);putpixel(320-round(r*x),240-round(r*z),c);end;repeat until keypressed;readln;closegraph;end;procedure heart10;const max=720;var gm,gd:integer;i,p:longint;r,x,y:complex;t:double;color:word;begingd:=detect;initgraph(gd,gm,&#39;c:\tp\bgi&#39;);if graphresult<>grok then halt(1);textcolor(14);writeln(&#39;Podaj p i c &#39;);readln(p,color);for i:=-2*(max*p) to -(max*p) dobegint:=i*pi/(2*max*p);r.re:=5*p*pow(sin(t),7)*exp(abs(2*t));r.im:=5*p*pow(sin(t+1.5*pi),7)*exp(abs(2*(t+1.5*pi)));x.re:=r.re*(cos(t));x.im:=r.re*(sin(t));y.re:=r.im*(cos(t+1.5*pi));y.im:=r.im*(sin(t+1.5*pi));putpixel(getmaxx div 2-round(x.re),getmaxy div 2-round(x.im),color);putpixel(getmaxx div 2-round(y.re),getmaxy div 2-round(y.im),color);end;readln;closegraph;end;beginclrscr;repeatwriteln(&#39;Podaj liczbe 1..10&#39;);readln(c);case c of1:heart1;2:heart2;3:heart3;4:heart4;5:heart5;6:heart6;7:heart7;8:heart8;9:heart9;10:heart10;end;ch:=readkey;until ch=#27;end.
Wiele osób myśli zapewne, że święto zakochanych, czyli tak zwane Walentynki, odbywają się 14. lutego.E tam walentynki 8 marca można potraktować jako dzień zakochanych No i mamy noc zakochanych - noc św Jana
    • 0
a ja kiedyś znalazłem przez przypadek coś takiego ;-)x^2+(-5y/4+sqrt(abs(x)))^2=1http://www.wolframalpha.com/input/?i=x^2%2B%28-5y%2F4%2Bsqrt%28abs%28x%29%29%29^2%3D1
    • 2
Właśnie dziś przeglądałem demotywatory i znalazłem takie coś: http://demotywatory..../Wlasne-dlategoPrzy okazji sprawdziłem jak Wolfram Alpha poradzi sobie z Twoim równaniem. Oczywiście wyszło pięknieDołączona grafika
    • 0
(x^2+(y-(((x)^(2)))^(1/4))^2)=1


http://www4a.wolfram...df=RangeControl
    • 0

Gratuluję! Znalazłeś się na Demotywatorach: http://demotywatory....ak-w-matematyce

    • 0

A jaka dyskusja :) pod demotem

    • 0

Ostatni odwiedzający

Ostatnie komentarze

Buttony