13. juni 2004 - 20:26Der er
20 kommentarer og 1 løsning
Hvordan laver man sin egen instans af Ellipse2D?
Det skulle ikke være det sværeste spørgsmål, men da jeg ikke har kigget på Java længe bliver jeg nødt til at spørge:
Jeg har følgende Klasse, som opretter en cirkel vha. Ellipse2D.Double:
public Circle(double anX, double anY, double aWidth, double aHeight) { x = anX; y = anY; width = aWidth; height = aHeight; c = new Ellipse2D.Double(x, y, width, height); }
Jeg opretter nu 2 instanser af Circle-klassen og nu vil jeg gerne lave en boolean som returnere true, hvis disse to cirkler overlapper hinanden - noget i retning af:
public boolean doesIntersect(Circle other) { . . . }
Mit problem er nu, at eksempelvis metoden getWidth() jo ikke kan bruges på nogen instanser af Circle-klassen, fordi de hører til Ellipse2D, men hvad gør man så hvis man ikke vælger at arve fra Ellipse2D-klassen? På forhånd tak!
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Slettet bruger
13. juni 2004 - 20:40#1
ville du ikke bare lave en metode i Circle klassen som kalder:
Men hvordan ville jeg så kunne skelne mellem hvilken instans af Circle jeg skulle finde bredden på? Det er mere fordi når jeg bruger doesIntersect(Circle other) så anvender jeg jo begge instanser, så...
Bortset fra det så er det et bogeksempel, så det er meget muligt jeg ville ha' lavet det på en anden måde ;-)
Synes godt om
Slettet bruger
13. juni 2004 - 21:59#3
ja, men man må jo gå ud fra at doesIntersect()-metoden bliver kaldt fra en instans af Circle-klassen, så dennes reference må være this, og den anden må være other?
Damm det er længe side jeg har arbejdet med Java :-) Du får lige hele klassen:
import java.awt.*; import java.awt.geom.*;
public class Circle {
public Circle(double anX, double anY, double aWidth, double aHeight) { x = anX; y = anY; width = aWidth; height = aHeight; c = new Ellipse2D.Double(x, y, width, height); }
Det er klart at kompileren starter med at brokke sig over other.getWidth(). Men er det ikke muligt at bygge Circle-klassen op således at man i Appletten kan skrive:
Ja se nu er jeg jo ikke særlig rar når jeg ikke umiddelbart godkender svaret, men mit spørgsmål lød egentlig på om det kunne lade sig gøre uden at bruge arv :-)
Synes godt om
Slettet bruger
14. juni 2004 - 15:13#7
DOH, sorry..... hvor skulle jeg dog egentlig til at nærlæse spørgsmålene. Men det kan godt lade sig gøre uden arv. *løfter kaffekop og hælder skoldhed kaffe ud over sig selv som straf, så ka' jeg lær' det*.
Jeg kommer lige med et eksempel:
import java.awt.*; import java.awt.geom.*;
public class Circle {
public Circle(double x, double y, double width, double height) { c = new Ellipse2D.Double(x, y, width, height); }
public void draw(Graphics2D g2) { g2.draw(c); }
public Ellipse2D.Double getEllipse() { return c; }
public boolean doesIntersect(Circle other) { return c.intersects(other.getEllipse()); }
Hm...nu har jeg rette eksemplet lidt til (intersects-metoden skulle have parametrene x, y, width, height), men jeg får en "cannot resolve symbol"-compilerfejl med metoderne getEllipseX(), getEllipseY(), getEllipseWidth() og getEllipseHeight()
import java.awt.*; import java.awt.geom.*;
public class CircleP56 {
public CircleP56(double x, double y, double width, double height) { c = new Ellipse2D.Double(x, y, width, height); }
public void draw(Graphics2D g2) { g2.draw(c); }
public double getEllipseX() { return c.getX(); }
public double getEllipseY() { return c.getY(); }
public double getEllipseWidth() { return c.getWidth(); }
public double getEllipseHeight() { return c.getHeight(); }
he he, og så må du lige ignorere den nye CircleP56 klasse
*Løber ud i køkkenet og laver en kande té som han kan hælde ned af sig selv fordi han ikke har kaffe i huset så han kan lære både at skrive god kode og have kaffe i huset*
Synes godt om
Slettet bruger
14. juni 2004 - 16:16#12
har du prøvet med
public boolean doesIntersect(Circle other) { return c.intersects(other.getEllipse()); }
den kalder nemlig intersects-metoden i RectangularShape-klassen
hep, jeg skulle have holdt mig til dit eksempel kan jeg se nu...min kalder intersects i Ellipse2D-klassen istedet for RectangularShape...men jeg får stadig en kompilerfejl:
import java.awt.*; import java.awt.geom.*;
public class CircleP56 {
public CircleP56(double x, double y, double width, double height) { c = new Ellipse2D.Double(x, y, width, height); }
public void draw(Graphics2D g2) { g2.draw(c); }
public Ellipse2D.Double getEllipse() { return c; }
public boolean doesIntersect(Circle other) { return c.intersects(other.getEllipse()); }
private Ellipse2D.Double c; }
"Cannot resolve symbol - getEllipse()" i doesIntersect
Synes godt om
Slettet bruger
14. juni 2004 - 16:42#14
Hmmmm, måske skulle du så huske at kalde
public boolean doesIntersect(CircleP56 other) { return c.intersects(other.getEllipse()); }
Vil du ikke stadigvæk finde ud af om to objekter af typen CircleP56 skærer hinanden? Hvis det er det du vil opnå skal du bruge metoden jeg beskrev
Kommentar: corholio 14/06-2004 16:42:15
public boolean doesIntersect(CircleP56 other) { return c.intersects(other.getEllipse()); }
.... jeg må indrømme at jeg er ved at blive en smule forvirret, men umiddelbart vil jeg ikke kunne se noget i vejen for at bruge klassen (der nu må se således ud):
import java.awt.*; import java.awt.geom.*;
public class CircleP56 {
public CircleP56(double x, double y, double width, double height) { c = new Ellipse2D.Double(x, y, width, height); }
public void draw(Graphics2D g2) { g2.draw(c); }
public Ellipse2D.Double getEllipse() { return c; }
public boolean doesIntersect(CircleP56 other) { return c.intersects(other.getEllipse()); }
*And the crow goes wild* Jep, nu virker skidtet! Jeg skulle lige oprette de 4 metoder i CircleP56-klassen (getX, getY, getWidth og getHeight), så for en god orden s skyld ser den rigtige kode nu således ud:
import java.awt.*; import java.awt.geom.*;
public class CircleP56 {
public CircleP56(double x, double y, double width, double height) { c = new Ellipse2D.Double(x, y, width, height); }
public void draw(Graphics2D g2) { g2.draw(c); }
public double getX() { return c.getX(); }
public double getY() { return c.getY(); }
public double getWidth() { return c.getWidth(); }
public double getHeight() { return c.getHeight(); }
public Ellipse2D.Double getCircleP56() { return c; }
Mange tak for hjælpen corholio - jeg ved den trak lidt flere tænder end hvad som var nødvendigt, så jeg smed et par ekstra point op :-)
Synes godt om
Slettet bruger
15. juni 2004 - 19:50#21
Jeg takker for pointene :-) Det er utroligt hvor meget det hjælper at læse Javadocs til de forskellige klasser før man begynder at skrive et svar (en ting jeg vil benytte mig af i fremtiden). Anyways.... Jeg takker (igen, men denne gang ydmygt) for pointene. :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.