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:
-
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.
-
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)
-
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.
-
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.