Beispiel #1
0
QRectF Plansza::przemiesc(Czolg& czolg, double predkosc_lewa, double predkosc_prawa, double czas) {
    QRectF wynik;

    if(predkosc_lewa != 0 || predkosc_prawa != 0) {
        QVector2D kierunek(cos(czolg.kierunek), -sin(czolg.kierunek));
        QPointF przemieszczenie;
        double kat = 0.0;

        if(predkosc_lewa == predkosc_prawa) {
            przemieszczenie = (kierunek * predkosc_prawa * czolg.predkosc_maksymalna * czas).toPointF();
        } else if(predkosc_lewa == -predkosc_prawa) {
            kat = 2 * predkosc_prawa * czolg.predkosc_maksymalna * czas / this->czolg.rozmiar.width();
            wynik = QRectF(czolg.pozycja - QPointF(1, 1), czolg.pozycja + QPointF(1, 1));
        } else {
            double droga_lewa, droga_prawa, promien_skretu;

            droga_lewa = predkosc_lewa * czolg.predkosc_maksymalna * czas;
            droga_prawa = predkosc_prawa * czolg.predkosc_maksymalna * czas;
            promien_skretu = (2 * czolg.rozmiar.width() * droga_prawa / (droga_prawa - droga_lewa) - czolg.rozmiar.width()) / 2;
            kat = (droga_lewa + droga_prawa) / (2 * promien_skretu);

            QVector2D przemieszczenie_wzgledne(promien_skretu * cos(kat) - promien_skretu, promien_skretu * sin(kat));
            QVector2D przemieszczenie_bezwzgledne_dla_wzglednego_x(przemieszczenie_wzgledne.x() * -kierunek.y(), przemieszczenie_wzgledne.x() * kierunek.x());
            QVector2D przemieszczenie_bezwzgledne_dla_wzglednego_y(przemieszczenie_wzgledne.y() * kierunek.x(), przemieszczenie_wzgledne.y() * kierunek.y());
            QVector2D przemieszczenie_bezwzgledne = przemieszczenie_bezwzgledne_dla_wzglednego_x + przemieszczenie_bezwzgledne_dla_wzglednego_y;

            przemieszczenie = przemieszczenie_bezwzgledne.toPointF();
            wynik = QRectF(czolg.pozycja + QPointF(promien_skretu * cos(czolg.kierunek + M_PI_2) - fabs(promien_skretu), promien_skretu * -sin(czolg.kierunek + M_PI_2) - fabs(promien_skretu)), QSizeF(2 * fabs(promien_skretu), 2 * fabs(promien_skretu)));
        }
        czolg.kierunek = fmod(czolg.kierunek + kat, 2 * M_PI);
        /*	if(!przemieszczenie.isNull()){
        		double a, b, d2;
        		int i = 0;

        		do{
        			a = (this->odcinki[i].y1() - this->odcinki->y2()) / (this->odcinki[i].x1() - this->odcinki->x2());
        			b = (this->odcinki[i].x1() * this->odcinki->y2() - this->odcinki[i].y1() * this->odcinki->x2()) / (this->odcinki[i].x1() - this->odcinki->x2());
        			d2 = pow(a * (czolg.pozycja.x() + przemieszczenie.x()) - czolg.pozycja.y() - przemieszczenie.y() + b, 2) / (a * a + 1);
        		}while(2 * d2 > pow(this->czolg.rozmiar.width(), 2) + pow(this->czolg.rozmiar.height(), 2) && ++i < this->ilosc_odcinkow);
        		qDebug() << d2;
        		if(i == this->ilosc_odcinkow)*/
        czolg.pozycja += przemieszczenie;
        //	}
    }

    if(this->rotacja_wiezy != 0)
        this->czolg.kierunek_wiezy = fmod(this->czolg.kierunek_wiezy + this->rotacja_wiezy * czas * this->czolg.predkosc_obrotu_wieza, 2 * M_PI);

    return wynik;
}
Beispiel #2
0
void pozycjonowanie()
{
    if(bit_is_clear(PIN_SWITCH, KRANC));
    else
    {
        kierunek(TYL);
        int x=1;
        while(x)
        {
            if(bit_is_clear(PIN_SWITCH, KRANC))
            {
                x=0;
            }
        }
        stop();
    }
    stop();
}
Beispiel #3
0
void wykonaj (int ile_petli, int dlugosc)
{
    int licznik=0;
    char ch_liczba[3];

    pozycjonowanie();
    _delay_ms(500);

    relay_on();
    _delay_ms(50);
    init_LCD();
    init_PWM();
    _delay_ms(200);

    int delay = 370;
    if(dlugosc>MIN_DLUGOSC)
        delay = delay + (dlugosc-MIN_DLUGOSC)*190;


    for (licznik=0; licznik<ile_petli; licznik++)
    {
        int do_konca = ile_petli-licznik;
        gen_char(ch_liczba, &do_konca); //wyswietla ile cykli pozostało do konca naswietlania
        wyswietl_LCD(ch_liczba);

        kierunek(PRZOD);
        _delay_ms(delay); //odleglosc dokad dojadą lampy
	stop();
	_delay_ms(2000);
        pozycjonowanie(); //jezdie do tylu az napotka krancowe
	_delay_ms(2000);
    }
    _delay_ms(1000);
    wyswietl_LCD("KONIEC PRACY");
    _delay_ms(1000);
    relay_off();
    beep();
}