Ciao a tutta la community!!
Mi scuso per il titolo un pò generico, ma non sono riuscito a trovarne un altro.
Ritorno a rompervi le scatole con questo nuovo quesito.
Allora...ecco cosa mi viene chiesto
Ed ecco la classe da me creataUna retta giacente in un piano può essere specificata in diversi modi:
• mediante un punto (x, y) e una pendenza m
• mediante due punti (x1, y1), (x2, y2)
• mediante un’equazione nella forma y = mx + b
• mediante un’equazione nella forma x = a, se la retta è verticale
Realizzate una classe Line dotata di quattro costruttori, corrispondenti ai quattro casi menzionati, e realizzate i metodi:
boolean intersects(Line other)
boolean equals(Line other)
boolean isParallel(Line other)
codice:public class Line { // Constructors public Line (double x, double y, double m) { initPointX = x; // coordinata x del punto iniziale initPointY = y; // coordinata y del punto iniziale slope = m; // slope è il coeffiente angolare } public Line (double x1, double y1, double x2, double y2) { initPointX = x1; // coordinata x del punto iniziale initPointY = y1; // coordinata y del punto iniziale double endPointX = x2; // coordinata x del punto finale double endPointY = y2; // coordinata y del punto finale slope = (endPointY - initPointY) / (endPointX -initPointX); // forumula per calcolare il coefficiente angolare } public Line (String equation) { String sSlope = equation.substring(2, 3); slope = Double.parseDouble(sSlope);/* Ricavo la sottostringa m dalla stringa equation e la trasformo in double, assegnando il valore alla variabile slope*/ String sIntercept = equation.substring(5); initPointX = 0; initPointY = Double.parseDouble(sIntercept);/* Faccio lo stesso per ricavare la b; le coordinate del punto iniziale della retta sarranno (0, b)*/ } public Line (double a) { initPointX = a; // coordinata x del punto iniziale initPointY = 0; // coordinata y del punto iniziale (la retta è verticale) slope = Double.MAX_VALUE; /* il coefficiente angolare di una retta verticale è infinito */ } // Methods public boolean isParallel(Line other) { return(this.slope == other.slope); /* due rette parallele hanno lo stesso coefficiente angolare*/ } public boolean isEqual(Line other) { int equal = 0; if (this.slope == other.slope && this.initPointX == other.initPointX && this.initPointY == other.initPointY) equal = 1; return (equal == 1); /* Due rette sono uguali se hanno lo stesso coefficiente angolare e un punto in comune; in questo caso il punto in comune è il punto iniziale */ } public boolean intersects(Line other) { return (!this.isEqual(other) && !this.isParallel(other)); // Due rette si incontrano se non sono uguali e non sono parallele } // Instance Fields private double initPointX, initPointY; private double slope; }
Allora ho parecchie perplessità; la prima, la più grande, riguarda il terzo costruttore. Mi dice di creare un costruttore che crei una linea mediante l'inserimento di una stringa y=mx+b. Tuttavia il problema è che, dando come input una stringa, non posso ricavarmi facilmente il punto iniziale e il coefficiente angolare. Potrei ricavarmele, come ho fatto, tramite un metodo substring; tuttavia la lunghezza della stringa non sarà sempre uguale, magari può esserci uno spazio dopo ogni segno + o = o cose del genere.
Come potrei risolvere? Togliendo di mezzo la stringa e leggendo invece solo m e b come valori double, come ho poi fatto nel quarto costruttore? Penso sia molto meglio come soluzione; tuttavia volevo capire se c'era qualche altro metodo.
Altro problema è confrontare nei metodi predicativi di tipo boolean la linea costurita con una nuova linea da costruire (chiamata other).
Va bene, per esempio, mettere a confronto i coefficienti angolari delle due linee in questo modo: (this.slope == other.slope) ? O è completamente sbagliato?
Attendo pazientemente vostre news
Grazie a tutti per le risposte!!
gl


Rispondi quotando