Algorithme aco toile d'araignée

Description

Salut à tous, c'est ma deuxième source que je poste sur ce site et c'est encore un algorithme basé sur le biomimétisme.
Cette fois ce sont les araignées et leurs toile qui m'ont "inspirées", bref je vous livre le code et le binaire.
Ce projet en soit n'a pas grand intérêt, cependant si vous avez une critique à faire n'hésitez pas.
Merci.

Source / Exemple :


#include <iostream>
#include "Spider.h"

gint DrawCanvas(GtkWidget * widget, GdkEventAny * event, float * data)
{
    cairo_t *cr;
    float radius;
    float angleD;
    float angleR;

    angleD = 360.f / (float)data[RAYONS_TOILE];
    radius = (float)(data[SPIRALES_TOILE] * 5) / data[SPIRALES_TOILE];
    angleR = deg2rad(angleD);

    Araignee bob(data[RAYON_DEPART], data[SPIRALE_DEPART], data[RAYON_ARRIVE], data[SPIRALE_ARRIVE], data[VIBRATIONS], data[RAYONS_TOILE], data[SPIRALES_TOILE]);
    bob.Generate();

    cr = gdk_cairo_create(widget->window);
    cairo_set_line_width (cr, 1.0);

    for(int i = 0; i < data[RAYONS_TOILE]; i++)
    {
        cairo_arc(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2, (data[SPIRALES_TOILE] * 5), i * angleR, i * angleR);
        cairo_line_to(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2);
    }

    for(int i = 0; i < data[SPIRALES_TOILE]; i++)
        cairo_arc(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2, i * radius, 0, 2 * PI);

    cairo_stroke(cr);

    cairo_set_source_rgba(cr, 1, 0.2, 0.2, 0.6);
    cairo_set_line_width(cr, 3.5);

    for(int i = 0; i < data[RAYONS_TOILE]; i++)
        for(int j = 0; j < data[SPIRALES_TOILE]; j++)
            if(bob.Area[i][j] == PATH_OK)
                cairo_arc(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2, j * 5, i * angleR, i * angleR);

    for(int i = 0; i < data[SPIRALES_TOILE]; i++)
        for(int j = 0; j < data[SPIRALES_TOILE]; j++)
            if((bob.Area[(int)(data[RAYONS_TOILE]) - 1][i] == PATH_OK) && (bob.Area[1][j] == PATH_OK))
            {
                cairo_arc(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2, j * 5, 0 * angleR, 0 * angleR);
                cairo_arc(cr, SCALE_CANEVA_X / 2, SCALE_CANEVA_Y / 2, j * 5, 1 * angleR, 1 * angleR);
            }

    cairo_stroke(cr);
    return 0;
}

int ReturnVal(GtkWidget *pButton, gpointer data)
{
    GtkWidget *pTempLabel;
    GtkWidget *dialog;
    GtkWidget *pPixel;
    GList *pList;
    const gchar *String;
    float arg[7];

    pList = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)data));
    pList = g_list_first(pList);
    pList = g_list_next(pList);

    for(int i = 0; i <= 5; i++)
    {
        if(i == 4) pList = g_list_next(pList);
        pTempLabel = GTK_WIDGET(pList->data);
        String = gtk_entry_get_text(GTK_ENTRY(pTempLabel));
        if((sscanf(String, "%f", &(arg[i])) != 1) || (strchr(String, '.') != NULL))
        {
            pList = g_list_last(pList);
            pList = g_list_previous(pList);
            pTempLabel = GTK_WIDGET(pList->data);
            gtk_label_set_text(GTK_LABEL(pTempLabel),"Valeurs numerique requises (Entier)");
            return -1;
        }
        pList = g_list_next(pList);
        pList = g_list_next(pList);
    }

    pList = g_list_next(pList);
    pTempLabel = GTK_WIDGET(pList->data);
    String = gtk_entry_get_text(GTK_ENTRY(pTempLabel));
    if(sscanf(String, "%f", &(arg[VIBRATIONS])) != 1) return -1;
    else
    {
        pList = g_list_last(pList);
        pList = g_list_previous(pList);
        pTempLabel = GTK_WIDGET(pList->data);
        gtk_label_set_text(GTK_LABEL(pTempLabel),"OK");
    }

    g_list_free(pList);

    dialog = gtk_message_dialog_new(NULL,
                                    GTK_DIALOG_MODAL,
                                    GTK_MESSAGE_INFO,
                                    GTK_BUTTONS_OK,
                                    "Rapport genere : out.html");

    pPixel = gtk_drawing_area_new();
    gtk_drawing_area_size(GTK_DRAWING_AREA(pPixel), SCALE_CANEVA_X, SCALE_CANEVA_Y);
    g_signal_connect(G_OBJECT(pPixel), "expose_event", GTK_SIGNAL_FUNC(DrawCanvas), arg);

    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), pPixel, 0, 2, 0);

    gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);

    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);

}

void Graphics()
{
    GtkWidget *pWindow;
    GtkWidget *pVBox;
    GtkWidget *pFrame;
    GtkWidget *pVBoxFrame;
    GtkWidget *pSeparator;
    GtkWidget *pEntry[7];
    GtkWidget *pLabel;
    GtkWidget *pButtom;
    GtkWidget *pResult;

    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_container_set_border_width(GTK_CONTAINER(pWindow), 5);
    gtk_window_set_title(GTK_WINDOW(pWindow), "SpiderACO");
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    pVBox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

    pFrame = gtk_frame_new("Position");
    gtk_box_pack_start(GTK_BOX(pVBox), pFrame, TRUE, FALSE, 0);

    pVBoxFrame = gtk_vbox_new(TRUE, 0);
    gtk_container_add(GTK_CONTAINER(pFrame), pVBoxFrame);

    pLabel = gtk_label_new("RAYON TOILE :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[0] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[0], TRUE, FALSE, 0);

    pLabel = gtk_label_new("SPIRALE TOILE :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[1] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[1], TRUE, FALSE, 0);

    pLabel = gtk_label_new("Rayon depart :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[2] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[2], TRUE, FALSE, 0);

    pLabel = gtk_label_new("Spirale depart :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[3] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[3], TRUE, FALSE, 0);

    pSeparator = gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pSeparator, TRUE, FALSE, 0);

    pLabel = gtk_label_new("Rayon arrive :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[4] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[4], TRUE, FALSE, 0);

    pLabel = gtk_label_new("Spirale arrive :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[5] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[5], TRUE, FALSE, 0);

    pSeparator = gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pSeparator, TRUE, FALSE, 0);

    pLabel = gtk_label_new("Vibration :");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pLabel, TRUE, FALSE, 0);
    pEntry[6] = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pEntry[6], TRUE, FALSE, 0);

    pResult = gtk_label_new("");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pResult, TRUE, FALSE, 0);

    pButtom = gtk_button_new_with_label("Valider");
    gtk_box_pack_start(GTK_BOX(pVBoxFrame), pButtom, TRUE, FALSE, 0);
    g_signal_connect(G_OBJECT(pButtom), "clicked", G_CALLBACK(ReturnVal), (GtkWidget*) pVBoxFrame);

    gtk_widget_show_all(pWindow);

    gtk_main();
}

int main(int argc, char **argv)
{

    gtk_init(&argc, &argv);

    Graphics();

    return 0;
}

Conclusion :


Nécessite l'installation de gtk-2.0, Cairo, Glib.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.