pomoc w zrozumieniu kodu

Odpowiedz Nowy wątek
2019-03-12 02:04
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

edytowany 1x, ostatnio: kq, 2019-03-12 09:15

Pozostało 580 znaków

2019-03-12 02:14
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ł.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2019-03-12 02:16

Pozostało 580 znaków

2019-03-12 02:18
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...

Pozostało 580 znaków

2019-03-12 03:15
0

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


Pozostało 580 znaków

2019-03-12 03:31
0

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

Pozostało 580 znaków

2019-03-12 07:11
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.


edytowany 1x, ostatnio: MasterOf, 2019-03-12 07:12

Pozostało 580 znaków

2019-03-12 08:56
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?

Myśle że jest to jedna z najważniejszych umiejętności :D Tak samo taka quasi inżynieria wsteczna czyli analiza co autor miał na myśli - Shalom 2019-03-12 09:20
pytanie, czy prowadzący wykłady z programowania powinien pisać/pokazywać "crap code"? Jak już pokazuje "crap code" to tylko z zastrzeżeniami i z czytelnym kodem obok, by nie wychowywać kolejnych autorów "crap code". - MarekR22 2019-03-12 12:56

Pozostało 580 znaków

2019-03-12 10:08
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);
}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 5x, ostatnio: MasterBLB, 2019-03-12 10:16

Pozostało 580 znaków

2019-03-12 11:14
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ć.

Pozostało 580 znaków

2019-03-12 12:48
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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 5x, ostatnio: MarekR22, 2019-03-13 11:22
No właśnie nie bardzo bo 1 to jest tg 45*, więc trudno zrozumieć czemu osobno rozpatruje sytuacje dla takiego kąta - Shalom 2019-03-12 13:41

Pozostało 580 znaków

2019-03-12 19:59
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);

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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