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); }
BOOL cPOLYGON_SPLITTER::PointsAreCollinear(INT index0, INT index1, INT index2) { return PointsCollinear(m_points[index0], m_points[index1], m_points[index2]); }