Ciao ragazzi sono Roberto,
premetto che sono nuovo nella programmazione in C++, nasco come programmatore di macchine a controllo numerico CNC e sto implementando la conoscenza di questo linguaggio per aiutarmi a creare delle macro che mi serviranno per le lavorazioni, visto che trovo molto comodo crearmi degli algoritmi su cui posso fare il debug su PC senza perdere tempo a fare varie prove e avanti/indietro tra PC/macchina. Detto ciò vi chiedo un chiarimento su una cosa che mi succede che non riesco a capire, mi sto creando una libreria di geometria analitica e sto lavorando ora sull'equazione dell'asse radicale tra due circonferenze sfruttando la differenza tra equazioni di secondo grado messe a sistema, quindi l'equazione risultante sarà quella di una retta. Ho evitato di mettere come parametri nella funzione dell'asse radicale i coefficienti delle due incognite quadre dell'equazione di secondo grado della circonferenza, visto che il loro valore sarà sempre +1 quindi la loro differenza sarà sempre 0. La funzione dell'asse radicale (che ancora non ho completato, devo ancora inserire le condizioni quando la retta risultante avrà 0° o 90° quindi x o y avranno valori fissi e non y=mx+q) che ho creato mi restituisce un vettore di tipo double di tre elementi: l'elemento[0] = coefficiente angolare m della retta, l'elemento[1] = y, l'elemento[2] = intercetta q della retta; quando invoco tale funzione nella main in un ciclo for singolo per ciascuna circonferenza la funzione non ha nessun problema e mi restituisce i valori che mi aspetto, mentre se creo un unico ciclo for invocando la stessa funzione con i parametri di entrambe le circonferenze, il valore del parametro corrispondente al raggio2 della seconda circonferenza diventa 0, perchè???
Grazie in anticipo a chiunque può aiutarmi a capire questa cosa...
Vi condivido l'intero PGM su cui sto lavorando cosicchè possiate fare le vostre verifiche e potermi dare una risposta chiara ed eventualmente consigli anche su come impostare le funzioni in modo anche più elegante e funzionale.
L'IDE che sto utilizzando è il DEV-C++ 5.5.3.
I parametri delle circonferenze che sto simulando sono:
C1(1;3) Raggio1=10 C2(7.5; -3.25) Raggio2=3
#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 circonferenza(double x, double y, double raggio, double *equazioneCirconferenza);
void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double *retta);
int main() {
double x1=0, y1=0, raggio1=0;
double x2=0, y2=0, raggio2=0;
double circonferenza1[3]={}, circonferenza2[3]={};
double retta1[3]={};
cout<<"*******Funzione che ritorna i coefficienti dell'equazione dell'asse radicale*******\n\n";
cout<<"X prima circonferenza: ";
cin>>x1;
cout<<"Y prima circonferenza: ";
cin>>y1;
cout<<"Raggio prima circonferenza: ";
cin>>raggio1;
cout<<"\nX seconda circonferenza: ";
cin>>x2;
cout<<"Y seconda circonferenza: ";
cin>>y2;
cout<<"Raggio seconda circonferenza: ";
cin>>raggio2;
cout<<endl;
//Così non funziona il valore del raggio2 diventa zero, perchè????
/*
for(int i=0; i<3; i++){
circonferenza(x1,y1,raggio1,circonferenza1);//equazione prima circonferenza
circonferenza(x2,y2,raggio2,circonferenza2);//equazione seconda circonferenza
}
*/
//Così funziona
for(int i=0; i<3; i++)
circonferenza(x1,y1,raggio1,circonferenza1);//equazione prima circonferenza
for(int i=0; i<3; i++)
circonferenza(x2,y2,raggio2,circonferenza2);//equazione seconda circonferenza
for(int i=0; i<3; i++)
asseRadicale(circonferenza1[0],circonferenza1[1],circonferenza1[2],circonferenza2[0],circonferenza2[1],circonferenza2[2],retta1);
cout<<endl<<endl<<retta1[1]<<"y "<<retta1[0]<<"x "<<retta1[2];
fflush(stdin);
getchar();
return 0;
}
/*Funzione--> che trasforma i gradi in radianti*/
double radianti(double gradi){
return (gradi * PI_GRECO * 2) / 360;
}
/*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:
- x= coordinata dell'ascissa del centro circonferenza;
- y= coordinata dell'ordinata del centro circonferenza;
- raggio= 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.*/
double circonferenza(double x, double y, double raggio, double *equazioneCirconferenza){
equazioneCirconferenza[3] = {};//Inizializzazione del vettore contenente i coefficienti dell'equazione della circonferenza
equazioneCirconferenza[0] = (-2) * x;//Coefficiente di x
equazioneCirconferenza[1] = (-2) * y;//Coefficiente di y
equazioneCirconferenza[2] = pow(x,2) + pow(y,2) - pow(raggio,2);//Valore noto senza incognita
}
/*Funzione--> che restituisce in un vettore i coefficienti dell'equazione della retta dell'asse radicale tra due circonferenze.
Parametri della funzione:
- *circonferenza1= vettore di 5 elementi che contiene i coefficienti dell'equazione di secondo grado della prima circonferenza;
- *circonferenza2= vettore di 5 elementi che contiene i coefficienti dell'equazione di secondo grado della seconda circonferenza;
- *retta= vettore di 3 elementi che contiene i coefficienti della retta asse radicale:
-retta[0]= coefficiente angolare m della retta;
-retta[1]= y della retta;
-retta[2]= intercetta q della retta.*/
void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double *retta){
retta[3]={};//retta[1]=y; retta[0]=m; retta[2]=q per quanto riguarda equazioni di circonferenze
/*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...*/
retta[0] = xC1 - xC2;//Differenza tra i coefficienti delle incognite x con esponente 1 delle 2 circonferenze
retta[1] = yC1 - yC2;//Differenza tra i coefficienti delle incognite y con esponente 1 delle 2 circonferenze
retta[2] = notoC1 - notoC2;//Differenza tra i termini noti delle 2 circonferenze
//Da cancellare dopo completamento funzione
for(short int i=0; i<3; i++)
cout<<"retta["<<i<<"]= "<<retta[i]<<endl;
for(short int i=0; i<3; i++)
if(retta[0] == 0){//Caso che l'asse radicale è orizzontale quindi 0° e il coefficiente angolare m è uguale a 0
retta[0] = 0;//Coefficiente angolare m uguale a 0
retta[2] = -retta[2];//Trasporto dell'intercetta q dall'altro lato dell'uguale rispetto a y=(retta[1])
retta[1] = retta[2] / retta[1];//Rapporto tra l'intercetta e il coefficiente di y; corrisponde all'equazione dell'asse radicale
retta[2] = 0;//Azzeramento dell'intercetta
}
else{
retta[0] = - retta[0];//Trasporto del coefficiente angolare m dall'altro lato dell'uguale rispetto a y=(retta[1])
retta[2] = - retta[2];//Trasporto dell'intercetta q dall'altro lato dell'uguale rispetto a y=(retta[1])
retta[0] /= retta[1];//Rapporto tra il coefficiente angolare m e la y
retta[2] /= retta[1];//Rapporto tra l'intercetta q e la y
retta[1] = 1;
}
}