Discussion:
zagadnienie odnośnie krzywej rury z geometrii 3D
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Simpler
2017-09-11 19:03:32 UTC
Permalink
Mamy zadaną krzywą w postaci:
x(t), y(t), z(t), znaczyć parametrycznie.

np. okrąg wygląda tak: x,y,z = cost, sint, 0;
albo jakaś tam spirala: cost, sint, 2t;
a nawet i prosta: t, 2t, t;


I teraz zadanie:
to są krzywe, czyli takie jakby cieniutkie rury, bo o grubości zerowej;
a należy podać równanie rury o jakiejś tam dowolnej grubości: r > 0,
która biegnie wzdłuż tej zadanej krzywej.

Przykładowo:

I. mając prostą ponową, czyli chyba cosik w stylu:
x,y,z = 0,0,t;

no i wtedy robim sobie z tego rurę pionową o promieniu r, co wygląda tak:
rcos(s), rsin(s), t

II. mając kółeczko: cost, sint, 0;
po przerobieniu na rurę otrzymamy torus, oczywista, czyli:
(1+r*cos(s))*cos(t), (1+r*cos(s))*sin(t), r*sin(s);
gdzie r = promień ruryl

Dla r = 0 wyjdzie zawsze ta krzywa wyjściowa, oczywista,
no bo to przecież jest rura o zerowej grubości..
J.F.
2017-09-12 12:26:28 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
Post by Simpler
x(t), y(t), z(t), znaczyć parametrycznie.
np. okrąg wygląda tak: x,y,z = cost, sint, 0;
albo jakaś tam spirala: cost, sint, 2t;
a nawet i prosta: t, 2t, t;
to są krzywe, czyli takie jakby cieniutkie rury, bo o grubości zerowej;
a należy podać równanie rury o jakiejś tam dowolnej grubości: r > 0,
która biegnie wzdłuż tej zadanej krzywej.
Rownanie koniecznie ? W jakim to celu ?

Pierwsze podejscie wydaje sie proste - krzywa ma wektor styczny w
kazdym punkcie, wyznaczyc okrag prostopadly do wektora to jest w miare
trywialne.
Gorzej, jak sie krzywa zacznie za bardzo wyginac.

J.
WM
2017-09-12 12:35:59 UTC
Permalink
Pierwsze podejscie wydaje sie proste - krzywa ma wektor styczny w kazdym
punkcie, wyznaczyc okrag prostopadly do wektora to jest w miare trywialne.
Gorzej, jak sie krzywa zacznie za bardzo wyginac.
Może się nawet nie wyginać, a lecieć po spirali, której zwoje są odległe
o mniej niż fi.
Wtedy powierzchnie będą na siebie nachodzić.


WM
Simpler
2017-09-12 15:03:05 UTC
Permalink
Post by J.F.
Post by Simpler
to są krzywe, czyli takie jakby cieniutkie rury, bo o grubości zerowej;
a należy podać równanie rury o jakiejś tam dowolnej grubości: r > 0,
która biegnie wzdłuż tej zadanej krzywej.
Rownanie koniecznie ? W jakim to celu ?
W celu narysowania tejże rury, oczywista.

Mając wzór powierzchni w stylu:
r(u,v) = x(v,t), y...

bardzo łatwo to narysować w opengl,
bo wystarczy sobie powyliczać punkty na siatkce m x n;

jakoś tak:

v[i,j] = r(u,v);
w podwójnej pętli po i i j, zwiększając parametry o du, dv...

A i wektory normalne potem łatwo z tego wycisnąć, np. tak:
n(i,j) = r(i,j) x r(i+1,j);
Post by J.F.
Pierwsze podejscie wydaje sie proste - krzywa ma wektor styczny w
kazdym punkcie, wyznaczyc okrag prostopadly do wektora to jest w miare
trywialne.
Gorzej, jak sie krzywa zacznie za bardzo wyginac.
No weźmy np. taką zabawną krzywą:
https://en.wikipedia.org/wiki/Trefoil_knot

r(t) = sint+2sin2t, cost-2cos2t, -sin3t

no i jakie będzie równanie dla rury o promieniu r,
która biegnie po tej krzywej:
r(s,t) = ?
J.F.
2017-09-12 16:10:02 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
dyskusyjnych:e0bbbe62-bbc8-475b-8ed9-***@googlegroups.com...
W dniu wtorek, 12 września 2017 14:26:30 UTC+2 użytkownik J.F.
Post by Simpler
Post by J.F.
Post by Simpler
to są krzywe, czyli takie jakby cieniutkie rury, bo o grubości zerowej;
a należy podać równanie rury o jakiejś tam dowolnej grubości: r > 0,
która biegnie wzdłuż tej zadanej krzywej.
Rownanie koniecznie ? W jakim to celu ?
W celu narysowania tejże rury, oczywista.
r(u,v) = x(v,t), y...
bardzo łatwo to narysować w opengl,
bo wystarczy sobie powyliczać punkty na siatkce m x n;
To tego niepotrzebne rownanie, wystarczy algorytm wyliczania siatki
:-)
Post by Simpler
v[i,j] = r(u,v);
w podwójnej pętli po i i j, zwiększając parametry o du, dv...
n(i,j) = r(i,j) x r(i+1,j);
Znow za szybko wyslales.

Wektory normalne do krawedzi ?
Do sciany siatki ? A nie jest sciana czworokatem ?
Post by Simpler
Post by J.F.
Pierwsze podejscie wydaje sie proste - krzywa ma wektor styczny w
kazdym punkcie, wyznaczyc okrag prostopadly do wektora to jest w miare
trywialne.
Gorzej, jak sie krzywa zacznie za bardzo wyginac.
https://en.wikipedia.org/wiki/Trefoil_knot
r(t) = sint+2sin2t, cost-2cos2t, -sin3t
no i jakie będzie równanie dla rury o promieniu r,
r(s,t) = ?
Ale powyzej dalem ci wskazowke jak zbudowac algorytm :-)

wstepnie nie widze problemu - powinien zadzialac.
Oczywiscie musisz rozwiac pare drobnych problemow.

J.
Simpler
2017-09-12 16:59:24 UTC
Permalink
Post by J.F.
Post by Simpler
r(u,v) = x(v,t), y...
bardzo łatwo to narysować w opengl,
bo wystarczy sobie powyliczać punkty na siatkce m x n;
To tego niepotrzebne rownanie, wystarczy algorytm wyliczania siatki
No, no... zatem wylicz mi siatkę dla krzywej: r(t) = x(t), y(t), z(t).
Post by J.F.
Post by Simpler
n(i,j) = r(i,j) x r(i+1,j);
Wektory normalne do krawedzi ?
Do sciany siatki ? A nie jest sciana czworokatem ?
pierdołami się przejmujesz...

n(i,j) = u x v, gdzie u i v wyliczamy z trójkąta,
czyli z trzech punktów, np. takich: r(i,j), r(i+1,j), r(i,j+1);
Post by J.F.
Post by Simpler
https://en.wikipedia.org/wiki/Trefoil_knot
r(t) = sint+2sin2t, cost-2cos2t, -sin3t
no i jakie będzie równanie dla rury o promieniu r,
r(s,t) = ?
Ale powyzej dalem ci wskazowke jak zbudowac algorytm :-)
niby jaki algorytm?
Ja chcę jawny wzór: r(s,t).
Post by J.F.
wstepnie nie widze problemu - powinien zadzialac.
Oczywiscie musisz rozwiac pare drobnych problemow.
No to dawaj tę powierzchnię dla tego knota:
r(s,t) = ?
J.F.
2017-09-12 17:34:50 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
dyskusyjnych:56b8f812-3651-4af4-9164-***@googlegroups.com...
W dniu wtorek, 12 września 2017 18:10:19 UTC+2 użytkownik J.F.
Post by Simpler
Post by J.F.
Post by Simpler
r(u,v) = x(v,t), y...
bardzo łatwo to narysować w opengl,
bo wystarczy sobie powyliczać punkty na siatkce m x n;
To tego niepotrzebne rownanie, wystarczy algorytm wyliczania siatki
No, no... zatem wylicz mi siatkę dla krzywej: r(t) = x(t), y(t), z(t).
Dla rurki narysowanej na tej krzywej, badz precyzyjny.
Post by Simpler
Post by J.F.
n(i,j) = r(i,j) x r(i+1,j);
Wektory normalne do krawedzi ?
Do sciany siatki ? A nie jest sciana czworokatem ?
pierdołami się przejmujesz...
n(i,j) = u x v, gdzie u i v wyliczamy z trójkąta,
czyli z trzech punktów, np. takich: r(i,j), r(i+1,j), r(i,j+1);
Post by J.F.
Post by Simpler
https://en.wikipedia.org/wiki/Trefoil_knot
r(t) = sint+2sin2t, cost-2cos2t, -sin3t
no i jakie będzie równanie dla rury o promieniu r,
r(s,t) = ?
Ale powyzej dalem ci wskazowke jak zbudowac algorytm :-)
niby jaki algorytm?
Ja chcę jawny wzór: r(s,t).
Ty chcesz siatke !

A siatke moze zwrocic krotki algorytm :-)
Post by Simpler
Post by J.F.
wstepnie nie widze problemu - powinien zadzialac.
Oczywiscie musisz rozwiac pare drobnych problemow.
r(s,t) = ?
Takiej ci nie dam.
Ale dam siatke wystarczajaca do narysowania :-)

J.
Simpler
2017-09-12 21:14:11 UTC
Permalink
Post by J.F.
Takiej ci nie dam.
Ale dam siatke wystarczajaca do narysowania :-)
Przecież mówiłem że to bardzo proste.

r x r' =
i j k
r = sint+2sin2t, cost-2cos2t, -sin3t
r'= cost+4cos2t, -sint+4sin2t, -3cos3t

= -3cos3t(cost-2cos2t)+sin3t(-sint+4sin2t),
-sin3t(cost+4cos2t)+3cos3t(sint+2sin2t),
(sint+2sin2t)(-sint+4sin2t)-(cost-2cos2t)(cost+4cos2t) =

troszkę to zbyt skomplikowane...

Zatem bierzemy inaczej...
np. (0,0,1) x v = będzie też normalny do tej krzywej:

i j k
0, 0, 1
cost+4cos2t, -sint+4sin2t, -3cos3t

zatem:
rot_n = n cos(s) + v x n sin(s)

v x n =
i j k
cost+4cos2t, -sint+4sin2t, -3cos3t
sint-4sin2t, cost+4cos2t, 0

= -3cos3t(cost+4cos2t), -3cos3t(sint-4sin2t), (cost+4cos2t)^2+(sint-4sin2t)^2 = .., .., 17 + 8cos3t

|n_rot|^2 = 9cos^2(3t)(8cos(3t)+17) + (8cos3t+17)^2;

........

No, zatem nasza szukana rura ma taki wzorek:

r(s,t) = r(t) + rot_n/|rot_n| * r =

sint+2sin2t + [(sint-4sin2t)*cos(s)- 3cos3t(cost+4cos2t)sin(s)] * r/|n|
cost-2cos2t + [cost+4cos2t)*cos(s) - 3cos3t(sint-4sin2t)sin(s) * r/|n|,
-sin3t + (17 + 8cos3t)*sin(s) r/|n|

gdzie: |n| = sqrt[(8cos3t+17)(9cos^2(3t) + 8cos3t+17)];
natomiast samo r to promień tej rury.


No i co - proste? błehehe!
J.F.
2017-09-12 22:35:25 UTC
Permalink
Post by Simpler
Post by J.F.
Takiej ci nie dam.
Ale dam siatke wystarczajaca do narysowania :-)
Przecież mówiłem że to bardzo proste.
r x r' =
A co to niby ma dac ?
Narysowales to, aby sobie wyobrazic ?
Post by Simpler
i j k
r = sint+2sin2t, cost-2cos2t, -sin3t
r'= cost+4cos2t, -sint+4sin2t, -3cos3t
Zatem bierzemy inaczej...
a to sobie narysowales ?
Post by Simpler
i j k
0, 0, 1
cost+4cos2t, -sint+4sin2t, -3cos3t
rot_n = n cos(s) + v x n sin(s)
zdaje mi sie, ze w dobra strone kombinujesz, ale chyba nie do konca.
Dodaj pare zdan wyjasnienia - np co to jest n.
Post by Simpler
v x n =
i j k
cost+4cos2t, -sint+4sin2t, -3cos3t
sint-4sin2t, cost+4cos2t, 0
= -3cos3t(cost+4cos2t), -3cos3t(sint-4sin2t), (cost+4cos2t)^2+(sint-4sin2t)^2 = .., .., 17 + 8cos3t
|n_rot|^2 = 9cos^2(3t)(8cos(3t)+17) + (8cos3t+17)^2;
........
r(s,t) = r(t) + rot_n/|rot_n| * r =
sint+2sin2t + [(sint-4sin2t)*cos(s)- 3cos3t(cost+4cos2t)sin(s)] * r/|n|
cost-2cos2t + [cost+4cos2t)*cos(s) - 3cos3t(sint-4sin2t)sin(s) * r/|n|,
-sin3t + (17 + 8cos3t)*sin(s) r/|n|
gdzie: |n| = sqrt[(8cos3t+17)(9cos^2(3t) + 8cos3t+17)];
natomiast samo r to promień tej rury.
No i co - proste? błehehe!
Tak mi sie zdaje, ze za bardzo skomplikowane.
Ale skoro sie uparles ...

J.
Simpler
2017-09-13 14:37:15 UTC
Permalink
Post by J.F.
Post by Simpler
Przecież mówiłem że to bardzo proste.
r x r' =
A co to niby ma dac ?
Narysowales to, aby sobie wyobrazic ?
Post by Simpler
i j k
r = sint+2sin2t, cost-2cos2t, -sin3t
r'= cost+4cos2t, -sint+4sin2t, -3cos3t
Zatem bierzemy inaczej...
a to sobie narysowales ?
Post by Simpler
i j k
0, 0, 1
cost+4cos2t, -sint+4sin2t, -3cos3t
rot_n = n cos(s) + v x n sin(s)
zdaje mi sie, ze w dobra strone kombinujesz, ale chyba nie do konca.
Dodaj pare zdan wyjasnienia - np co to jest n.
Post by Simpler
v x n =
i j k
cost+4cos2t, -sint+4sin2t, -3cos3t
sint-4sin2t, cost+4cos2t, 0
= -3cos3t(cost+4cos2t), -3cos3t(sint-4sin2t), (cost+4cos2t)^2+(sint-4sin2t)^2 = .., .., 17 + 8cos3t
|n_rot|^2 = 9cos^2(3t)(8cos(3t)+17) + (8cos3t+17)^2;
........
r(s,t) = r(t) + rot_n/|rot_n| * r =
sint+2sin2t + [(sint-4sin2t)*cos(s)- 3cos3t(cost+4cos2t)sin(s)] * r/|n|
cost-2cos2t + [cost+4cos2t)*cos(s) - 3cos3t(sint-4sin2t)sin(s) * r/|n|,
-sin3t + (17 + 8cos3t)*sin(s) r/|n|
gdzie: |n| = sqrt[(8cos3t+17)(9cos^2(3t) + 8cos3t+17)];
natomiast samo r to promień tej rury.
No i co - proste? błehehe!
Tak mi sie zdaje, ze za bardzo skomplikowane.
Ale skoro sie uparles ...
J.
Przecież pisałem o tym wcześniej szczegółowo... z trzy wypowiedzi wstecz.

copy=======>

Mając krzywą: r(r) = x(t), y(t), z(t);

1. wyliczamy wektor styczny, czyli: v = r'(t) po prostu.
2. mamy styczny, ale nam potrzeba normalny,
zatem robimy dowolny iloczyn wektorny z tym v,
np. n = r x v będzie ok.
ewentualnie można użyć drugiej pochodnej: n = v' = r'';

potem to normalizujemy... no i obracamy dookoła v,
najlepiej chyba za pomocą wzoru Rodriguesa:
https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula

ten ostatni składnik nam tu odpadnie, bowiem: n*v = 0,
zatem pozostanie prościutki wzorek:

n_rot = n cos(s) + v x n sin(f)

3. ostateczne równanie szukanej rury będzie oczywista takie:
r(s,t) = r(t) + n_rot(s,t)

a przy okazji mamy tu za darmo wektory normalne,
bo to są przecież te: n_rot(s,t)

=============
spróbujmy to zastosować do okręgu, co ma dać torus finalnie.
n = r x r' =
i j k
r = cost, sint, 0
r' =-sint, cost, 0

n = 0,0, cost^2+sint^2 = 0,0,1

nie potrzeba nawet normalizować!

..........
obrót dooukoła wektora v=r' o kąt f: c = cosf, c1=1-cosf, s = sinf;

może użyjmy macierz zamiast Rodriguesa:
R =
c + vx^2.c1, vx.vy.c1 - vz.s, vx.vz.c1 + vy.s
vy.vx.c1 + vz.s, c + vy^2.c1, vy.vz.c1 - vx.s
vz.vx.c1 - vy.s, vz.vy.c1 + vx.s, c + vz^2.c1
..........

n_rot = R * [0,0,1]^T = vx.vz.c1 + vy.s, vy.vz.c1 - vx.s, c + vz^2.c1

dla: v = r' = vx,vy,vz = -sint, cost, 0
cost.sinf, sint.sinf, cosf

zatem szukana powierzchnia:
r(t,f) = r + R.n = cost + rcost.sinf, sint + rsint.sinf, rcosf =
(1+rsinf)cost, (1+rsinf)sint, rcost

no i to jest chyba faktycznie torus.
J.F.
2017-09-13 16:13:52 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
dyskusyjnych:cee00a92-975d-4cca-9de0-***@googlegroups.com...
W dniu środa, 13 września 2017 00:35:49 UTC+2 użytkownik J.F. napisał:
[...]
Przecież pisałem o tym wcześniej szczegółowo... z trzy wypowiedzi
wstecz.
copy=======>
Post by Simpler
Mając krzywą: r(r) = x(t), y(t), z(t);
1. wyliczamy wektor styczny, czyli: v = r'(t) po prostu.
2. mamy styczny, ale nam potrzeba normalny,
zatem robimy dowolny iloczyn wektorny z tym v,
np. n = r x v będzie ok.
Chyba, ze akurat sa wspoliniowe, wtedy nie bedzie ok.
Post by Simpler
ewentualnie można użyć drugiej pochodnej: n = v' = r'';
I niniejszym wprowadziles drugi wektor n, rozny od pierwszego :-)

Tu tez jest ryzyko wspoliniowosci.
Post by Simpler
potem to normalizujemy... no i obracamy dookoła v,
https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
ten ostatni składnik nam tu odpadnie, bowiem: n*v = 0,
n_rot = n cos(s) + v x n sin(f)
r(s,t) = r(t) + n_rot(s,t)
No i pieknie - od poczatku tak proponowalem :-)

Jest tu jedna sliska rzecz - orientacja tego poczatkowego wektora r x
v.
dla okregu jest wszystko jedno gdzie bedzie wskazywalten wektor przy
s=0, ale juz dla generacji siatki nie.
Chcialoby sie, aby linia przy s=const byla jakas sensowna, a nie np
obiegala glowna krzywa po spiralce.
Post by Simpler
=============
spróbujmy to zastosować do okręgu, co ma dać torus finalnie.
n = r x r' =
i j k
r = cost, sint, 0
r' =-sint, cost, 0
n = 0,0, cost^2+sint^2 = 0,0,1
nie potrzeba nawet normalizować!
Bo promien dales 1, i w plaszczyznie dobrej umiesciles ... na to
liczyc nie mozna :)
Post by Simpler
obrót dooukoła wektora v=r' o kąt f: c = cosf, c1=1-cosf, s = sinf;
R =
c + vx^2.c1, vx.vy.c1 - vz.s, vx.vz.c1 + vy.s
vy.vx.c1 + vz.s, c + vy^2.c1, vy.vz.c1 - vx.s
vz.vx.c1 - vy.s, vz.vy.c1 + vx.s, c + vz^2.c1
n_rot = R * [0,0,1]^T = vx.vz.c1 + vy.s, vy.vz.c1 - vx.s, c + vz^2.c1
dla: v = r' = vx,vy,vz = -sint, cost, 0
cost.sinf, sint.sinf, cosf
r(t,f) = r + R.n = cost + rcost.sinf, sint + rsint.sinf, rcosf =
w wprowadziles r, ktore nie jest tym samym r co z poczatku przykladu,
oraz po lewej stronie wzoru :-)
Post by Simpler
(1+rsinf)cost, (1+rsinf)sint, rcost
Na koncu jest rcosf
Post by Simpler
no i to jest chyba faktycznie torus.
ee tam, daj obrazek twojego obwarzanka :)

J.
Simpler
2017-09-13 16:46:07 UTC
Permalink
Post by J.F.
Post by Simpler
1. wyliczamy wektor styczny, czyli: v = r'(t) po prostu.
2. mamy styczny, ale nam potrzeba normalny,
zatem robimy dowolny iloczyn wektorny z tym v,
np. n = r x v będzie ok.
Chyba, ze akurat sa wspoliniowe, wtedy nie bedzie ok.
Post by Simpler
ewentualnie można użyć drugiej pochodnej: n = v' = r'';
I niniejszym wprowadziles drugi wektor n, rozny od pierwszego :-)
zawsze istniej ryzyko że wyjdzie n = 0, a wtedy dupa...
co znaczy tyle, że należy wybrać inny wektor w miejsce tego
drugiego.

np. gdy dla użytego t otrzymamy: r(t) = 0, wtedy
należy użyć innego... po prostu.

I nie inaczej jest z n = r'', co w szczególności dla dowolnej prostej
da zawsze zero, niestety.
r = (at, bt, ct) -> r'' = 0;
Post by J.F.
Jest tu jedna sliska rzecz - orientacja tego poczatkowego wektora r x
v.
dla okregu jest wszystko jedno gdzie bedzie wskazywalten wektor przy
s=0, ale juz dla generacji siatki nie.
Chcialoby sie, aby linia przy s=const byla jakas sensowna, a nie np
obiegala glowna krzywa po spiralce.
Nie będzie tu żadnej spirali, no bo to jest powierzchnia - gładka!

A takie coś, znaczy rurę, rysujemy pierścieniami - tak wzdłuż,
czyli tu nie ma żadnego znaczenia powiązanie kolejnych warstw.

Przy rysowaniu samej tej sieci (liniami) wyszłyby jakieś spirale,
no, ale nigdy dla powierzchni, bo ta jest gładka.
Post by J.F.
Post by Simpler
r(t,f) = r + R.n = cost + rcost.sinf, sint + rsint.sinf, rcosf =
w wprowadziles r, ktore nie jest tym samym r co z poczatku przykladu,
oraz po lewej stronie wzoru :-)
no to masz:
r(s,t) = r(t) + R.n * ro/|n|
Post by J.F.
Post by Simpler
(1+rsinf)cost, (1+rsinf)sint, rcost
Na koncu jest rcosf
Post by Simpler
no i to jest chyba faktycznie torus.
ee tam, daj obrazek twojego obwarzanka :)
Takie coś dawno rysowałem... jak i każdą inną - dowolną powierzchnię:
r(s,t), albo z(x,y), itp.
J.F.
2017-09-13 18:52:22 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
Post by Simpler
Post by J.F.
Post by Simpler
1. wyliczamy wektor styczny, czyli: v = r'(t) po prostu.
2. mamy styczny, ale nam potrzeba normalny,
zatem robimy dowolny iloczyn wektorny z tym v,
np. n = r x v będzie ok.
Chyba, ze akurat sa wspoliniowe, wtedy nie bedzie ok.
Post by Simpler
ewentualnie można użyć drugiej pochodnej: n = v' = r'';
I niniejszym wprowadziles drugi wektor n, rozny od pierwszego :-)
zawsze istniej ryzyko że wyjdzie n = 0, a wtedy dupa...
co znaczy tyle, że należy wybrać inny wektor w miejsce tego
drugiego.
Co znaczy, ze nalezy je inaczej oznaczyc, zeby zamieszania nie
wprowadzac.
Post by Simpler
np. gdy dla użytego t otrzymamy: r(t) = 0, wtedy
należy użyć innego... po prostu.
I nie inaczej jest z n = r'', co w szczególności dla dowolnej prostej
da zawsze zero, niestety.
r = (at, bt, ct) -> r'' = 0;
niekoniecznie.
(at^3, bt^3, ct^3) to jest ta sama prosta, a druga pochodna niezerowa
:-)

Oczywiscie moze byc i w druga strone - pierwsza lub druga pochodna sa
zerowe dla pewnego t ... a linia calkiem gladka i styczny wektor w tym
punkcie ma.
Post by Simpler
Post by J.F.
Jest tu jedna sliska rzecz - orientacja tego poczatkowego wektora r x
v.
Post by J.F.
dla okregu jest wszystko jedno gdzie bedzie wskazywalten wektor przy
s=0, ale juz dla generacji siatki nie.
Chcialoby sie, aby linia przy s=const byla jakas sensowna, a nie np
obiegala glowna krzywa po spiralce.
Nie będzie tu żadnej spirali, no bo to jest powierzchnia - gładka!
A takie coś, znaczy rurę, rysujemy pierścieniami - tak wzdłuż,
czyli tu nie ma żadnego znaczenia powiązanie kolejnych warstw.
powiazania to nie masz miedzy punktami s=0 w kolejnych
warstwach/okregach.
Moga byc dowolnie ulozone.

(1+rsinf)cost, (1+rsinf)sint, rcosf

(1+rsin(f+t))cost, (1+rsin(f+t))sint, rcos(f+t)

Jesli sie nie pomylilem - to jest taki sam torus.
A siatka wychodzi inna :-)
Post by Simpler
Post by J.F.
Post by Simpler
r(t,f) = r + R.n = cost + rcost.sinf, sint + rsint.sinf, rcosf =
w wprowadziles r, ktore nie jest tym samym r co z poczatku
przykladu,
oraz po lewej stronie wzoru :-)
r(s,t) = r(t) + R.n * ro/|n|
Sie nie rozumiemy. W czlonie "rcost.sinf"
r to srednica "detki". A jednoczesnie przez r oznaczasz promien
wiodacy.

I jak ktos ma to zrozumiec ?

J.
Simpler
2017-09-13 19:33:08 UTC
Permalink
Post by J.F.
Moga byc dowolnie ulozone.
(1+rsinf)cost, (1+rsinf)sint, rcosf
(1+rsin(f+t))cost, (1+rsin(f+t))sint, rcos(f+t)
Jesli sie nie pomylilem - to jest taki sam torus.
A siatka wychodzi inna :-)
No, chyba jakoś tak otrzymałbyś spiralne...

ogólne to chyba tak: f -> f + nt, n spiral na... rurę.
albo i w poprzek: t -> t + nf;

No, a kombinacja obu dałaby zapewne kwadratowe spirale... hihi!
Post by J.F.
Post by Simpler
r(s,t) = r(t) + R.n * ro/|n|
Sie nie rozumiemy. W czlonie "rcost.sinf"
r to srednica "detki". A jednoczesnie przez r oznaczasz promien
wiodacy.
I jak ktos ma to zrozumiec ?
Ja tam nie problemów z... semantyką.

No a tam są trzy różne 'r':
1. r - jako krzywa: r(t)
2. r - jako promień rury
3. r - jako powierzchnia, czyli sama ta rura: r(s,t)
J.F.
2017-09-13 19:43:01 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
Post by Simpler
Post by J.F.
Post by Simpler
r(s,t) = r(t) + R.n * ro/|n|
Sie nie rozumiemy. W czlonie "rcost.sinf"
r to srednica "detki". A jednoczesnie przez r oznaczasz promien
wiodacy.
I jak ktos ma to zrozumiec ?
Ja tam nie problemów z... semantyką.
1. r - jako krzywa: r(t)
2. r - jako promień rury
3. r - jako powierzchnia, czyli sama ta rura: r(s,t)
A jak piszesz r x v to ktory to przypadek ? :-P

J.
Simpler
2017-09-14 00:42:17 UTC
Permalink
Post by J.F.
Użytkownik "Simpler" napisał w wiadomości grup
Post by Simpler
Post by J.F.
Post by Simpler
r(s,t) = r(t) + R.n * ro/|n|
Sie nie rozumiemy. W czlonie "rcost.sinf"
r to srednica "detki". A jednoczesnie przez r oznaczasz promien
wiodacy.
I jak ktos ma to zrozumiec ?
Ja tam nie problemów z... semantyką.
1. r - jako krzywa: r(t)
2. r - jako promień rury
3. r - jako powierzchnia, czyli sama ta rura: r(s,t)
A jak piszesz r x v to ktory to przypadek ? :-P
Nie ma znaczenia - w grafice 3D olewa się błędy... stąd tam te tz. artefakty niekiedy, hihi!

Masz tutaj ten trefloid trójlistny:
https://ibb.co/jHZZJa

Jak widać - po obrocie nie wygląda to już tak ładnie.

Użyte równania tej powierzchni:

x = sin(t)+2*sin(2*t)+((sin(t)-4*sin(2*t))*cos(s)+3*cos(3*t)*(cos(t)+4*cos(2*t))*sin(s)/sqrt(9*cos(3*t)^2+8*cos(3*t)+17)) * 0.2 / sqrt(8*cos(3*t)+17);

y = cos(t)-2*cos(2*t)+((cos(t)+4*cos(2*t))*cos(s)-3*cos(3*t)*(sin(t)-4*sin(2*t))*sin(s)/sqrt(9*cos(3*t)^2+8*cos(3*t)+17)) * 0.2/sqrt(8*cos(3*t)+17)

z = -sin(3*t) + (17 + 8*cos(3*t))*sin(s) * 0.2/sqrt((8*cos(3*t)+17)*(9*cos(3*t)^2+8*cos(3*t)+17))

promień rury: r = 0.2;

fajne, co nie... błeheheheeeeeee!

Simpler
2017-09-13 17:35:41 UTC
Permalink
Post by J.F.
ee tam, daj obrazek twojego obwarzanka :)
masz tu:
https://ibb.co/iOGEjF

wersja bez wygładzania oraz z wygładzaniem.
J.F.
2017-09-13 18:51:06 UTC
Permalink
Użytkownik "Simpler" napisał w wiadomości grup
Post by Simpler
Post by J.F.
ee tam, daj obrazek twojego obwarzanka :)
https://ibb.co/iOGEjF
wersja bez wygładzania oraz z wygładzaniem.
Obwarzanek, tzn ten poprzedni "wezel", a nie prosty torus.

J.
Simpler
2017-09-12 15:25:38 UTC
Permalink
Post by Simpler
x(t), y(t), z(t), znaczyć parametrycznie.
np. okrąg wygląda tak: x,y,z = cost, sint, 0;
albo jakaś tam spirala: cost, sint, 2t;
a nawet i prosta: t, 2t, t;
to są krzywe, czyli takie jakby cieniutkie rury, bo o grubości zerowej;
a należy podać równanie rury o jakiejś tam dowolnej grubości: r > 0,
która biegnie wzdłuż tej zadanej krzywej.
x,y,z = 0,0,t;
rcos(s), rsin(s), t
II. mając kółeczko: cost, sint, 0;
(1+r*cos(s))*cos(t), (1+r*cos(s))*sin(t), r*sin(s);
gdzie r = promień ruryl
Dla r = 0 wyjdzie zawsze ta krzywa wyjściowa, oczywista,
no bo to przecież jest rura o zerowej grubości..
W sumie to jest chyba dość łatwe.

Mając krzywą: r(r) = x(t), y(t), z(t);

1. wyliczamy wektor styczny, czyli: v = r'(t) po prostu.
2. mamy styczny, ale nam potrzeba normalny,
zatem robimy dowolny iloczyn wektorny z tym v,
np. n = r x v będzie ok.
ewentualnie można użyć drugiej pochodnej: n = v' = r'';

potem to normalizujemy... no i obracamy dookoła v,
najlepiej chyba za pomocą wzoru Rodriguesa:
https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula

ten ostatni składnik nam tu odpadnie, bowiem: n*v = 0,
zatem pozostanie prościutki wzorek:

n_rot = n cos(s) + v x n sin(f)

3. ostateczne równanie szukanej rury będzie oczywista takie:
r(s,t) = r(t) + n_rot(s,t)

a przy okazji mamy tu za darmo wektory normalne,
bo to są przecież te: n_rot(s,t)

=============
spróbujmy to zastosować do okręgu, co ma dać torus finalnie.
n = r x r' =
i j k
r = cost, sint, 0
r' =-sint, cost, 0

n = 0,0, cost^2+sint^2 = 0,0,1

nie potrzeba nawet normalizować!

..........
obrót dooukoła wektora v=r' o kąt f: c = cosf, c1=1-cosf, s = sinf;

może użyjmy macierz zamiast Rodriguesa:
R =
c + vx^2.c1, vx.vy.c1 - vz.s, vx.vz.c1 + vy.s
vy.vx.c1 + vz.s, c + vy^2.c1, vy.vz.c1 - vx.s
vz.vx.c1 - vy.s, vz.vy.c1 + vx.s, c + vz^2.c1
..........

n_rot = R * [0,0,1]^T = vx.vz.c1 + vy.s, vy.vz.c1 - vx.s, c + vz^2.c1

dla: v = r' = vx,vy,vz = -sint, cost, 0
cost.sinf, sint.sinf, cosf

zatem szukana powierzchnia:
r(t,f) = r + R.n = cost + rcost.sinf, sint + rsint.sinf, rcosf =
(1+rsinf)cost, (1+rsinf)sint, rcost

no i to jest chyba faktycznie torus.
Loading...