Matematika feladatok
  • ZilogR
    #923
    A "...valami hasonló..." és a "...kicsit továbbfejlesztve..." azok a bűvös szavak, amik egy mérnök agyát a legjobban felcseszik. Mert ha eddig kell eljutni, akkor bele sem érdemes kezdeni (mert akkor mi a francnak a feladat), vagy ha meg kell oldani, akkor meg nincs megoldva.

    :) Azért senki ne vegye ezt a szívére. Na, nézzük, hogyan csinálja egy gépész :P

    Legyen az egyenesek száma N. A kezdőpontok "x" koordinátája legyen xe, a végpontok "x" koordinátája pedig xv. A másik ("y") koordináta pedig két vektorban van tárolva, az e() és v() vektorokban, amik N eleműek.

    Először előállítok egy mátrixot (tömböt), amiben azt tárolom, hogy melyik egyenesek metszik, vagy nem metszik egymást: Ez nagyon egyszerűen megoldható, mivel ha kiválasztom az i-edik és j-edik egyeneseket és az e() és v() koordinátákra igaz, hogy azonos sorrendben követik egymást a két vektorban mindkét egyenesre, tehát ha e(i)>e(j), akkor v(i)>v(j) igaz, akkor a két egyenes nem metszi egymást, egyébként van közös pontjuk:



    FOR i=1 TO N
    FOR j=1 TO N
    M(i,j)=SGN(e(j)-e(i))*SGN(v(j)-v(i))
    NEXT j
    NEXT i



    Ezzel ha M(i,j)=-1, akkor a két egyenes metszi egymást, ha M(i,j)=1, akkor nem metszik egymást és ha M(i,j)=0, akkor vagy a kezdő, vagy a végpontjuk egybeesik.

    Az egyértelmű, hogy meg kell keresni a legmagasabb kezdő- és végpontú egyeneseket:




    emax=1
    vmax=1
    FOR i=2 TO N
    IF e(emax)<e(i) THEN emax=i
    IF v(vmax)<v(i) THEN vmax=i
    NEXT i



    Tehát csak az indexet keressük meg.

    A teljes megoldáshoz én kiszámolnám a koordinátákat, hogy tudjam, mikor kell váltanom a következő egyenesre:




    x(i,j)=xe+(e(j)-e(i))/(K(i)-K(j))
    y(i,j)=K(i)/(K(i)-K(j))*(e(j)-e(i))+e(j)



    ahol K() az egyes egyenesek meredekségét tartalmazó vektor:




    K(i)=(v(i)-e(i))/(xv-xe)



    Az algoritmus pedig: Elindulok az emax-adik egyenesről, megkeresem annak a sorát az M() táblázatban. Ahol -1-et látok, azok között az elemek között kiválasztom azt a j-edik elemet, amelyiknek az x() koordinátája a legkisebb. Ez lesz a váltás a következő egyenesre. Itt ez a j lesz emax helyén, xe helyén az x(). Ha ez egyenlő xv-vel, akkor már végig is értem, ha nem, a j-vel és x()-el fut újra a kiválasztó algoritmus.

    Ennyi, lehet rajta agyalni, hol hibádzik. Annyi időm még nem volt, h megírjam a programot, de igazán kevés hiányzik, de sok a meló. A feladattal is ma este tudtam foglalkozni.

    Az Ericsson telefonnal kapcsolatban valakinek híre???