Beispiel #1
0
void gen_rzut(GtkWidget *widget, gpointer nazwap)
{
    Plane *rzutnia = malloc(sizeof(Plane));
    char *nazwa_pliku = calloc(gtk_entry_buffer_get_length(nazwap)+4, sizeof(char));
    strcpy(nazwa_pliku, gtk_entry_buffer_get_text(nazwap));
    char *temp = nazwa_pliku;
    if(temp[0] == ' ' || temp[0] == '\0')
    {
        pokaz_error("Zla nazwa pliku");
        free(nazwa_pliku); free(rzutnia);
        return;
    }
    while((*temp) != '\0')
    {
        if((*temp) == '\\' || (*temp) == '/' || (*temp) == ':' || (*temp) == '*' ||
           (*temp) == '?' || (*temp) == '"' || (*temp) == '<' || (*temp) == '>' || (*temp) == '|')
        {
            pokaz_error("Zla nazwa pliku");
            free(nazwa_pliku); free(rzutnia);
            return;
        }
        temp++;
    }
    strcat(nazwa_pliku, ".ps");

    int radio1act = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio1));
    char **wart = NULL;
    if(radio1act)
    {
        double wart_abcd[4];
        wart = calloc(4, sizeof(char *));
        for(int i = 0; i < 4; i++)
        {
            wart[i] = calloc(gtk_entry_buffer_get_length(param_buf[i])+2, sizeof(char));
            strcpy(wart[i], gtk_entry_buffer_get_text(param_buf[i]));
            napraw_wejscie(wart, i);
            wart_abcd[i] = strtod(wart[i], NULL);
        }
        for(int i = 0; i < 4; i++)
            if(wart_abcd[i] == 0.0 && wart[i][0] != '0')
            {
                pokaz_error("Blad danych wejsciowych");
                for(int j = 0; j < 4; j++)
                    free(wart[j]);
                free(wart); free(nazwa_pliku); free(rzutnia);
                return;
            }

        if(wart_abcd[0] == 0.0 && wart_abcd[1] == 0.0 && wart_abcd[2] == 0.0)
        {
            pokaz_error("Parametry A, B, C nie moga byc jednoczesnie rowne 0");
            for(int j = 0; j < 4; j++)
                free(wart[j]);
            free(wart); free(nazwa_pliku); free(rzutnia);
            return;
        }
        for(int i = 0; i < 4; i++)
            rzutnia->prm[i] = wart_abcd[i];
    }
    else // radio2 aktywne
    {
        double wart_xyz[3][3];
        wart = calloc(3*3, sizeof(char *));
        for(int i = 0; i < 3*3; i++)
        {
            wart[i] = calloc(gtk_entry_buffer_get_length(pkty_buf[i/3][i-3*(i/3)])+2, sizeof(char));
            strcpy(wart[i], gtk_entry_buffer_get_text(pkty_buf[i/3][i-3*(i/3)]));
            napraw_wejscie(wart, i);
            wart_xyz[i/3][i-3*(i/3)] = strtod(wart[i], NULL);
        }
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                if(wart_xyz[i][j] == 0.0 && wart[3*i+j][0] != '0')
                {
                    pokaz_error("Blad danych wejsciowych");
                    for(int k = 0; k < 3*3; k++)
                        free(wart[k]);
                    free(wart); free(nazwa_pliku); free(rzutnia);
                    return;
                }

        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                rzutnia->P[i].wsp[j] = wart_xyz[i][j];

        if(PointsIdentical(rzutnia->P[0], rzutnia->P[1]) || PointsIdentical(rzutnia->P[0], rzutnia->P[2]) ||
           PointsIdentical(rzutnia->P[1], rzutnia->P[2]) || PointsCollinear(rzutnia->P[0], rzutnia->P[1], rzutnia->P[2]))
        {
            pokaz_error("Przez podane punkty nie da sie jednoznacznie poprowadzic plaszczyzny rzutni");
            for(int k = 0; k < 3*3; k++)
                free(wart[k]);
            free(wart); free(nazwa_pliku); free(rzutnia);
            return;
        }

        ABCD_Plane(rzutnia); // liczymy reprezentacje normalna plaszczyzny rzutni
    }
    FILE *plik = NULL;
    plik = fopen(nazwa_pliku, "r");
    if(plik != NULL)
    {
        int odp = 0;
        pokaz_pytanie("Nadpisac?", "Plik o tej nazwie juz istnieje. Czy chcesz go nadpisac?", (gpointer) &odp);
        if(odp)
        {
            fclose(plik);
            plik = fopen(nazwa_pliku, "w");
            if(plik == NULL)
            {
                pokaz_error("Nie udalo sie stworzyc pliku");
                czysc_pamiec_radio(radio1act, wart);
                free(nazwa_pliku); free(rzutnia);
                return;
            }
        }
        else
        {
            czysc_pamiec_radio(radio1act, wart);
            free(nazwa_pliku); free(rzutnia);
            return;
        }
    }
    else
    {
        plik = fopen(nazwa_pliku, "w");
        if(plik == NULL)
        {
            pokaz_error("Nie udalo sie stworzyc pliku");
            czysc_pamiec_radio(radio1act, wart);
            free(nazwa_pliku); free(rzutnia);
            return;
        }
    }

    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio1metoda)))
        renderuj_wireframe(plik, rzutnia, lista_obj);
    else
        renderuj_hidden_face_removal(plik, rzutnia, lista_obj);

    fclose(plik);
    pokaz_info("Rysowanie rzutu zakonczone powodzeniem");
    czysc_pamiec_radio(radio1act, wart);
    free(nazwa_pliku); free(rzutnia);
}
Beispiel #2
0
  BOOL cPOLYGON_SPLITTER::PointsAreCollinear(INT index0, INT index1, INT index2)
  {
	return PointsCollinear(m_points[index0], m_points[index1], m_points[index2]);
  }