Avatar billede boomshanka Nybegynder
13. juni 2004 - 20:26 Der 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!
Avatar billede Slettet bruger
13. juni 2004 - 20:40 #1
ville du ikke bare lave en metode i Circle klassen som kalder:

return c.getWidth()

eller har jeg blot overset noget ?
Avatar billede boomshanka Nybegynder
13. juni 2004 - 21:09 #2
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 ;-)
Avatar billede 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?
Avatar billede boomshanka Nybegynder
13. juni 2004 - 22:34 #4
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);
    }
   
    public void draw(Graphics2D g2) {
        g2.draw(c);
    }
   
    public boolean doesIntersect(Circle other) {
        otherRadius = other.getWidth() / 2.0;
        thisRadius = c.getWidth() / 2.0;
        otherXCenter = other.getX() + otherRadius;
        thisXCenter = c.getX() + thisRadius;
       
        return (otherRadius + thisRadius) > (otherXCenter - thisXCenter);
    }
   
    private double x;
    private double y;
    private double width;
    private double height;
    private Ellipse2D.Double c;
    private double otherRadius;
    private double thisRadius;
    private double otherXCenter;
    private double thisXCenter;
}

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:

if(firstInstanceOfCircle.crosses(secondInstanceOfCircle) {
.
.
.
}

Det vil sige jeg er sikker på man kan - jeg kan bare ikke overskue det...
Avatar billede Slettet bruger
13. juni 2004 - 22:39 #5
ok, vi prøver så lige noget andet...

import java.awt.*;
import java.awt.geom.*;

public class Circle extends Ellipse2D.Double {

    public Circle(double x, double y, double width, double height) {
        super(x, y, width, height);
    }
 
    public void draw(Graphics2D g2) {
        g2.draw(this);
    }
 
    public boolean doesIntersect(Circle other) {
        double otherRadius = other.getWidth() / 2.0;
        double thisRadius = getWidth() / 2.0;
        double otherXCenter = other.getX() + otherRadius;
        double thisXCenter = getX() + thisRadius;
     
        return (otherRadius + thisRadius) > (otherXCenter - thisXCenter);
    }
}

Jeg ved ikke om det kan compiles, jeg har tilrettet her på eksperten... hovedideen er i hvert fald at nedarve fra Ellipse2D.Double-klassen :-)
Avatar billede boomshanka Nybegynder
14. juni 2004 - 12:30 #6
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 :-)
Avatar billede 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()); }
 
    private Ellipse2D.Double c; 
}

Håber det virker nu ;-)
Avatar billede boomshanka Nybegynder
14. juni 2004 - 15:42 #8
ah jeg tænkte det nok...det ser ud til at give mening - jeg tester det lige...
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:02 #9
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();
    }
   
    public boolean doesIntersect(Circle other) {
        return c.intersects(other.getEllipseX(), other.getEllipseY(), other.getEllipseWidth(), other.getEllipseHeight());
    }
   
    private Ellipse2D.Double c;
    private double otherRadius;
    private double thisRadius;
    private double otherXCenter;
    private double thisXCenter;
}
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:04 #10
altså kompileren går kold i linjen "return c.intersects(other.getEllipseX()..." - selve metoderne kan godt kompiles seperat.
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:06 #11
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*
Avatar billede 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
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:34 #13
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
Avatar billede 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());
    }
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:43 #15
og det er også selvom parameteren hedder Circle og ikke CircleP56
Avatar billede boomshanka Nybegynder
14. juni 2004 - 16:43 #16
ha ha, det her går klart for hurtigt for mig
Avatar billede Slettet bruger
14. juni 2004 - 18:51 #17
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());
    }

    private Ellipse2D.Double c;
}
Avatar billede boomshanka Nybegynder
14. juni 2004 - 20:24 #18
Jeg ville også mene det er rigtigt - jeg får dog stadig en kompilerfejl når jeg bruger ovenstående kode:

CircleP56.java:19: cannot resolve symbol
symbol  : method intersects (java.awt.geom.Ellipse2D.Double)
location: class java.awt.geom.Ellipse2D.Double
      return c.intersects(other.getEllipse());
              ^
1 error
Avatar billede Slettet bruger
15. juni 2004 - 07:03 #19
Hovsa, jeg læste lige på api'en, prøv med denne:

public boolean doesIntersect(CircleP56 other) {
        return c.intersects(other.getX(), other.getY(), other.getWidth(), other.getHeight());
    }

Håber det fungerer nu?
Avatar billede boomshanka Nybegynder
15. juni 2004 - 13:38 #20
*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;
    }

    public boolean doesIntersect(CircleP56 other) {
        return c.intersects(other.getX(), other.getY(), other.getWidth(), other.getHeight());
    }

    private Ellipse2D.Double 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 :-)
Avatar billede 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. :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester