generacja trajektorii w 3D - ciezki problem inzynieryjny ;-/

0

witam,

mam taki problem techniczny:
mam napisac program, ktory wygeneruje w przestrzeni trajektorie w ksztalcie osemki. nastepnie wspolrzedne pkt trajektorii wczytamy do starego 15letniego programu pod dosem (sic!) ktory bedzie sterowal frezarka. trzeba bedzie wykreslic ten ksztalt na tzw materiale troche twardszym niz gabka. jednak 'wymyslem' "pana prowadzacego" jest to, ze ta wlasnie gabke moze sobie wsadzac roznie do "podtrzymywacza". naszym zadaniem jest wiec logicznie rzecz biorac znalezienie plaszczyzny, ktora bedzie symbolizowala odpowiednio ustawiona gabka a nastepnie narysowanie na niej tego ksztaltu.

po dlugich problemach poszukiwawczych udalo mi sie jedynie znalezc linie godna nazwania jej trajektorii - osemka, tzw. "lemniskate bernoulliego".

http://pl.wikipedia.org/wiki/Lemniskata_Bernoulliego

jak widac, jedynym parametrem zmiennym tam jest: a.

ponizej to co sam napisalem.

#include <stdio.h>
#include <math.h>

FILE *plik;


int main() {

int d, k = 0;
float x1, x2, x3, y1, y2, y3, z1, z2, z3;
float wspA, wspB, wspC, wspD, a, t;
float xksztalt[104], yksztalt[104], zksztalt[104];

/* wspolrzedne punktu (x1, y1, z1) */
printf("Podaj wspolrzedne punktu pierwszego:");
printf("\n X1 = ");
scanf("%f", &x1);
printf("\n Y1 = ");
scanf("%f", &y1 );
printf("\n Z1 = ");
scanf("%f", &z1);

/* wspolrzedne punktu (x2, y2, z2) */
printf("Podaj wspolrzedne punktu drugiego:");
printf("\n X2 = ");
scanf("%f", &x2);
printf("\n Y2 = ");
scanf("%f", &y2 );
printf("\n Z2 = ");
scanf("%f", &z2);

/* wspolrzedne punktu (x3, y3, z3) */
printf("Podaj wspolrzedne punktu trzeciego:");
printf("\n X3 = ");
scanf("%f", &x3);
printf("\n Y3 = ");
scanf("%f", &y3 );
printf("\n Z3 = ");
scanf("%f", &z3);

printf("Podaj ogniskowa Lemniskaty Bernoulliego:");
printf("\n a = ");
scanf("%f", &a);


wspA = z1*y3 - z2*y3 - y1*z3 + y2*z3 -y2*z1 + z2*y1;
wspB = -x1*z2 - x3*z1 + x1*z3 + x2*z1 + x3*z2 - x2*z3;
wspC = x1*y2 + x3*y1 - x3*y2 - x2*y1 + x2*y3 - x1*y3;
wspD = x2*y1*z3 + x1*z2*y3 + x3*y2*z1 - x2*z1*y3 - x1*y2*z3 - x3*z2*y1;


printf("\notrzymano wynik: %f %f %f %f", wspA, wspB, wspC, wspD);
printf("\nrownanie plaszczyzny to: %f*x + %f*y + %f*z + %f = 0\n\n", wspA, wspB, wspC, wspD);


/* wyliczenie wspolrzednych trajektorii */
for(t=0; t<=3.14; t+=0.03) {
    /* wspolrzedne lemniskaty w przestrzeni na danej plaszczyznie */
    xksztalt[k] = wspA*((a*sqrt(2)*cos(t))/(1 + (sin(t))*(sin(t))));
    yksztalt[k] = wspB*((a*sqrt(2)*sin(t)*cos(t))/(1 + (sin(t))*(sin(t))));
    zksztalt[k] = -wspA*xksztalt[k] - wspB*yksztalt[k] - wspD;
    k++;
}

printf("Utworzono wspolrzedne punktow:\n");
for(d=0; d<=104; d++)
    printf("%f     %f      %f\n", xksztalt[d], yksztalt[d], zksztalt[d]);


/* zapis do pliku "punkty.dat" */
plik = fopen("punkty.dat", "w");

for(d=0; d<=104; d++)
    fprintf(plik, "%.3f    %.3f   %.3f\n", xksztalt[d], yksztalt[d], zksztalt[d]);
    d++;

fflush(plik);
fclose(plik);

printf("\nzapisano %d punktow do pliku 'punkty.dat'\n\n", d-1);

system("PAUSE");
return 0;


}

a teraz jak zwykle problemy techniczne jakie sie pojawily:

  1. w programie nie jest wziete pod uwage to, ze im plaszczyzna nachylona bardziej (wzgledem ukladu XY, Z = 0) tym krok generuje punkty coraz blizej kazdy kazdego. nie wiem czy to zrozumiecie ale sprobojcie. jak nie to narysujcie i sami zobaczycie. chodzi o to ze jak zrobimy rzut osemki narysowanej na nierownoleglej do podloza podstawy to otrzymamy w rzeczywistosci osemke mniejsza niz wskazuja na to punkty wygenerowane. frezarka ma wiertlo pod katem prostopadlym do plaszczyzny podstawy i kat ten jest niezmienny.

  2. program jest zly bo nie zaklada w ktorym miejscu ma byc "poczatek" generowania sie trajektorii. niestety nie umiem wynalezc odpowiedniego wzorka. ale wypadaloby zrobic tak, ze np bedzie sie zaczyna od punktu: x = 5, y = 5, z wyliczany z rownania plaszczyzny. a tutaj wyglada to na to, ze poczatek a raczej "srodek" osemki jest zawsze w punkcie (x,y)=(0,0)

  3. w efekcie tego (?) (jak sprobojecie sie pobawic trzema wejsciowymi pkt ktore generuja plaszczyzne w 3D) mozecie dostac osemke bardza duza jak i bardzo mala. niestety tez nie wiem, czym to jest zwiazane. moze tym, ze zakres tej zmiennej parametryzujacej t jest zawsze <0:2pi> ? jesli przestrzen robocza frezarki jest bardzo mala (chyba szescian 15x15x15) a do tego gabeczka to prostokat 7x 15 cm to wnioski sie same nasuwaja.... trudno "trafic" z dobrymi punktami.

  4. zmniejszajac/zwiekszajac ten parametr a rowniez zmienia sie wielkosc figury.

gdy bylem u "pana prowadzacego" z moimi watpliwosciami ten zasmial sie mowiac, ze to prosty problem - trzeba sie dowiedziec "co to jest macierz transformacji". i to tyle pomocy z jego strony. nie wzial pod uwagi, ze takie rzeczy moga mnie kompletnie nie interesowac. nie wiem o co mu chodzi i pewnie sie nie dowiem. a czas zaliczenia zbliza sie nieublaganie. mysle, ze jak program nie bedzie zawieral tej transformacji ale bedzie dzialal to "pan prowadzacy" zasmiawszy sie, ze nie zrobilem jednak po jego mysli ale dziala, da mi spokoj...

jak ktos ma jakies pomysly lub kawalek kodu na rozwiazanie powyzszych zagadnien to prosze sie odezwac bo mi juz nic nie przychodzi do glowy.

dowodem problemow 1-4 jest to, ze mam identyczny programik dzialajacy w matlabie i tam wlasnie widze sobie na wykresie 3wymiarowym, ze raz krzywa ma rozpietosc -200 do +200 a raz "normalnie" czyli - 3 do 3. moge wiec przeslac kod tegoz rowniez.

0
  1. i 3) problem jest wlasnie taki jak mowisz, dlatego ze stosujesz RZUT punktow a nie OBROT wokol jakeigos punktu zaczepienia. polecam przypomniec sobie geometrie wykreslna i co to jest rzut, na pewno miales :) wyobraz prostokat lezacy na plaszczyznie XY o punktach (0,0;0,1;1,1;1,0), i wyobraz sobie jak bedzie wygladac jego rzut na YZ [podpowiedz: odcinek (0,0;0,1) ]. a obrot to zgola co innego, wzorki tez sa na to

  2. IMHO, to samo co w pkt1. obroc tak samo punkt (0,0) i bedzie i punkt przeciecia osemki lezacy na plaszczyznie gabki

  3. bo parametr A to srednica/promien/wieheisster lemniskaty.. spojrz na wzor na pole figury

*) macierz transformacji - wlasnie tak. ona sluzy do obracania, przesuwania, skalowania itede punktow w 3D

0

niestety geometrii wykreslnej ne mialem :) za to umiem liczyc calki rown. rozniczkowe klasyfikowac (powiem tak ze specjalnosc o mechanicznym brzmnieniu na wydziale elektrycznym niezbyt pasuje)
o rzutach cos bylo na analizie mat. ale to nie to.

gdzie u licha znalezc ta macierz transformacji* [???]

i jak ja zastosowac ...

0

http://www.google.pl/search?hl=pl&q=%2Btranslacja+%2Bobr%C3%B3t+%2B%22macierz+transformacji%22&lr=

polecam pierwszy link: http://www.put.poznan.pl/~gskam/grafika/w4.doc

i jego rozdzial np. Trójwymiarowe przekształcenia (transformacje) geometryczne, podpunkty: "Translacja punktu" (=przesuniecie) oraz "Obrót punktu wokół osi układu współrzędnych"

zreszta, lepiej w ogole caly doc przeczytaj.. a innepodobne rzeczy najszybciej znajdziesz szukajac tutoriali od .. rysowania/renderingu 3D

0

a wiesz jak to w moim przypadku ma wygladc ? bo przeczytalem opis ale nie wiem gdzie co, za co popodstawiac.

mam sobie u mnie wymyslec punkt zaczepienia :?

0

punkt/os zaczepienia u Ciebie jest punktem/osia wokol ktorego/j sie obraca Twoja bryla, jesli nie wiesz gdzie on lezy - obejrzyj frezarke i sposob mocowania gabki na jej talerzu/chwytaku/jak to tam sie teraz zwie.

w dokumencie jest zapisik:

     x’ = a1 x + b1 y + c1 z+ d1 
     y’ = a2 x + b2 y + c2 z+ d2 
     z’ = a3 x + b3 y + c3 z+ d3 

x, y, z - to wspolrzedne punktu pierwotnego, owego wyliczonego z wzorow na rysowanie lemniskaty
x' y' z' - to sa wspolrzedne po przeksztalceniu (obrocie, skali, translacji), "obraz" punktu lezacy na powierzchni docelowej
a1,b1,c1,d1.... - to sa wspolczynniki, parametry operacji, wynikajace WPROST z tego co chcesz zrobic. przykaldowo (tylko obrazowo!): chcesz punkt piertowny (x,y,z) wedlug jakiejs osi, ustawiasz c2 na sin(kata_obrotu), a reszte na zero/jeden. po prawdziwy przyklad patrz dokument, punkt "Definiując macierz obrotu następująco.."

calosc rownan mozna zapisac jako rownanie macierzowe, np.:

[ x’ |   [ a1 b1 c1 |   [ x |   [ d1 |
| y’ | = | a2 b2 c2 | * | y | + | d2 |
| z’ ]   | a3 b3 c3 ]   | z ]   | d3 ]

ze wszelkimi tego konsekwencjami. to to srodkowe 3x3 to wlasnie macierz transformacji ktora musisz przygotowac. doprawdy nie pamietam w tej chwili co z d1..d3, dlatego sa 'poza' :) ale to tez powinno w docku pisac. ale na dobra sprawe to Ci kompletnie nie potrzebne, bo i tak Ty potrzebujesz tylko wykonac te pare mnozen i dodawac z pierwszej trojki (x'=, y'=..). Cala filozofia w Twoim zadaniu, to dobierac wlasciwie a1,b1...c3,d3, tak, aby pasowaly do ulozenia Twojej gabki

interesuja Cie ku temu sekcje "Definiując macierz translacji w następujący sposób:" oraz "Definiując macierz obrotu następująco"

pamietaj, ze nie mozna naraz wykonac translacji i obrotu! robisz albo maciesz przesuniecia, albo macierz obrotu. tak wiec jesli punkt musisz najpierw przesunac a potem obrocic, to robisz macierz translacji, przykaldasz o xyz, dostajesz x'y'z', robisz maciesz obrotu, przykladasz na x'y'z' i dostajesz xyz'' bedace koncowym obrazem. itp

i warto pamietac ze przesuniecie i obrot to nie to samo co obrot i przesuniecie! kolejnosc jest wazna

aha.. w dokumencie nie opisali obrotu wokol punktu (cx,cy,cz)!=(0,0,0), poniewaz to da sie poskladac z operacji przesuniecia i obrotu i sie realizuje jako:

  1. przesuniecie o [-cx, -cy, -cz]
  2. obrot o [rx,ry,rz]
  3. przesuniecie o [cx, cy, cz]
    mam nadzieje ze nie pomylilem znakow :)

i na prawde, zlap jakis tutorial od grafiki wektorowej 3D, na pewno tam jest lopatologicznie opisane i pewnei poprawniej, bo tu u mnie moga byc bledy, zakurzona wiedza juz..

0

fajne tylko jak ja mam teraz niby wiedziec, jak te wspolrzynniki odgadnac [???]

wiem tylko tyle, ze ta gabke a co za tym idzie - plaszczyzne kladzie sie w "szczeki-imadlo" a z tego z kolei wynika, ze mozna ja polazyc na "4 rozne strony swiata" ze to tak nazwe profesjonalnie - czyli godzina 12 lub 3 lub 6 lub 9. noi do tego mozna ja troche przechylic (bok jeden polozony wyzej od boku rownoleglego gabki). ale inaczej juz jej nie wlozszysz, bo po prostu dwie "scianki" imadla jej nie przytrzymaja.............

a wiec jakie propozycje na opisanie tych polozen ?

0

zerknij na
http://www.gamedev.net/reference/articles/article415.asp
i na szablon macierzy dla poszczegolnych operacji (obrot, skala, przesuniecie) na samym dole, osie obrotu, wektory przesuneicia i katy obrotu niestety musisz sam odnalezc, z nas dwoch tylko Ty widziales to urzazdenie

0


Kanał na którym mówili o tym że dodatkowe wymiary generuje się tylko dodaną następną "linią" o innych współżędnych.Przez co może się poruszać po łuku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1