Ça fait un petit moment que je ne suis pas venu ici... Mais maintenant que les vacances sont là, je vais pouvoir continuer mon petit bout de programme qui est au point mort depuis 6 mois
En fait je coince sur une chose: "Tracer une courbe passant par X points".
A l'époque Fvirtman m'avait recommandé ceci: ancien post
J'ai fait une recherche sur google, et je me retrouve face à plein de méthodes et algorithmes différents...
Celui-ci me parait correct et documenté mais je ne comprends pas tout: lien
Si Fvirtman ou quelqu'un d'autre pouvait me guider vers le bon chemin, ca serait vraiment sympa
Après ce petit problème il ne me restera plus qu'à faire la GUI mais laquelle s'interface le mieux avec SDL... Qt ou wxWidgets?
Ah bonjour Fvirtman, ca fait un petit moment depuis la dernière fois!
A chaque fois vous avez les bonnes réponses
Pour l'équation, peu importe... mais l'équation paramétrique est plus souple à l'usage je trouve.
Sinon même si c'est un peu loin, pas de problème pour dériver une fonction ;D
Tiens marrant la résolution d'un système de x équations via une matrice M(x,x) je l'ai fait ya pas longtemps en cours
C'est juste une reproduction plus ergonomique de la version combinaison + substitution que t'apprends au collège Si j'dis pas de bêtise, il faut se renseigner du côté de la méthode du "Pivot de Gauss".
Bon courage pour l'algorithme x)
T'as regardé du côté des polynômes interpolateurs de Lagrange ?
C'est la méthode la plus simple je pense.
La courbe la plus simple qui passe par 2 points est une droite, la courbe la plus simple qui passe par 3 points et une parabole, etc...
La courbe la plus simple qui passe par n points est un polynôme de degré n-1 et une méthode pour trouver ce polynôme est d'utiliser les polynômes interpolateur de Lagrange !
J'aurais regardé de ce côté là en tout cas...
Alors pour moi, la solution à explorer c'est à partir de la dérivée, car comme expliqué dans le tuto, tout est une question de dérivée!
Le principe est le même que pour tracer la droite, sauf que la droite, la dérivée est constante, or ici elle varie... donc c'est la partie "+= grad" qu'il va falloir changer...
Pour moi, cela devrait marcher en faisant ce code (je ne peux pas tester la ou je suis...). Il te faut la dérivée (en fonction de x) et la dérivée de la réciproque qui dans le cas d'un polynôme est également la réciproque de la dérivée (il me semble).
Donc comme c'est une cubique, tu as un polynôme du 3e ordre, donc en argument j'ajoute les 4 facteurs a0..a3 (y = a3.x^3 + a2.x^2 + a1.x^1 + a0.x^0), ma dérivée est donc (grad = ) y' = 3*a3.x^2 + 2*a2.x^1 + a1.x^0.
La dérivée/réciproque est ... et c'est là que cela devient un peu plus compliqué, car pour avoir la réciproque, il faut que la courbe soit de dévirée constante sur cet intervalle... laissons de coté cette partie, on va déjà voir si cela fonctionne pour une courbe dont la dérivée est comprise entre -1 et 1 (donc attention quand tu traces tes points! Fait des points "plutôt" alignés horizontalement... i.e. avance plus horizontalement que ce que tu montes ou descends!)
NB: x1, y1 et x2, y2, pt de départ et d'arrivée...
void cubic_trace(int x1, int y1, int x2, int y2, int a3, int a2, int a1, int a0, Uint32 color, SDL_Surface *map, int dotted)
{
int x, y, to_dot = 0;
float xf,yf;
Uint8 r1,g1,b1,a1,r2,g2,b2,a2,r,g,b,a;
Uint32 colorAA1,colorAA2;
// Getting the r,g,b,a values of the specified color
SDL_GetRGBA(color,map->format,&r1,&g1,&b1,&a1);
if (1) // A CHANGER PLUS TARD
{
if (x1 > x2) // Because of the FOR, going from the smallest to the greatest value
{
int_switch(&x1, &x2);
int_switch(&y1, &y2);
}
yf = (float)y1;
// Start and arrival points
setPixel(x1, y1, color, map);
setPixel(x2, y2, color, map);
for (x = x1+1; x <= x2; x++)
{
if((!dotted || (to_dot%dotted)) && x>0 && x<map->w && yf>0 && yf<map->h) // If not outside of the map surface
{
// Getting the color of current (background) pixel
getPixelColor(x, (int)yf, map, &r2,&g2,&b2,&a2);
// For the antialising 2 pixels are drawn, one one top (x,y+1), the other below (x,y)
// The color is a mix of:
// - the color of background
// - the color of the line
// The amount of each color (bg & line color), on the 2 pixels is 100% (e.g. 10% on one, 90% on the other)
r=(Uint8)(frac(yf)*r1+invfrac(yf)*r2);
g=(Uint8)(frac(yf)*g1+invfrac(yf)*g2);
b=(Uint8)(frac(yf)*b1+invfrac(yf)*b2);
a=(Uint8)(frac(yf)*a1+invfrac(yf)*a2);
colorAA1=SDL_MapRGBA(map->format,r,g,b,a); // Color for pixel one (x,y+1)
r=(Uint8)(frac(yf)*r2+invfrac(yf)*r1);
g=(Uint8)(frac(yf)*g2+invfrac(yf)*g1);
b=(Uint8)(frac(yf)*b2+invfrac(yf)*b1);
a=(Uint8)(frac(yf)*a2+invfrac(yf)*a1);
colorAA2=SDL_MapRGBA(map->format,r,g,b,a); // Color for the 2nd pixel (x,y)
// Blitting
setPixel(x, (int)yf, colorAA2, map);
setPixel(x, (int)yf+1, colorAA1, map);
}
to_dot++;
yf += 3*a3*pow(x, 2) + 2*a2*x + a1; // <= PRISE EN COMPTE DE LA DERIVEE
}
}
else //A FAIRE PLUS TARD
{
// OSEF pour l'instant
}
}
Il y a des problemes de raccord dans ton screenshot, voir même des trous (si je zoome). Bizarre ! ça fait la même chose si tu traces la courbe avec des segments classiques ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html