Chiusura dell'eseguibile

di il
7 risposte

Chiusura dell'eseguibile

Buongiorno ragazzi,
premetto che sono nuovo della programmazione, più che altro mi serve per simulare su pc degli algoritmi di macro che dovrò convertire poi per macchine utensili. L'IDE che sto usando è il DEV-C++ 5.5.3.
Sto facendo una macro che mi crea la geometria di una torx. Ho 2 problemi il primo è che quando avvio la compilazione mi esce questo errore[img]
Immagine1.png
Immagine1.png

[/img], causato dalla funzione "sistemaCirconferenzaRetta" e non riesco a capire il perchè. Poi quando finisco di inserire i dati relativi alla torx nell'eseguibile, wndows me lo chiude. La parte del programma che mi causa questa cosa l'ho individuata ed è nel ciclo for presente nel main...
Ora vi posto l'intero programma cosicchè possiate verificare anche voi!
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <math.h>

using namespace std;

//Dichiarazione della costante globale PI_GRECO
const double PI_GRECO = 3.141592653589793238462643383279502884197169399;

//Prototipi delle funzioni
double radianti(double gradi);
double gradi(double radianti);
double teoremaPitagora(bool ipotenusaOcateto, double a, double b);
void polarizzaPunto(bool pianoVista, double *coordinate, double angolo, short int numeroPunti, double *coordinatePolarizzate);
void circonferenza(double *datiCirconferenza, double *equazioneCirconferenza);
void asseRadicale(double *equazioneCirconferenza1,double *equazioneCirconferenza2, double *rettaRisultante);
void formulaEq_2(double *equazioneSecondoGrado, double *soluzioni);
void sistemaCirconferenzaRetta(double *equazioneCirconferenza, double *equazioneRetta, double *coordinate);
double misuraGradiTra2Rette(bool misuraAngoloMaggioreOminore, double *coordinatePuntoPrimaRetta, double *coordinatePuntoSecondaRetta);
void centroRaccordoTraCirconferenzeConcavaConvessa(double *datiCirconferenzaConcava, double *datiCirconferenzaConvessa, double raggioRaccordo, double *centroRaccordo);
void puntoTangenzaTraCirconferenze(double *dati_circonferenza1, double *dati_circonferenza2, double *puntoTangenza);

int main() {
	//Variabili di input
	double datiCircConves[3]={},datiCircConcav[3]={},datiRaccordo[3]={};
	short int numeroLobiTorx=0;
	double rT=0;
	bool maschio_femmina=false;
	
	//Variabili di lavoro
	short int limitePunti=0;
	bool pianoVista=false;	
	double supportoCircConves[2]={}, supportoCircConcav[2]={}, supportoCircRaccordo[4]={};
	double angoloIncr=0;//
	double punti[64]={}, supportoPunti[2]={};//Variabile che conterrà le coordinate ascissa/ordinata dei punti che formeranno la geometria torx
	double misuraAngolo=0;
	
	cout<<"******* Torx *******\n\n\n";
	
	cout<<"\t\tDefinizione della geometria della torx \n\t(Fare riferimento alla geometria come se fosse sempre un torx maschio)";	
	cout<<"\n\nDistanza del centro della circonferenza convessa dall'origine: ";
	cin>>datiCircConves[0];
	cout<<"Raggio della circonferenza convessa: ";
	cin>>datiCircConves[2];
	cout<<"\nDistanza del centro della circonferenza concava dall'origine: ";
	cin>>datiCircConcav[0];
	cout<<"Raggio della circonferenza concava: ";
	cin>>datiCircConcav[2];
	cout<<"\nRaggio del raccordo tra le due circonferenze: ";
	cin>>datiRaccordo[2];
	cout<<"\nNumero dei lobi della torx [MAX 8]: ";
	cin>>numeroLobiTorx;

	cout<<"\n\n\t\tDefinizione dell'utensile usato";	
	cout<<"\n\nRaggio utensile: ";
	cin>>rT;

	cout<<"\n\nTorx maschio[1], torx femmina[0]: ";
	cin>>maschio_femmina;
	
	/*cout<<"\n\n\t\tSvincoli e approcci";	
	cout<<"\n\nRaggio della barra: ";
	cin>>raggioBarra;
	cout<<"Margine di sicurezza: ";
	cin>>gapSicurezza;*/

														/*Elaborazione*/
	supportoCircConves[0] = datiCircConves[0];//Assegno a questa variabile di supporto la distanza del centro della circonferenza dall'origine per poterla polarizzare
	angoloIncr = 360 / numeroLobiTorx;//Angolo di incremento
	limitePunti = 8 * numeroLobiTorx;//Calcolo delle coordinate totali ascisse/ordinate dei punti che formano la geometria torx
	if(maschio_femmina == true)//Cambio segno dell'angolo in base alla lavorazione da fare per rimanere con l'utensile concorde alla geometria torx
		angoloIncr = -angoloIncr;
	polarizzaPunto(pianoVista,supportoCircConves,(angoloIncr/2),1,supportoCircConves);//Traslazione angolare delle coordinate del centro circonferenza convessa
	datiCircConves[0] = supportoCircConves[0];//Assegno la nuova ascissa 
	datiCircConves[1] = supportoCircConves[1];//Assegno la nuova ordinata
	centroRaccordoTraCirconferenzeConcavaConvessa(datiCircConcav,datiCircConves,datiRaccordo[2],supportoCircRaccordo);//Calcolo delle coordinate del centro raccordo
	datiRaccordo[0] = supportoCircRaccordo[0];//Assegno l'ascissa del centro raccordo alla variabile definitiva
	datiRaccordo[1] = supportoCircRaccordo[1];//Assegno l'ordinata del centro raccordo alla variabile definitiva
	//Compensazione dei raggi delle relative circonferenze in base al raggio utensile utilizzato e al tipo di lavorazione da fare se maschio o femmina
	if(maschio_femmina == false){
		datiCircConcav[2] += rT;//Ridimensionamento del raggio della circonferenza concava in base al raggio utensile
		datiCircConves[2] -= rT;//Ridimensionamento del raggio della circonferenza convessa in base al raggio utensile
		datiRaccordo[2] += rT;//Ridimensionamento del raggio del raccordo in base al raggio utensile
	}
	else{
		datiCircConcav[2] -= rT;//Ridimensionamento del raggio della circonferenza concava in base al raggio utensile
		datiCircConves[2] += rT;//Ridimensionamento del raggio della circonferenza convessa in base al raggio utensile
		datiRaccordo[2] -= rT;//Ridimensionamento del raggio del raccordo in base al raggio utensile
	}
	supportoCircConcav[0] = datiCircConcav[0];
	supportoCircConcav[1] = datiCircConcav[1];

	//Questo ciclo for è quello che mi causa la chiusura dell'eseguibile da parte di windows
	for(short int i=0; i<(limitePunti-2); i+=2){
		if(i < 4){//Calcolo dei punti che formano la geometria torx
			if(i == 0){
				puntoTangenzaTraCirconferenze(datiCircConcav,datiRaccordo,supportoPunti);
				punti[limitePunti-2] = supportoPunti[0];
				punti[limitePunti-1] = -supportoPunti[1];
			}
			else
				puntoTangenzaTraCirconferenze(datiCircConves,datiRaccordo,supportoPunti);
		}
		else{
			if(i == 4){
				supportoCircConves[0] = punti[i-2];
				supportoCircConves[1] = punti[i-1];
				supportoCircConcav[0] = datiCircConves[0];
				supportoCircConcav[1] = datiCircConves[1];
				misuraAngolo = misuraGradiTra2Rette(false,supportoCircConcav,supportoCircConves);
				misuraAngolo *= 2;
				polarizzaPunto(pianoVista,supportoCircConves,misuraAngolo,1,supportoCircConves);
				supportoPunti[i] = supportoCircConves[0];
				supportoPunti[i+1] = supportoCircConves[1];
			}
			else{
        		if(i == 6){
        			supportoPunti[i] = punti[limitePunti-2];
        			supportoPunti[i+1] = punti[limitePunti-1];
        		}
        		else{
        			supportoPunti[i] = punti[i-4];
        			supportoPunti[i+1] = punti[i-3];
        		}
				polarizzaPunto(pianoVista,supportoPunti,angoloIncr,1,supportoPunti);
			}
		}
		punti[i] = supportoPunti[i];
		punti[i+1] = supportoPunti[i+1];
	}

	
	
	fflush(stdin);
	getchar();
	return 0;
}

/*Funzione--> che trasforma i gradi in radianti*/
double radianti(double gradi){
	return (gradi * PI_GRECO * 2) / 360;
}

/*Funzione--> che trasforma i radianti in gradi*/
double gradi(double radianti){
	return (radianti * 360) / (PI_GRECO * 2);
}

/*Funzione che calcola la lunghezza dell'ipotenusa o di un cateto di un triangolo rettangolo in base opzione scelta.
-ipotenusaOcateto= variabile booleana che permette di scegliere se si vuole la lunghezza dell'ipotenusa o di uno dei 2 cateti:
	true= calcola la lunghezza dell'ipotenusa;
	false= calcola la lunghezza di uno dei 2 cateti.
-a= lunghezza che può essere in base alla scelta iniziale dell'ipotenusa o di uno dei 2 cateti.
-b= lunghezza di un cateto.*/
double teoremaPitagora(bool ipotenusaOcateto, double a, double b){
	if(ipotenusaOcateto == true)
		return sqrt(pow(a,2) + pow(b,2));
	else
		return sqrt(pow(a,2) - pow(b,2));
}

/*Funzione--> che restituisce le coordinate dei punti polari di un punto.
Parametri della funzione:
- pianoVista= indica il piano su cui giace la retta e può assumere solo 2 valori: 
	pianoVista=0-->XY e YZ;
	pianoVista=1-->XZ.
- coordinate[0]= coordinata X o Y (ascissa che dipende dal piano scelto) del punto P di input.
- coordinate[1]= coordinata Y o Z (ordinata che dipende dal piano scelto) del punto P di input.
- angolo= angolo di rotazione/traslazione attorno l'origine dei punti polari di output [in gradi].
- numeroPunti= numero di punti da polarizzare.
- coordinatePolarizzate= vettore di output che contiene le coordinate polari dei punti:
	coordinatePolarizzate[numero pari]= valore di coordinata dell'ascissa del punto polare;
	coordinatePolarizzate[numero dispari]= valore di coordinata dell'ordinata del punto polare.*/
void polarizzaPunto(bool pianoVista, double *coordinate, double angolo, short int numeroPunti, double *coordinatePolarizzate){
	short int contatorePosizionePunto=1;
	double ascissa=0, ordinata=0;
	double distanzaOrigine=0;
	double teta=0;
				//Elaborazione
	ascissa = coordinate[0];
	ordinata = coordinate[1];
	angolo = radianti(angolo);
	distanzaOrigine = teoremaPitagora(true,ascissa,ordinata);//Calcolo della distanza del punto dall'origine
	if(ascissa == 0){
		if(pianoVista == false){
			if(ordinata > 0)
				teta = PI_GRECO * 0.5;//90°
			else
				teta = PI_GRECO * 1.5;//270°
		} 
		else{
			if(ordinata > 0)
				teta = 0;//0°
			else
				teta = PI_GRECO;//180°
		}
	}
	else{
		teta = ordinata / ascissa;//Calcolo dell'angolo che forma la retta OriginePunto rispetto all'ascissa
		teta = atan(teta);
		if(pianoVista == false){
			if(ascissa < 0)
				teta = PI_GRECO + teta;//180°+teta
		}
		else{
			if(ascissa > 0)
				teta = (PI_GRECO * 0.5) - teta;//90°-teta
			else
				teta = (PI_GRECO * 1.5) - teta;//270°-teta
		}
	}	
	for(short int i=0; i<(numeroPunti*2); i++)
		if(i%2 == 0){//Calcolo del valore dell'ascissa
			if(i >= 2){
				contatorePosizionePunto++;
				angolo *= contatorePosizionePunto;
			}
			angolo += teta;//Incremento dell'angolo teta dell'angolo inserito
			if(pianoVista == false)
				coordinatePolarizzate[i] = distanzaOrigine * cos(angolo);
			else
				coordinatePolarizzate[i] = distanzaOrigine * sin(angolo);
		}
		else{//Calcolo del valore dell'ordinata
			if(pianoVista == false)
				coordinatePolarizzate[i] = distanzaOrigine * sin(angolo);
			else
				coordinatePolarizzate[i] = distanzaOrigine * cos(angolo);
			angolo -= teta;//Decremento dell'angolo teta dell'angolo inserito
			if(i >= 3)
				angolo /= contatorePosizionePunto;
		}
}

/*Funzione--> che restituisce in un vettore i coefficienti dell'equazione di una circonferenza; per motivi di semplificazione, tale funzione restituisce
solo i coefficienti delle incognite x e y con esponente 1 ed il termine noto dell'equazione di secondo grado della circonferenza, visto che nelle equazioni delle
circonferenze i coefficienti di x^2 ed y^2 sono sempre 1.
Parametri della funzione:
- datiCirconferenza[0]= coordinata dell'ascissa del centro circonferenza;
- datiCirconferenza[1]= coordinata dell'ordinata del centro circonferenza;
- datiCirconferenza[2]= raggio della circonferenza;
- *equazioneCirconferenza= vettore di 3 elementi che conterrà solo i coefficienti dell'equazione di secondo grado della circonferenza con esponente 1 ed il termine noto.*/
void circonferenza(double *datiCirconferenza, double *equazioneCirconferenza){
	equazioneCirconferenza[0] = (-2) * datiCirconferenza[0];//Coefficiente di x
	equazioneCirconferenza[1] = (-2) * datiCirconferenza[1];//Coefficiente di y
	equazioneCirconferenza[2] = pow(datiCirconferenza[0],2) + pow(datiCirconferenza[1],2) - pow(datiCirconferenza[2],2);//Valore noto senza incognita
}

/*Funzione--> che restituisce i coefficienti dell'equazione della retta dell'asse radicale tra due circonferenze.
Parametri della funzione:
-equazioneCirconferenza1[0]= coefficiente dell'incognita x con esponente 1 dell'equazione di secondo grado della prima circonferenza
-equazioneCirconferenza1[1]= coefficiente dell'incognita y con esponente 1 dell'equazione di secondo grado della prima circonferenza
-equazioneCirconferenza1[2]= termine noto dell'equazione di secondo grado della prima circonferenza
-equazioneCirconferenza2[0]= coefficiente dell'incognita x con esponente 1 dell'equazione di secondo grado della seconda circonferenza
-equazioneCirconferenza2[1]= coefficiente dell'incognita y con esponente 1 dell'equazione di secondo grado della seconda circonferenza
-equazioneCirconferenza2[2]= termine noto dell'equazione di secondo grado della seconda circonferenza;
-rettaRisultante[0]= elemento che contiene:
	-il valore dell'ordinata della retta se m e q sono uguali a zero 0;
	-0 se m è diverso da zero e q è uaguale a zero;
	-1 se m e q sono diversi da zero.
-rettaRisultante[1]= elemento che contiene:
	- il valore dell'ascissa x se y e q sono uguali a zero 0;
	- 0 se y è diverso da zero 0 e q è uguale a zero 0;
	- il valore del coefficiente angolare se y è uguale a 1 e q è diverso da zero 0.
-rettaRisultante[2]= elemento che contiene:
	- 0 se la y è diverso da zero 0 e la m è uguale a zero 0;
	- 0 se la y è uguale a zero 0 e la m è diversa da zero 0;
	- il valore dell'intercetta dell'equazione della retta.*/
void asseRadicale(double *equazioneCirconferenza1,double *equazioneCirconferenza2, double *rettaRisultante){
	/*Differenza tra le equazioni di secondo grado delle due circonferenze; ovviamente non ci sono le differenze tra i 
	coefficienti delle incognite con esponente al quadrato perchè sarà sempre zero...*/
	rettaRisultante[1] = equazioneCirconferenza1[0] - equazioneCirconferenza2[0];//Differenza tra i coefficienti delle incognite x con esponente 1 delle 2 circonferenze 
	rettaRisultante[0] = equazioneCirconferenza1[1] - equazioneCirconferenza2[1];//Differenza tra i coefficienti delle incognite y con esponente 1 delle 2 circonferenze 
	rettaRisultante[2] = equazioneCirconferenza1[2] - equazioneCirconferenza2[2];//Differenza tra i termini noti delle 2 circonferenze 
	rettaRisultante[2] = -rettaRisultante[2];//Trasporto dell'intercetta q dall'altro lato dell'uguale

	if(rettaRisultante[0] == 0 || rettaRisultante[1] == 0){//Caso in cui l'asse radicale è sia orizzontale quindi 0° che verticale quindi 90° 
		if(rettaRisultante[1] == 0)//Caso in cui l'asse radicale è 0°
			rettaRisultante[0] = rettaRisultante[2] / rettaRisultante[0];//Rapporto tra l'intercetta e il coefficiente di y; corrisponde all'equazione dell'asse radicale
		else//Caso in cui l'asse radicale è 90°
			rettaRisultante[1] = rettaRisultante[2] / rettaRisultante[1];//Rapporto tra l'intercetta e il coefficiente di x; corrisponde all'equazione dell'asse radicale
		rettaRisultante[2] = 0;//Azzeramento dell'intercetta
	}
	else{
		rettaRisultante[1] = -rettaRisultante[1];//Trasporto del coefficiente angolare m dall'altro lato dell'uguale
		rettaRisultante[1] /= rettaRisultante[0];//Rapporto tra il coefficiente angolare m e la y
		rettaRisultante[2] /= rettaRisultante[0];//Rapporto tra l'intercetta q e la y
		rettaRisultante[0] = 1;//Imposto a 1 la y
	}
}

/*Funzione--> che restituisce in un vettore le eventuali soluzioni di un'eqauzione di secondo grado passata alla funzione.
Parametri della funzione:
-equazioneSecondoGrado[0]= contiene il coefficiente dell'incognita con esponente quadro
-equazioneSecondoGrado[1]= contiene il coefficiente dell'incognita con esponente 1
-equazioneSecondoGrado[2]= contiene il termine noto
- *soluzioni= contiene le due soluzioni ricavate dalla formula risolutiva.*/
void formulaEq_2(double *equazioneSecondoGrado, double *soluzioni){
	double supportoEquazioneSecondoGrado[3]={};//Conterrà i valori dell'equazione di secondo grado passata
	double delta=0;
	for(short int i=0; i<3; i++)
		supportoEquazioneSecondoGrado[i] = equazioneSecondoGrado[i];
	delta = pow(supportoEquazioneSecondoGrado[1],2) - (4 * supportoEquazioneSecondoGrado[0] * supportoEquazioneSecondoGrado[2]);
	if(delta <=0.0001 && delta >=-0.0001){
		soluzioni[0] = (-supportoEquazioneSecondoGrado[1]) / (2 * supportoEquazioneSecondoGrado[0]);
		soluzioni[1] = soluzioni[0];
	}
	 else{
		soluzioni[0] = ((-supportoEquazioneSecondoGrado[1]) + sqrt(delta)) / (2 * supportoEquazioneSecondoGrado[0]);
		soluzioni[1] = ((-supportoEquazioneSecondoGrado[1]) - sqrt(delta)) / (2 * supportoEquazioneSecondoGrado[0]);
	}
}

/*Funzione--> che restituisce in un vettore le coordinate dei punti d'intersezione tra una circonferenza ed una retta.
Parametri della funzione:
- equazioneCirconferenza[0]= incognita x con esponente 1 dell'equazione di secondo grado della circonferenza;
- equazioneCirconferenza[1]= incognita y con esponente 1 dell'equazione di secondo grado della circonferenza;
- equazioneCirconferenza[2]= termine noto dell'equazione di secondo grado della circonferenza;
- equazioneRetta[0]= valore di y;
- equazioneRetta[1]= coefficiente angolare m della retta;
- equazioneRetta[2]= intercetta della retta;
- *coordinate= contiene le coordinate dei punti d'intersezione tra la circonferenza e la retta.
	coordinate[0]= coordinata X del primo punto;
	coordinate[1]= coordinata Y del primo punto;
	coordinate[2]= coordinata X del secondo punto;
	coordinate[3]= coordinata Y del secondo punto.*/
void sistemaCirconferenzaRetta(double *equazioneCirconferenza, double *equazioneRetta, double *coordinate){
	double supportoCirconferenza[3]={};//Si assegneranno a questo vettore i valori contenuti nell'array equazioneCirconferenza
	double supportoRetta[3]={};//Si assegneranno a questo vettore i valori contenuti nell'array equazioneRetta
	double sistemaCirc_Retta[3]={};//Verranno assegnati a questo vettore i coefficienti dell'equazione di secondo grado risultante dal sistema Circonferenza/Retta
	double supportoCoordinate[2]{};//Verranno assegnati i valori di passaggio delle coordinate calcolate
	double temp=0;//Variabile temporanea 
	for(short int i=0; i<3; i++){
		supportoCirconferenza[i] = equazioneCirconferenza[i];
		supportoRetta[i] = equazioneRetta[i];
	}
	if((equazioneRetta[1] == 0 && equazioneRetta[2] == 0) || (equazioneRetta[0] == 0 && equazioneRetta[2] == 0))
		if(equazioneRetta[1] == 0)//Caso in cui la retta risultante ha un angolo uguale a 0° o 180°
			supportoRetta[2] = supportoRetta[0];//Assegno all'elemento q il valore di y per poterlo utilizzare nel calcolo del termine noto dell'equazione risultante del sistema	
		else{//Caso in cui la retta risultante ha un angolo uguale a 90° o 270°
			supportoRetta[2] = supportoRetta[1];
			supportoRetta[1] = 0;
			supportoRetta[0] = supportoCirconferenza[0];
			supportoCirconferenza[0] = supportoCirconferenza[1];
			supportoCirconferenza[1] = supportoRetta[0];
		}
	sistemaCirc_Retta[0] = 1 + pow(supportoRetta[1],2);//x^2
	sistemaCirc_Retta[1] = (2 * supportoRetta[1] * supportoRetta[2]) + supportoCirconferenza[0] + (supportoCirconferenza[1] * supportoRetta[1]);//x
	sistemaCirc_Retta[2] = pow(supportoRetta[2],2) + (supportoCirconferenza[1] * supportoRetta[2]) + supportoCirconferenza[2];//termine noto
	//Ricavo con la formula risolutiva dell'equazione generica di secondo grado le prime coordinate X o Y
	formulaEq_2(sistemaCirc_Retta,supportoCoordinate);
	coordinate[0] = supportoCoordinate[0];//Assegno della prima soluzione trovata
	coordinate[1] = supportoCoordinate[1];//Assegno della seconda soluzione trovata
	if((equazioneRetta[1] == 0 && equazioneRetta[2] == 0) || (equazioneRetta[0] == 0 && equazioneRetta[2] == 0))
		if(equazioneRetta[1] == 0){//Caso in cui la retta risultante ha un angolo uguale a 0° o 180°
			coordinate[2] = equazioneRetta[0];//Assegno del valore Y al primo punto
			coordinate[3] = coordinate[2];//Assegno del valore Y al secondo punto
		}
		else{//Caso in cui la retta risultante ha un angolo uguale a 90° o 270°
			coordinate[0] = equazioneRetta[1];
			coordinate[1] = coordinate[0];
			coordinate[2] = supportoCoordinate[0];
			coordinate[3] = supportoCoordinate[1];
		}
	else{
		coordinate[2] = (equazioneRetta[1] * coordinate[0]) + equazioneRetta[2];//Calcolo dell'ordinata Y1 del primo punto
		coordinate[3] = (equazioneRetta[1] * coordinate[1]) + equazioneRetta[2];//Calcolo dell'ordinata Y2 del secondo punto
	}
	temp = coordinate[1];
	coordinate[1] = coordinate[2];
	coordinate[2] = temp;
}

/*Funzione che restituisce la misura dell'angolo (in °) maggiore o minore compreso tra due rette.
-misuraAngoloMaggioreOminore= permette all'utente di definire l'angolo voluto, se il maggiore o minore formato dalle 2 rette.
-coordinatePuntoPrimaRetta= vettore che contiene le coordinate di ascissa e ordinata di un qualsiasi punto appartenente alla prima retta;
	coordinatePuntoPrimaRetta[0]= ascissa del punto generico appartenente alla prima retta;
	coordinatePuntoPrimaRetta[1]= ordinata del punto generico appartenente alla prima retta.
-coordinatePuntoSecondaRetta= vettore che contiene le coordinate di ascissa e ordinata di un qualsiasi punto appartenente alla seconda retta;
	coordinatePuntoSecondaRetta[0]= ascissa del punto generico appartenente alla seconda retta;
	coordinatePuntoSecondaRetta[1]= ordinata del punto generico appartenente alla seconda retta.*/
double misuraGradiTra2Rette(bool misuraAngoloMaggioreOminore, double *coordinatePuntoPrimaRetta, double *coordinatePuntoSecondaRetta){
	double ascissa=0, ordinata=0;
	double distanzaOrigine=0;
	double alpha=0, beta=0, gamma=0;
						//Elaborazione
	for(short int i=0; i<2; i++){//Assegno alle rispettive variabili di supporto le relative coordinate dei punti inseriti
		if(i%2 == 0){
			ascissa = coordinatePuntoPrimaRetta[0];
			ordinata = coordinatePuntoPrimaRetta[1];
		}
		else{
			ascissa = coordinatePuntoSecondaRetta[0];
			ordinata = coordinatePuntoSecondaRetta[1];
		}
		distanzaOrigine = teoremaPitagora(true,ascissa,ordinata);//Calcolo della distanza del punto dall'origine
		if(ascissa == 0)
			if(ordinata > 0)
				gamma = PI_GRECO * 0.5;//90°
			else
				gamma = PI_GRECO * 1.5;//270°
		else
			if(ascissa < 0 && ordinata == 0)
				gamma = PI_GRECO;//180°
			else{
				gamma = ordinata / ascissa;//Calcolo dell'angolo che forma la retta OriginePunto rispetto all'ascissa
				gamma = atan(gamma);
				if(ascissa < 0)
					gamma = PI_GRECO + gamma;
    			else 
					if(ordinata < 0)
				 		gamma = (PI_GRECO * 2) + gamma;
			}
		if(i%2 == 0)
			alpha = gamma;
		else
			beta = gamma;
	}
	if(alpha >= beta)
		gamma = alpha - beta;
	else
		gamma = beta - alpha;
	gamma = gradi(gamma);
	if(misuraAngoloMaggioreOminore == false)
		if(gamma <= 180)
			return gamma;
		else
			return 360 - gamma;
	else
		if(gamma <= 180)
			return 360 - gamma;
		else
			return gamma;
}

/*Funzione--> che restituisce in un vettore le coordinate dei centro del raccordo tra 2 circonferenze che sono tra loro Concava/Convessa.
Come riferimento ho preso in considerazione la prospettiva vista dall'esterno della geometria, perchè con vista dall'interno ovviamente le condizioni
di concavità e convessità cambiano, ma questo non influisce sulla formula, ma nell'inserimento dei dati di input, 
perchè per poter fare i giusti calcoli devono essere specificate quale è la circonferenza concava e quale la convessa.
Parametri della funzione:
- dati_circonferenza1[0]= valore di coordinata ascissa della prima circonferenza; 
- dati_circonferenza1[1]= valore di coordinata ordinata della prima circonferenza;
- dati_circonferenza1[2]= valore del raggio della prima circonferenza;
- dati_circonferenza2[0]= valore di coordinata ascissa della seconda circonferenza; 
- dati_circonferenza2[1]= valore di coordinata ordinata della seconda circonferenza;
- dati_circonferenza2[2]= valore del raggio della seconda circonferenza;
- raggioRaccordo= valore del raggio del raccordo;
- *centroRaccordo= contiene le coordinate del centro del raccordo.
	centroRaccordo[0]= coordinata X del centro del primo raccordo;
	centroRaccordo[1]= coordinata Y del centro del primo raccordo.*/
void centroRaccordoTraCirconferenzeConcavaConvessa(double *datiCirconferenzaConcava, double *datiCirconferenzaConvessa, double raggioRaccordo, double *centroRaccordo){
	//Dichiarazione dei vettori locali
	double eqCirconferenzaConcava[3]={};//Vettore locale di 3 elementi che conterrà la parte di 1° grado dell'equazione della circonferenza concava
	double eqCirconferenzaConvessa[3]={};//Vettore locale di 3 elementi che conterrà la parte di 1° grado dell'equazione della circonferenza convessa
	double eqAsseRadicale[3]={};//Vettore locale di 3 elementi che conterrà l'equazione di 1° grado dell'asse radicale ottenuto
	double supportoRaggioCircConcava=0;//Contiene la lunghezza del raggio della circonferenza concava che sarà poi ripristinato a fine funzione
	double coordinateP1[2]={};//Vettore che contiene i dati del punto P1
	double coordinateP2[2]={};//Vettore che contiene i dati del punto P2
	double gradiCompresiTraRette[2]={};//Vettore che contiene i gradi dell'angolo minore compreso tra 2 rette, nel caso specifico serve a determinare il centro del raccordo che ci serve
								//Elaborazione
	supportoRaggioCircConcava = datiCirconferenzaConcava[2];//Assegno il valore del raggio della circonferenza concava alla variabile di supporto
	datiCirconferenzaConcava[2] = raggioRaccordo - datiCirconferenzaConcava[2];
	datiCirconferenzaConvessa[2] += raggioRaccordo;
	//Equazioni delle 2 circonferenze
	circonferenza(datiCirconferenzaConcava,eqCirconferenzaConcava);
	circonferenza(datiCirconferenzaConvessa,eqCirconferenzaConvessa);
	//Calcolo dell'equazione dell'asse radicale
	asseRadicale(eqCirconferenzaConcava,eqCirconferenzaConvessa,eqAsseRadicale);
	//Calcolo dei punti d'intersezione tra la circonferenza concava e l'asse radicale ricavato
	sistemaCirconferenzaRetta(eqCirconferenzaConcava,eqAsseRadicale,centroRaccordo);
	coordinateP1[0] = centroRaccordo[0];//Assegno ascissa del punto P1
	coordinateP1[1] = centroRaccordo[1];//Assegno ordinata del punto P1
	coordinateP2[0] = centroRaccordo[2];//Assegno ascissa del punto P2
	coordinateP2[1] = centroRaccordo[3];//Assegno ordinata del punto P2
	//Ripristino dei valori dei raggi delle circonferenze iniziali
	datiCirconferenzaConcava[2] = supportoRaggioCircConcava;
	datiCirconferenzaConvessa[2] -= raggioRaccordo;
	gradiCompresiTraRette[0] = misuraGradiTra2Rette(false,datiCirconferenzaConcava,coordinateP1);
	gradiCompresiTraRette[1] = misuraGradiTra2Rette(false,datiCirconferenzaConcava,coordinateP2);
	if(gradiCompresiTraRette[1] < gradiCompresiTraRette[0]){
		centroRaccordo[0] = centroRaccordo[2];			
		centroRaccordo[1] = centroRaccordo[3];			
	}
}

/*Funzione--> che restituisce in un vettore le coordinate del punto di tangenza tra 2 circonferenze.
Parametri della funzione:
- dati_circonferenza1[0]= valore di coordinata ascissa della prima circonferenza; 
- dati_circonferenza1[1]= valore di coordinata ordinata della prima circonferenza;
- dati_circonferenza1[2]= valore del raggio della prima circonferenza;
- dati_circonferenza2[0]= valore di coordinata ascissa della seconda circonferenza; 
- dati_circonferenza2[1]= valore di coordinata ordinata della seconda circonferenza;
- dati_circonferenza2[2]= valore del raggio della seconda circonferenza;
- *puntoTangenza= contiene le coordinate del punto d'intersezione tra le 2 circonferenze.
	puntoTangenza[0]= coordinata X del punto di tangenza;
	puntoTangenza[1]= coordinata Y del punto di tangenza.*/
void puntoTangenzaTraCirconferenze(double *dati_circonferenza1, double *dati_circonferenza2, double *puntoTangenza){
	//Dichiarazione dei vettori locali
	double equazione_circonferenza1[3]={};//Vettore locale di 3 elementi che conterrà la parte di 1° grado dell'equazione della prima circonferenza
	double equazione_circonferenza2[3]={};//Vettore locale di 3 elementi che conterrà la parte di 1° grado dell'equazione della secondaa circonferenza
	double equazione_asseRadicale[3]={};//Vettore locale di 3 elementi che conterrà l'equazione di 1° grado dell'asse radicale ottenuto
	//Equazioni delle 2 circonferenze
	circonferenza(dati_circonferenza1,equazione_circonferenza1);
	circonferenza(dati_circonferenza2,equazione_circonferenza2);
	//Calcolo dell'equazione dell'asse radicale
	asseRadicale(equazione_circonferenza1,equazione_circonferenza2,equazione_asseRadicale);
	//Calcolo dei centri raccordi mediante il sistema circonferenza/retta
	sistemaCirconferenzaRetta(equazione_circonferenza1,equazione_asseRadicale,puntoTangenza);
}
Un saluto e un grazie a chi saprà aiutarmi!

7 Risposte

  • Re: Chiusura dell'eseguibile

    Sono riuscito a risolvere il secondo problema, avevo fatto un po' di cappellate
    Però se qualcuno mi sa dire come risolvere il primo, ne sarei grato!
  • Re: Chiusura dell'eseguibile

    L'errore non si vede
  • Re: Chiusura dell'eseguibile

    L'errore è:
    C:\Users\Roberto\Desktop\R-CAM\Torx\Torx.cpp In function 'void sistemaCirconferenzaRetta(double*, double*, double*)':
    352 29 C:\Users\Roberto\Desktop\R-CAM\Torx\Torx.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

    Comunque l'eseguibile viene lanciato correttamente ed il programma gira bene.
    Grazie
  • Re: Chiusura dell'eseguibile

    E' un warning che puoi ignorare finché usi questo compilatore.
  • Re: Chiusura dell'eseguibile

    Ah ok grazie

    Senti vorrei chiederti un'ultima cosa se posso!
    Io vorrei, oltre a farmi stampare a video i dati di output, salvarli in un file txt, come si fa?
  • Re: Chiusura dell'eseguibile

    Usa le funzioni di gestione dei file

    fopen fwrite fclose
  • Re: Chiusura dell'eseguibile

    Grazie per la dritta , ho studiato le funzioni su internet che mi hai consigliato e son riuscito a fare quello che mi serviva!!! Grazie, grazie e ancora grazie
Devi accedere o registrarti per scrivere nel forum
7 risposte