What would you be if you were attached to another object by an inclined plane, wrapped helically around an axis?

Tovarasi, am infrint. Minerul ex-multinational emblematic Silviu Virgula Ardelean pare sa se fi vindecat de tutorialita, militianul Ovidiu a demisionat de la Radio Erevan, iar singurul semn de viata din directia ograzii cu experti este sunetul mocirlos pe care il face pulanul flasc al cite unui fondator cind mai usuie un elev de liceu care are nevoie urgent sa-i faca cineva tema. Cred ca este timpul sa gasim noi mineri, dar jugul capitalist ne-a cam impiedicat sa dedicam timpul cuvenit activitatii de largire a orizonturilor si abatajelor.

Pina una-alta, o sa va delectez cu doua slagare internationale. In deschidere ne cinta formatia NewTek, care in SDK-ul de Lightwave ne ofera o viziune lirica alternativa asupra puterilor lui 2:

#define IQ_CTRL         1
#define IQ_SHIFT        2
#define IQ_ALT          4
#define IQ_CONSTRAIN    8
#define IQ_ADJUST       16
#define MOUSE_LEFT      32
#define MOUSE_MID       64
#define MOUSE_RIGHT     96
#define MOUSE_DOWN      128

Aceste constante sint combinate intr-un bit field care-ti zice starea butoanelor cind iti vine un eveniment de mouse. Cind bitii 5 si 6 sint setati, nu inseamna ca userul tine apasat pe left si middle, ci ca tine apasat pe right. Era absolut vital sa se faca economie de un bit, chiar daca asta inseamna ca “sistemul” nu poate sa-ti spuna cind userul tine apasat pe mai multe butoane in acelasi timp. In caz ca va intrebati, variabila care tine bit field-ul e int, deci masura de austeritate n-a izvorit din utilizarea unui char, ci pur si simplu din spirit civic si responsabilitate sociala.

Lasind aritmetica in sant cu botul umflat, este timpul sa ne ocupam un pic si de algebra. Pentru neinitiati, un quaternion este un hack matematic care-ti permite sa encodezi o rotatie in 3D folosind 4 numere. In practica, cel mai des construiesti un quaternion dintr-un vector care reprezinta axa de rotatie si unghiul de rotatie in jurul axei respective. Primele 3 numere din quaternion sint componentele vectorului inmultite cu sinusul jumatatii unghiului, iar al 4-lea numar este cosinusul jumatatii unghiului. Orice implementare de quaternion dintr-o biblioteca de algebra contine un constructor sau o functie care ia un vector si un unghi si face manevra asta cu sin si cos. 3D Studio Max are si el asa ceva:

/*! \remarks Constructor. The quaternion is initialized from the
 vector <b>V</b> and angle <b>W</b> passed. The quaternion is
 then normalized.\n\n
*/
GEOMEXPORT Quat(const Point3& V, float W);

In caz ca aveam dubii, autorul remarca clar (ma rog, cit de clar se poate intr-un comentariu minjit cu puroi de doxygen) ca acest constructor face un quaternion dintr-un vector si un unghi. Asa ca te pui linistit pe scris cod si rotit obiecte si cind rulezi observi ca ele nu prea se rotesc cum ai dori tu. Si te uiti peste cod, si pare bun, si totusi nu merge. Si intr-un final te paleste inspiratia sa privesti in interiorul quaternionilor si vezi ca nu contin deloc ce ar trebui. Codul constructorului, fiind foarte complicat, nu putea fi pus in header, ci sta intr-un cpp (care ajunge sa fie un DLL, ca sa treci printr-un import table de fiecare data cind vrei sa initializezi 4 floati). Din fericire insa, Autodesk ofera apropiatilor bucati din sursele de Max, astfel incit putem lectura quat.cpp si vedea urmatoarea grozavie (cu tot cu indentarea de oligofreni):

Quat::Quat(const Point3& V, float W) {
    x = V.x; y = V.y; z = V.z; w = W;
    Normalize();
    }

Cum ba pula? Cum este W un unghi, daca tu il asignezi direct in a 4-a componenta, fara sa faci muismul cu sin si cos de juma din el? Cum cacat ti s-a parut mai util sa faci asta intr-un constructor care ia vector si scalar, decit sa faci ce face tot restul lumii?

Citeva linii mai jos intilnim si urmatoarea gema:

Quat Quat::operator+(const Quat &q) const {
   //return(Quat(x + q.x,y + q.y,z + q.z,w + q.w));
   return *this * q;
   }

Deci dragii mei, in algebra autodesciana, inmultirea si adunarea sint una si aceeasi operatie, caci unui mintos i s-a parut ca “+” este un simbol potrivit pentru compozitia quaternionilor (care, apropo, nu e comutativa ca + ala pe care-l stim cu totii, daca e sa ne legam de detalii). Lucru documentat de altfel si-n header, daca ignori comentariul de la sfirsitul liniei. Cred ca comentariul ala e comentat, deci n-are nici un efect:

/*! \remarks This operator is the same as the <b>*</b> operator. */
GEOMEXPORT Quat operator+(const Quat&) const; // sum of two quaternions

Tirnacop + tirnacop = tirnacop * tirnacop pentru valori foarte mari ale lui 2.

Tags: , , , , , , , , ,

16 Responses to “What would you be if you were attached to another object by an inclined plane, wrapped helically around an axis?”

  1. Baluba Says:

    As rade da mi-e frica sa nu zboare ceva tarnacoape indienesti cu tot cu indianu posesor spre capu’ meu… Ma rog tomahauce de nativ al penin-sulei de supt China, ca sa fim politically coirect. Keep za fun up! (Da stiu ca aia n-aveau tomahauce si ca nu se scrie asa tomahaucu).

  2. raduangelescu Says:

    dedicatie speciala pentru autobaza :
    http://www.youtube.com/watch?v=g6vcvYJCkic

  3. thefatredguy Says:

    What’s wrong with Doxygen ?

  4. Mihnea Says:

    Uneori te uiti la cod fara syntax highlight, si atunci arata ca line noise. Tu intelegi ceva din poza atasata?

  5. thefatredguy Says:

    Ma dor ochii, lol. De-aia nu ma uit la cod fara un editor care sa stie un minim de syntax highlighting :> Primul lucru care-l fac dupa un install de Windows e sa pun un Notepad2/Notepad++.

  6. thefatredguy Says:

    Am vazut in comentariul clasei fraza asta : “the rotation convention for the API is the left hand rule, while the UI uses the right hand rule”. De ce utilizeaza 2 conventii diferite pt API si UI ?

  7. Mihnea Says:

    Pentru ca este o imbecilitate, iar Max nu rateaza nici o o oportunitate de a fi imbecil. Asta e chiar o imbecilitate minora, care a fost inclusa probabil doar pentru ca si-a dat seama cineva ca e posibil si usor sa futi lumea cu ea, si este un fapt bine documentat ca Discreet/Kinetix/Autodesk au o politica stricta de a da afara orice programator care are oportunitatea de a fute lumea si nu o valorifica (e Regula 1 la ei; Regula 0 e ca nu te angajeaza ca programator daca stii sa programezi). Exista imbecilitati mult mai elaborate si creative prin programul ala de cacat.

  8. thefatredguy Says:

    Ah, eu credeam ca este un motiv bine intemeiat in spatele acestei decizii :>

  9. thefatredguy Says:

    S-a lasat cucu de tutoriale, dar vin invataceii tare din urma. Sa ne delectam cu o alocare a unei matrici :
    http://codexpert.ro/forum/viewtopic.php?f=29&t=2317&sid=269aa9198e111dc975e49071ce7164c6

  10. Mihnea Says:

    Pai avind in vedere ce greutati au avut codexpertii cu matricile in trecut, mi se pare nimerit sa vina unul entuziasmat ca tocmai le-a descoperit si sa le tina o prelegere despre ele. Sa ne amintim cuvintele lui Silviu despre acest subiect:

    I don’t know what’s the it name, but I understood that it’s a usefull technique.
    I need some reference, samples and/or tutorials about this technology.

    Vis implinit!

  11. Pastila Says:

    Cum de nu a ajuns inca la muzeu locomotiva aia cu carbuni supranumita 3D Studio Max?

    Ah da monopolul Autodesk!

  12. voidstar Says:

    Hmm.. Lister .. miroase a Total Commander … tarnacop si bisturiu in acelasi timp. awesome :)

    Daca nu il am instalat, ma simt olog si – nu stiu de ce – cand vad programatori ( oameni presupusi a fi devenit deja buni manuitori ai unui PC/OS ) cu 10 ferestre de explorer deschise si drag ‘n drop din unul in celalalt, incepe dintr-o data sa miroase a contabil / java / javascript si “ce-i aia O(N^2)?”. Poate sunt eu defect, cine stie.

    Am ras grozav la faza cu enumul de la inceputul articolului. Incercam sa imi imaginez o chestie asa pictoriala cu fata userului care tocmai a dat click stanga si mid :)
    Din cate vad insa, mi se pare ca bitii 5 si 6 setati inseamna atat click dreapta cat si left/middle down in acelasi timp. Corectati-ma daca gresesc.

  13. Mihnea Says:

    Nu tocmai. Ar insemna orice combinatie de butoane. Daca ai tine apasat pe right si pe left, tot 5 si 6 ar veni setati, ca nu poate sa-l seteze pe 5 de 2 ori. La fel si right si middle, si toate 3 in acelasi timp.

    In practica insa, iti trimite doar ultimul buton apasat cind iti da mesaj de mouse move. Daca nu s-ar fi zgircit la biti, ar fi putut sa-ti dea toata starea butoanelor. Asa, pot sa-ti dea doar un buton. 5 si 6 vin impreuna doar cind tii apasat butonul drept, si n-ai mai apasat alt buton intre timp. Daca vrei sa suporti mai multe butoane in acelasi timp, trebuie sa ignori cimpul ala din mesajul de mouse move si sa faci singur tracking la stare in evenimentele de mouse down si mouse up.

  14. voidstar Says:

    Da, intr-adevar mai erau si celelalte doua combinatii de butoane pe care le-ai enumerat ( intr-un fel asta vroiam sa zic si eu – ca e ambigua situatia :).

  15. thefatredguy Says:

    FarManager anyone ? :>

  16. Tomis Says:

    Si eu tot taliban Total Commander. Pe Linux in consola merg cu Midnight Commander.

Leave a Reply

Optionally add an image (JPEG only)