pomoc w zrozumieniu kodu

0

Witam majac program rysowania odcinka korzystając z równania kierunkowego prostej y=ax+b mam problem taki, ze nie nie rozumiem niektórych warunkow... mianowicie mając dwie funkcje ktore odpowiadaja za pobieranie punktu wspolrzednych klikniecia myszy:

void MyWindow::mousePressEvent(QMouseEvent *event)
{
    x0 = event->x();
    y0 = event->y();

    x0 -= poczX;
    y0 -= poczY;
}

i odpowiedzialna za pobieranie wspolrzednych puszczenia przycisku myszy

void MyWindow::mouseReleaseEvent(QMouseEvent *event)
{
    x1 = event->x();
    y1 = event->y();

    x1 -= poczX;
    y1 -= poczY;

//rysowanie odcinka
    float a, b;

    a = (float)(y1 - y0)/(x1 -x0);
    b = (float)(y0 - a * x0);
    if(x0 < x1)
    {
        if(abs(a) < 1)
        {
            for(int x = x0; x <=x1; x++)
            {
                int y = a * x + b;
                zapalPiksel(x,y);
            }
        }
        else if(abs(a) >= 1 && y0 < y1 )
        {
            for(int y = y0; y <=y1; y++)
            {
                int x = (y - b)/a;
                zapalPiksel(x,y);
            }
        }
        else
        {
            for(int y = y1; y <=y0; y++)
            {
                int x = (y - b)/a;
                zapalPiksel(x,y);
            }
        }
    }
    else
    {
        if(abs(a) < 1)
        {
            for(int x = x1; x <=x0; x++)
            {
                int y = a * x + b;
                zapalPiksel(x,y);
            }
        }
        else if(abs(a) >= 1 && y1 < y0)
        {
            for(int y = y1; y <=y0; y++)
            {
                int x = (y - b)/a;
                zapalPiksel(x,y);
            }
        }
        else
        {
            for(int y = y0; y <=y1; y++)
            {
                int x = (y - b)/a;
                zapalPiksel(x,y);
            }
        }
    }
}

nie wiem co oznaczaja w kodzie takie warunki jak :

 if(abs(a) < 1)

lub

    else if(abs(a) >= 1 && y0 < y1 )

Bardzo proszę o pomoc w zrozumieniu

3

Nie wiem skąd ten program, ale nie ma on najmniejszego sensu. Jakaś pokraczna ifologia bo ktoś nie umie matematyki. Więc teraz pytanie brzmi, czy twoim zadaniem jest zrozumieć ten kod (bo to zajęcia z czytania gównianego kodu) czy jednak masz napisać program który coś takiego robi i chciałeś się wycfanić znajdując gotowiec w internecie. Jeśli to drugie, to zalecam skasować tą abominacje i napisać to samodzielnie. Takiego copy-paste to by się nawet sam Mirosław Z. nie powstydził.

0

ten kod mam z wykladu przepisany i chce go zrozumiec dla mnie tez jest dosc chaotycznie napisany ale chce go zrozumiec bo byc moze na kolejnych zajeciach w jakis sposob to zaprocentuje, byc moze ten kod jest tak celowo napisany... nie wiem ale tak czy siak chce go ogarnac mało wiele...

0

Przepisz to równanie kierunkowe na parametryczne, to będzie mniejsza drabinka.

0

Tylko, ze ja nie chce mniejszej drabinki tylko proszę o pomoc w zrozumieniu kodu tego co mam

0

if(abs(a) < 1)
Abs zwraca wartość bezwzględną liczby a i jeśli jest mniejsza od 1 to pętla się wykona.

else if(abs(a) >= 1 && y0 < y1 )
W przeciwnym razie jeśli wartość bezwzględna z liczby a będzie wieksza lub równa 1 oraz y0 będzie mniejsze od y1 to ta pętla się wykona.

0
Shalom napisał(a):

czy twoim zadaniem jest zrozumieć ten kod (bo to zajęcia z czytania gównianego kodu)

Czy w ogóle można powiedzieć, że umiejętność czytania gównianego kodu przyda się w pracy zawodowej?

2

Bracie @dcielak, tu przede wszystkim zabrano się do rysowania odcinka od d**y strony. W Qt robi się to poprzez:

  1. QPainter::drawLine() wewnątrz paintEvent()
  2. Graphics Framework, np QGraphicsScene::addLine()
    nie jakieś zapalPiksel()

Dla przypadku 1 oto szkic algorytmu rysującego linię:

  1. w mousePressEvent() zapamiętujesz punkt start
  2. w mouseReleaseEvent zapamiętujesz koniec
  3. przeimplementowujesz paintEvent():
void MyWindow::paintEvent(QPaintEvent *event)
{
    <ParentClass>::paintEvent(event);//za parent class podstaw to, z czego dziedziczy MyWindow
    QPainter painter(this);
    //ewentualnie ustawienie QPen, QBrush dla obiektu painter aby ustalić kolor, grubość kreski, typ kreski (ciągła, kropkowana itd) itd
    painter.drawLine(startPoint, endPoint);
}
0
        if(abs(a) < 1)
        {
          ...
        }
        else if(abs(a) >= 1 && y0 < y1 )

Jeżeli wejdziemy do else to wiemy, że pierwszy warunek jest niespełniony. Więc powyższe jest równoważne:

        if(abs(a) < 1)
        {
          ...
        }
        else if( y0 < y1 )

Nadmiarowego kodu, zresztą, jest tu dużo więcej.

Powiedz, że to były zajęcia pod hasłem "Jak NIE NALEŻY implementować algorytmu rysowania linii". Jeżeli nie to nawet nie staraj się tego "czegoś" zrozumieć.

2

Ten kod ma rysować linię prostą.
Te if-y po prostu sprawdzają w której 1/4 koła wypada kierunek rysowanego odcinka.
Linie wzdłuż osiPrzekątne są też specjalnie traktowane, dlatego jest aż 6 przypadków.
Zależnie od tego wyliczane jest x na podstawie y lub na odwrót.
Tak jak pisze @MasterBLB autor tego kodu nie powinien wykładać programowania, bo ma słabe o nim pojęcie, a jeszcze mniejsze ma temat Qt.

Ja dodam, że MainWindow (coś co dziedziczy po MainWindow), nie powinno obsługiwać jakichkolwiek zdarzeń myszy.
To powinno być zrobione w czymś dziedziczącym po QWidget a obiekt tej klasy wstawiony jako cetnralWidget do MainWindow

0

Sprawdza i dzieli na 8 (23) przypadków. Nadmiarowe warunki nie pomagają w liczeniu :)
To jakaś dziwna wersja algorytmu DDA? Bez zaokrągleń więc ostatnie punkty mogą wylądować obok punktu końcowego.
Przy pionowych liniach wychodzi dzielenie przez zero.

a = (float)(y1 - y0)/(x1 -x0);
0

zatem jeśli punkt klikniecia wypada x0=2,y0=3
a punkt puszczenia x1=4,y1=1
to jestem w tym warunku

  else if(abs(a) >= 1 && y0 < y1 )
        {
            for(int y = y0; y <=y1; y++)
            {
                int x = (y - b)/a;
                zapalPiksel(x,y);
            }
        }

i rysuje piksele w tym obszarze?
images.png

1

Nie! abs(a) >= 1 znaczy, że zakres kątów jest od 45 do 135 stopni.

0

Mhm a ten drugi warunek obok abs(a)>=1 dlaczego musi zostać spełniony?

&& y0 < y1
0

A skąd wiadomo takie rzeczy?

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