Page 3 sur 3

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 13 Jan 2022, 18:56
de Lauryy06
En théorie le fix est déjà disponible sur Github, mais pour ce qui est du site web, on n'a pas encore tout automatisé donc il y a pas vraiment de date...

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 17:27
de parisse
Lauryy06 a écrit:J'ai résolu le problème des lignes blanches avec fill_polygon (qui n'est plus limité à 32 points maintenant) :
Image
Serait-il possible d'avoir le script du logo de TI qui cause le reset de la calculatrice pendant le dessin ? Ca m'aiderait à débugger.

J'ai regarde votre code source pour comparer au mien et voir si je peux ameliorer le mien. Il y a un truc evident a ameliorer chez moi pour le portage Numworks, c'est l'utilisation de l'instruction de remplissage de rectangles pour chaque petite segment de pixels horizontal dans le scanline. Chez vous, il y a le tri qui est en O(n^2) mais evidemment c'est plus difficile a ameliorer car pas de vraie libc chez Epsilon, donc pas de qsort. Il y a d'autres optimisations chez moi pour minimiser le temps de calcul des abscisses des aretes qui traversent la ligne courante, mais ca ne doit pas trop se voir si n est petit (mon objectif etait n==384 qui est a peu pres ce qu'on obtient si on trace l'aire sous la courbe par un polygone rempli sur la Casio).
Est-ce que vous gerez le cas ou les coordonnees passees en argument sont en-dehors des limites de clipping?

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 19:03
de Lauryy06
Est-ce que vous gerez le cas ou les coordonnees passees en argument sont en-dehors des limites de clipping?


Oui, au début du code je change si besoin la hauteur de départ et d'arrivée pour ne parcourir que les lignes à l'écran :
Code: Tout sélectionner
if (top < 0) {
  top = 0;
}
if (bottom > m_clippingRect.height()) {
  bottom = m_clippingRect.height();
}

Puis dans chaque ligne, si le "switch" est à gauche de l'écran, je ne remplis pas le rectangle
Code: Tout sélectionner
if (switchesX[i+1]>left) {
   fillRect( KDRect(switchesX[ i ], y, switchesX[ i+1 ] - switchesX[ i ], 1 ), color ) ;
}

et s'il est à droite, j'interromps la boucle et je passe à la ligne suivante.
Code: Tout sélectionner
if (switchesX[i]>=right) {
   break;
}



Chez vous, il y a le tri qui est en O(n^2) mais evidemment c'est plus difficile a ameliorer car pas de vraie libc chez Epsilon, donc pas de qsort

Effectivement, le bubble sort était le plus simple à implémenter, et je ne vise pas un trop grand nombre d'arrêtes traversant chaque ligne, mais si quelqu'un me signal des ralentissements sur la méthode, je pourrais toujours la passer en quick sort.


Il y a d'autres optimisations chez moi pour minimiser le temps de calcul des abscisses des aretes qui traversent la ligne courante

Ce n'est pas juste une simple "moyenne" des deux points ?

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 19:25
de parisse
Je commence par trier les segments par ymin une seule fois.
J'ai une liste de segments secants. Quand je passe d'un y au y+1, je regarde si les segments precedents sont encore secants (si oui on rajoute la pente inverse pour trouver les abscisses, la liste des pentes inverses est stockee au debut), et je rajoute si necessaire de nouveaux segments qui deviennent secants (c'est rapide parce que les segments sont tries). Ca permet d'accelerer par rapport a votre boucle
Code: Tout sélectionner
for (int i=0; i<numberOfPoints; i++) {
      if (((pointsY[i]<y && pointsY[lastPointIndex]>=y) || (pointsY[lastPointIndex]<y && pointsY[i]>=y)) &&
          pointsY[i] != pointsY[lastPointIndex]) {
        switchesX[switches++] = (int) round(pointsX[i]+1.0*(y-pointsY[i])/(pointsY[lastPointIndex]-pointsY[i])*(pointsX[lastPointIndex]-pointsX[i]));
      }
      lastPointIndex=i;
    }

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 19:39
de Lauryy06
Effectivement. Je pense que je vais ajouter ça par acquis de conscience.

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 20:01
de parisse
Pas sur que ca vaille le coup avec un tri en O(n^2), car le tri initial aura n aretes. Et puis ca rend le code plus complexe (et ca mange temporairement de la RAM). Votre code a l'avantage d'etre simple et je pense qu'il doit etre suffisamment rapide au moins jusque n=100, probablement plus car il n'est pas frequent qu'on rencontre plusieurs dizaines d'aretes.
Le precalcul des pentes peut etre interessant par contre.

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 15 Jan 2022, 21:17
de Lionel Debroux
Pour des tailles intermédiaires, un shell sort est souvent un bon compromis entre le bubble sort et le quicksort.

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 16 Jan 2022, 20:58
de aybg45
Bonsoir, je viens de découvrir Upsilon.
Bravo!
petite question, comment mettre des textes sur la liseuse?
Cordialement,
Aymeric

Re: Upsilon : firmware successeur d'Omega par sa communauté

Message non luPosté: 16 Jan 2022, 21:59
de critor
Comme pour tous les fichiers d'applications (ROMs d'émulateurs), ça se passe sur la page d'installation d'applications :
https://lauryy06.github.io/Upsilon-External/

Il suffit de cliquer sur le bouton pour ajouter ses propres fichiers.