V.I.Smirnov Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 Eγώ δεν μπορώ να το τρέξω διότι, όπως σου είπα πριν καιρό, στα windows βλέπω μια μαύρη οθόνη. Μόνον ο δείκτης του ποντικιού ήταν διαφανής. Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ; Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ; -
V.I.Smirnov Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 Eγώ δεν μπορώ να το τρέξω διότι, όπως σου είπα πριν καιρό, στα windows βλέπω μια μαύρη οθόνη. Μόνον ο δείκτης του ποντικιού ήταν διαφανής. Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ; Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ; -
karabouzouk... Δημοσ. 19 Οκτωβρίου 2010 Μέλος Δημοσ. 19 Οκτωβρίου 2010 Δοκίμασε αν θες να κάνεις σχόλιο την εντολή w1.setAttribute(Qt::WA_TranslucentBackground); στη main.. είναι αυτή που κάνει το παράθυρο διάφανο(που δεν μας ενδιαφέρει τώρα) μάλλον αυτή θα κάνει το πρόβλημα.. Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ; Όχι η ανάκλαση γίνεται σωστά αλλά για κάποιο λόγο σε μερικές περιοχές καθώς κουνάω το ποντίκι δεν σχεδιάζονται οι γραμμές εκτός από αυτή που ξεκινάει από το αρχικό σημείο προς τον κέρσορα. Κάτι δεν κάνω σωστά εκεί που τις περνάω στη λίστα υποψιάζομαι..
karabouzouk... Δημοσ. 19 Οκτωβρίου 2010 Μέλος Δημοσ. 19 Οκτωβρίου 2010 Δοκίμασε αν θες να κάνεις σχόλιο την εντολή w1.setAttribute(Qt::WA_TranslucentBackground); στη main.. είναι αυτή που κάνει το παράθυρο διάφανο(που δεν μας ενδιαφέρει τώρα) μάλλον αυτή θα κάνει το πρόβλημα.. Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ; Όχι η ανάκλαση γίνεται σωστά αλλά για κάποιο λόγο σε μερικές περιοχές καθώς κουνάω το ποντίκι δεν σχεδιάζονται οι γραμμές εκτός από αυτή που ξεκινάει από το αρχικό σημείο προς τον κέρσορα. Κάτι δεν κάνω σωστά εκεί που τις περνάω στη λίστα υποψιάζομαι..
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 Με αυτό τον τρόπο που είπες δεν το έκανες..? αυτήν τη φορά όχι υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ) βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α .
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 Με αυτό τον τρόπο που είπες δεν το έκανες..? αυτήν τη φορά όχι υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ) βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α .
karabouzouk... Δημοσ. 20 Οκτωβρίου 2010 Μέλος Δημοσ. 20 Οκτωβρίου 2010 αυτήν τη φορά όχιυπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ) βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α . ena proxeiro sxhma (to poio proxeiro pou mporeis na kaneis) tha vohthouse polu..! Gia na katalavw apo pou metras tis gvnies.. (suggnwmh gia ton trwpo grafhs alla o upologisths pou eimai den exei ellhnika kai den paizei na tou ta perasw gia ena munhma..!) γωνία πρόσπτωσης
karabouzouk... Δημοσ. 20 Οκτωβρίου 2010 Μέλος Δημοσ. 20 Οκτωβρίου 2010 αυτήν τη φορά όχιυπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ) βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α . ena proxeiro sxhma (to poio proxeiro pou mporeis na kaneis) tha vohthouse polu..! Gia na katalavw apo pou metras tis gvnies.. (suggnwmh gia ton trwpo grafhs alla o upologisths pou eimai den exei ellhnika kai den paizei na tou ta perasw gia ena munhma..!) γωνία πρόσπτωσης
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 παραθέτω ένα screenshot απο το gtroza-cad ! σβύσε το .txt απο το karabouzouk5.pdf.txt είναι pdf κανονικο με την ps2pdf όλες οι γωνίες απο το 0 (3ηωρα) προσοχή στο ποιό ειναι το x1,y1 x2,y2 για τις ευθείες σε σχέση με την γωνία χρησιμοποίησα την atan2(dy,dx)=>γωνία σε ακτίνια τελικά η γωνία της ευθείας ανάκλασης ως προς την οριζόντια είναι ίση με τη γωνία της ευθείας πρόσπτωσης ως προς την οριζόντια συν 2 φορές την γωνία πρόσπτωσης (γωνία ευθείας με τοίχο) .
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 παραθέτω ένα screenshot απο το gtroza-cad ! σβύσε το .txt απο το karabouzouk5.pdf.txt είναι pdf κανονικο με την ps2pdf όλες οι γωνίες απο το 0 (3ηωρα) προσοχή στο ποιό ειναι το x1,y1 x2,y2 για τις ευθείες σε σχέση με την γωνία χρησιμοποίησα την atan2(dy,dx)=>γωνία σε ακτίνια τελικά η γωνία της ευθείας ανάκλασης ως προς την οριζόντια είναι ίση με τη γωνία της ευθείας πρόσπτωσης ως προς την οριζόντια συν 2 φορές την γωνία πρόσπτωσης (γωνία ευθείας με τοίχο) . karabouzouk5.pdf.txt
karabouzouk... Δημοσ. 22 Οκτωβρίου 2010 Μέλος Δημοσ. 22 Οκτωβρίου 2010 Ο κώδικας διορθώθηκε και δουλεύει τέλεια.. Απλά μένουν να προγραμματιστούν διάφορες ευκολίες για τον ορισμό των τοίχων κλπ... Κατά τα άλλα αν αυτοί οριστούν στον κώδικα χειροκίνητα λειτουργούν κανονικότατα. Το λάθος που είχε ο προηγούμενος κώδικα ήταν ότι η γραμμή minraylength = maxlength; που αρχικοποιεί την απόσταση από τοίχο στο μέγιστο είχε ξεμείνει έξω από τη for που υπολογίζει περισσότερες ακτίνες... Τέλος πάντων ο κώδικας.. >#include <QtGui> class MyWidget : public QWidget { public: MyWidget(); private: QList <QLineF> walls; QList <QLineF> reflexingLines; QLineF tempLine; int repainttimer/*time between refreshes*/, refreshrate/*in Hz*/, timerID, maxReflexingLines; int reflexingLineCount, reflexingwall, prevreflexingwall; QPointF cursorpos, startpos; QPointF intersectionpoint, tempintersectionpoint; double maxlength, minraylength; bool clickThroughWindowFlag, statsFlag; protected: void paintEvent(QPaintEvent *); void timerEvent(QTimerEvent *); void keyPressEvent(QKeyEvent *); void resizeEvent(QResizeEvent *); //bool event(QEvent *); }; MyWidget::MyWidget() { refreshrate = 40; repainttimer = 1000/refreshrate; timerID = startTimer(repainttimer); maxReflexingLines = 3; startpos = QPoint(0, 0); clickThroughWindowFlag = false; statsFlag = true; walls << QLineF(rect().topRight(), rect().bottomRight()); walls << QLineF(rect().bottomRight(), rect().bottomLeft()); walls << QLineF(rect().bottomLeft(), rect().topLeft()); walls << QLineF(rect().topLeft(), rect().topRight()); } void MyWidget::resizeEvent(QResizeEvent *){ walls.replace(0, QLineF(rect().topRight(), rect().bottomRight())); walls.replace(1, QLineF(rect().bottomRight(), rect().bottomLeft())); walls.replace(2, QLineF(rect().bottomLeft(), rect().topLeft())); walls.replace(3, QLineF(rect().topLeft(), rect().topRight())); maxlength = rect().width() + rect().height(); } void MyWidget::keyPressEvent(QKeyEvent *keyevent){ if(keyevent->key()==(Qt::Key_F)){ startpos = cursorpos; } if(keyevent->key() == Qt::Key_Up){ maxReflexingLines++; } if(keyevent->key() == Qt::Key_Down){ if(maxReflexingLines > 1){ maxReflexingLines--; } } if(keyevent->key() == Qt::Key_V){ walls << QLineF(cursorpos.x(), rect().top(), cursorpos.x(), rect().bottom()); } if(keyevent->key() == Qt::Key_H){ walls << QLineF(rect().left(), cursorpos.y(), rect().right(), cursorpos.y()); } if(keyevent->key() == Qt::Key_Escape){ exit(0); } if(keyevent->key() == Qt::Key_C){ for(int i = walls.size()-1; i>3; i--){ walls.removeAt(i); } } if(keyevent->key()==(Qt::Key_Space)){ clickThroughWindowFlag = !clickThroughWindowFlag; } if(keyevent->key()==(Qt::Key_S)){ statsFlag = !statsFlag; } //increase refresh rate an restart timer. if(keyevent->key()==(Qt::Key_M)){ refreshrate+=1; repainttimer = 1000/refreshrate; killTimer(timerID); timerID = startTimer(repainttimer); } //Decrease refresh rate and restart timer. if(keyevent->key()==(Qt::Key_L)){ if (refreshrate > 1) refreshrate-=1; repainttimer = 1000/refreshrate; killTimer(timerID); timerID = startTimer(repainttimer); } update(); } //bool event(QEvent *){ // // return false; //} void MyWidget::timerEvent(QTimerEvent *){ QLineF::IntersectType interType; if(mapFromGlobal(QCursor::pos()) != cursorpos){ cursorpos = mapFromGlobal(QCursor::pos()); reflexingLines.clear(); reflexingLines << QLineF(startpos, cursorpos); reflexingLines[0].setLength(maxlength); prevreflexingwall = -1; for (reflexingLineCount=0; reflexingLineCount < maxReflexingLines; reflexingLineCount++){ minraylength = maxlength; for(int i=0; i<walls.size(); i++){ if(i != prevreflexingwall){ interType = reflexingLines.at(reflexingLineCount).intersect(walls.at(i), &tempintersectionpoint); if (interType == 1){ if (QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() < minraylength && QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() != 0){ minraylength = QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length(); intersectionpoint = tempintersectionpoint; reflexingwall = i; } } } } prevreflexingwall = reflexingwall; reflexingLines[reflexingLineCount].setP2(intersectionpoint); reflexingLines.append(QLineF(intersectionpoint.x(), intersectionpoint.y(), 0, 0)); reflexingLines.last().setAngle(walls[reflexingwall].angle() + reflexingLines[reflexingLineCount].angleTo(walls[reflexingwall])); reflexingLines.last().setLength(maxlength); } reflexingLines.last().setP2(intersectionpoint); update(); //repaint(); } } void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::black); for (int i=0; i<reflexingLines.size(); i++){ painter.setPen(Qt::black); painter.drawLine(reflexingLines.at(i)); //painter.setPen(Qt::red); //painter.drawEllipse(reflexingLines.at(i).p2(), 30,30); } painter.setPen(Qt::cyan); for (int i=0; i<walls.size(); i++){ painter.drawLine(walls.at(i)); } //make mask in order mouse can click throught window. if (clickThroughWindowFlag ){ QRegion r1(rect()); QRegion r2(QRect(cursorpos.x()-2, cursorpos.y()-2, 5, 5)); QRegion r3(r1.xored(r2)); setMask(r3); } else { painter.setPen(Qt::red); painter.drawText(rect(), Qt::AlignCenter, "--> Clicking Through Window Desabled <--\nPress Space to Enable"); } //draw statistics on the right of the screen.// if (statsFlag){ painter.setPen(Qt::blue); QString strx, stry, repainttimerstr, refreshratestr, refllinesstr; strx.setNum(cursorpos.x(), 'g', 10); stry.setNum(cursorpos.y(), 'g',10); repainttimerstr.setNum(repainttimer, 10); refreshratestr.setNum(refreshrate, 10); refllinesstr.setNum(reflexingLines.size()-1, 10); painter.drawText(rect(), Qt::AlignBottom | Qt::AlignRight, strx + " , " + stry + " \n" + refreshratestr + "Hz, " + repainttimerstr + "msec \n" + refllinesstr + " Refl rays \n\n"); //painter.drawText(cursorpos, strx + " , " + stry); } } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget w1; w1.setUpdatesEnabled(true); //w1.setWindowOpacity(1); //w1.setMouseTracking(true); w1.setAttribute(Qt::WA_TranslucentBackground); w1.setWindowFlags(Qt::WindowStaysOnTopHint); //w1.setAutoFillBackground(false); w1.showMaximized(); //w1.show(); //w1.showFullScreen(); //w1.showMaximized(); w1.setFocus(); return app.exec(); } Και το εκτελέσιμο για LINUX. (ακόμη δεν έβαλα το Qt στα windows..!) popup_v2.zip
gtroza Δημοσ. 22 Οκτωβρίου 2010 Δημοσ. 22 Οκτωβρίου 2010 Ο κώδικας διορθώθηκε και δουλεύει τέλεια.. μπράβο φερέλπιδα νέε karabouzouk ! .
Dr.Fuzzy Δημοσ. 22 Οκτωβρίου 2010 Δημοσ. 22 Οκτωβρίου 2010 Ο κώδικας διορθώθηκε και δουλεύει τέλεια..Απλά μένουν να προγραμματιστούν διάφορες ευκολίες για τον ορισμό των τοίχων κλπ... Κατά τα άλλα αν αυτοί οριστούν στον κώδικα χειροκίνητα λειτουργούν κανονικότατα. Το λάθος που είχε ο προηγούμενος κώδικα ήταν ότι η γραμμή minraylength = maxlength; που αρχικοποιεί την απόσταση από τοίχο στο μέγιστο είχε ξεμείνει έξω από τη for που υπολογίζει περισσότερες ακτίνες... Τέλος πάντων ο κώδικας.. >#include <QtGui> class MyWidget : public QWidget { public: MyWidget(); private: QList <QLineF> walls; QList <QLineF> reflexingLines; QLineF tempLine; int repainttimer/*time between refreshes*/, refreshrate/*in Hz*/, timerID, maxReflexingLines; int reflexingLineCount, reflexingwall, prevreflexingwall; QPointF cursorpos, startpos; QPointF intersectionpoint, tempintersectionpoint; double maxlength, minraylength; bool clickThroughWindowFlag, statsFlag; protected: void paintEvent(QPaintEvent *); void timerEvent(QTimerEvent *); void keyPressEvent(QKeyEvent *); void resizeEvent(QResizeEvent *); //bool event(QEvent *); }; MyWidget::MyWidget() { refreshrate = 40; repainttimer = 1000/refreshrate; timerID = startTimer(repainttimer); maxReflexingLines = 3; startpos = QPoint(0, 0); clickThroughWindowFlag = false; statsFlag = true; walls << QLineF(rect().topRight(), rect().bottomRight()); walls << QLineF(rect().bottomRight(), rect().bottomLeft()); walls << QLineF(rect().bottomLeft(), rect().topLeft()); walls << QLineF(rect().topLeft(), rect().topRight()); } void MyWidget::resizeEvent(QResizeEvent *){ walls.replace(0, QLineF(rect().topRight(), rect().bottomRight())); walls.replace(1, QLineF(rect().bottomRight(), rect().bottomLeft())); walls.replace(2, QLineF(rect().bottomLeft(), rect().topLeft())); walls.replace(3, QLineF(rect().topLeft(), rect().topRight())); maxlength = rect().width() + rect().height(); } void MyWidget::keyPressEvent(QKeyEvent *keyevent){ if(keyevent->key()==(Qt::Key_F)){ startpos = cursorpos; } if(keyevent->key() == Qt::Key_Up){ maxReflexingLines++; } if(keyevent->key() == Qt::Key_Down){ if(maxReflexingLines > 1){ maxReflexingLines--; } } if(keyevent->key() == Qt::Key_V){ walls << QLineF(cursorpos.x(), rect().top(), cursorpos.x(), rect().bottom()); } if(keyevent->key() == Qt::Key_H){ walls << QLineF(rect().left(), cursorpos.y(), rect().right(), cursorpos.y()); } if(keyevent->key() == Qt::Key_Escape){ exit(0); } if(keyevent->key() == Qt::Key_C){ for(int i = walls.size()-1; i>3; i--){ walls.removeAt(i); } } if(keyevent->key()==(Qt::Key_Space)){ clickThroughWindowFlag = !clickThroughWindowFlag; } if(keyevent->key()==(Qt::Key_S)){ statsFlag = !statsFlag; } //increase refresh rate an restart timer. if(keyevent->key()==(Qt::Key_M)){ refreshrate+=1; repainttimer = 1000/refreshrate; killTimer(timerID); timerID = startTimer(repainttimer); } //Decrease refresh rate and restart timer. if(keyevent->key()==(Qt::Key_L)){ if (refreshrate > 1) refreshrate-=1; repainttimer = 1000/refreshrate; killTimer(timerID); timerID = startTimer(repainttimer); } update(); } //bool event(QEvent *){ // // return false; //} void MyWidget::timerEvent(QTimerEvent *){ QLineF::IntersectType interType; if(mapFromGlobal(QCursor::pos()) != cursorpos){ cursorpos = mapFromGlobal(QCursor::pos()); reflexingLines.clear(); reflexingLines << QLineF(startpos, cursorpos); reflexingLines[0].setLength(maxlength); prevreflexingwall = -1; for (reflexingLineCount=0; reflexingLineCount < maxReflexingLines; reflexingLineCount++){ minraylength = maxlength; for(int i=0; i<walls.size(); i++){ if(i != prevreflexingwall){ interType = reflexingLines.at(reflexingLineCount).intersect(walls.at(i), &tempintersectionpoint); if (interType == 1){ if (QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() < minraylength && QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() != 0){ minraylength = QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length(); intersectionpoint = tempintersectionpoint; reflexingwall = i; } } } } prevreflexingwall = reflexingwall; reflexingLines[reflexingLineCount].setP2(intersectionpoint); reflexingLines.append(QLineF(intersectionpoint.x(), intersectionpoint.y(), 0, 0)); reflexingLines.last().setAngle(walls[reflexingwall].angle() + reflexingLines[reflexingLineCount].angleTo(walls[reflexingwall])); reflexingLines.last().setLength(maxlength); } reflexingLines.last().setP2(intersectionpoint); update(); //repaint(); } } void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::black); for (int i=0; i<reflexingLines.size(); i++){ painter.setPen(Qt::black); painter.drawLine(reflexingLines.at(i)); //painter.setPen(Qt::red); //painter.drawEllipse(reflexingLines.at(i).p2(), 30,30); } painter.setPen(Qt::cyan); for (int i=0; i<walls.size(); i++){ painter.drawLine(walls.at(i)); } //make mask in order mouse can click throught window. if (clickThroughWindowFlag ){ QRegion r1(rect()); QRegion r2(QRect(cursorpos.x()-2, cursorpos.y()-2, 5, 5)); QRegion r3(r1.xored(r2)); setMask(r3); } else { painter.setPen(Qt::red); painter.drawText(rect(), Qt::AlignCenter, "--> Clicking Through Window Desabled <--\nPress Space to Enable"); } //draw statistics on the right of the screen.// if (statsFlag){ painter.setPen(Qt::blue); QString strx, stry, repainttimerstr, refreshratestr, refllinesstr; strx.setNum(cursorpos.x(), 'g', 10); stry.setNum(cursorpos.y(), 'g',10); repainttimerstr.setNum(repainttimer, 10); refreshratestr.setNum(refreshrate, 10); refllinesstr.setNum(reflexingLines.size()-1, 10); painter.drawText(rect(), Qt::AlignBottom | Qt::AlignRight, strx + " , " + stry + " \n" + refreshratestr + "Hz, " + repainttimerstr + "msec \n" + refllinesstr + " Refl rays \n\n"); //painter.drawText(cursorpos, strx + " , " + stry); } } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget w1; w1.setUpdatesEnabled(true); //w1.setWindowOpacity(1); //w1.setMouseTracking(true); w1.setAttribute(Qt::WA_TranslucentBackground); w1.setWindowFlags(Qt::WindowStaysOnTopHint); //w1.setAutoFillBackground(false); w1.showMaximized(); //w1.show(); //w1.showFullScreen(); //w1.showMaximized(); w1.setFocus(); return app.exec(); } Και το εκτελέσιμο για LINUX. (ακόμη δεν έβαλα το Qt στα windows..!) Να επιβεβαιώσω ότι μόλις τώρα το έτρεξα σε Ubuntu 10.10 και λειτουργεί μια χαρά. Και να μην το βάλεις, μη σου πω βγάλε και τα Windows!
gtroza Δημοσ. 23 Οκτωβρίου 2010 Δημοσ. 23 Οκτωβρίου 2010 Να επιβεβαιώσω ότι μόλις τώρα το έτρεξα σε Ubuntu 10.10 και λειτουργεί μια χαρά. Και να μην το βάλεις, μη σου πω βγάλε και τα Windows! η μόνη αλλαγή που πρέπει να γίνει στο project ! καλό σκ .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.