Java - making-Dreieck-Klasse
Ich brauche, um eine Klasse mit dem Namen "TriangleShape" die impliments java.das awt.Form.
Nun zu einer anderen Klasse "TriangleComponent" sollte ein Objekt der TriangleShape Klasse und es soll ein Dreieck zeichnen, mit der gegebenen Länge der Seiten.
Habe ich es geschafft, um es zu schaffen, aber ich habe gelesen, dass das Dreieck gezeichnet werden sollen, in der folgenden Weise:
TriangleShape t = new TriangleShape(30,40,50);
g2.draw(t); //This is the Graphics2D object that I use in paintComponent
Folgenden ist der code, den ich erstellt habe, aber es nutzt Line2D erstellen ein Dreieck.
Es ist die TriangleShape Klasse, davon ausgehen, dass ich implimented alle Methoden der Form-Klasse.
public class TriangleShape implements java.awt.Shape{
private double a, b, c;
private int x,y;
private Point2D loc;
public TriangleShape() {
this.a=0;
this.b=0;
this.c=0;
}
public TriangleShape(double a, double b, double c) {
//if supplied dimensions form a valid Triangle
if ( this.isValid(a,b,c) ) {
this.a = a;
this.b = b;
this.c = c;
}
//Otherwise make it zero sized triangle
else{
this.a=0;
this.b=0;
this.c=0;
}
}
public void resize(double a, double b, double c) {
if ( this.isValid(a,b,c) ) {
this.a = a;
this.b = b;
this.c = c;
}
//else let size remain unchanged
}
public TriangleShape getRandomTriangle() {
TriangleShape t = new TriangleShape(5,8,9);
return t;
}
public double area(){
double area, s;
s = (a+b+c)/2;
area = Math.sqrt(s *(s-a) * (s-b) * (s-c));
return area;
}
private boolean isValid(double a, double b, double c) {
double s = (a+b+c)/2;
if ( ((s-a) * (s-b) * (s-c)) <= 0 )
return false;
else
return true;
}
public double perimeter() {
double p;
p = a+b+c;
return p;
}
public double getA(){
return a;
}
public double getB(){
return b;
}
public double getC(){
return c;
}
public void setLocation(Point2D location){
loc = location;
}
public Point2D getLocation(){
return loc;
}
public double getX(){
return loc.getX();
}
public double getY(){
return loc.getY();
}
Und die TriangleComponent Klasse:
public class TriangleComponent extends JComponent{
TriangleShape t;
double alpha, beta, gamma;
double a,b,c;
double X,Y;
@Override
protected void paintComponent(Graphics g) {
//super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
t = new TriangleShape(100,100,190);
t.setLocation(new Point2D.Double(100,500));
a = t.getA();
b = t.getB();
c = t.getC();
X = t.getX();
Y = t.getY();
///////////////Drawing Base line.....
g2.draw(new Line2D.Double(X,Y,(X+c),Y)); //line c...
g2.draw(new Line2D.Double((X+c), Y, ((X+c)+a*Math.cos(Math.PI+getBeta())), (Y+a*Math.sin(Math.PI+getBeta())))); //line a...
//JOIning the last end points
g2.draw(new Line2D.Double(X, Y, ((X+c)+a*Math.cos(Math.PI+getBeta())), (Y+a*Math.sin(Math.PI+getBeta()))));
System.out.println("X1 = "+X+" Y1 = "+Y);
System.out.println("X2 = "+(X+c)+" Y2 = "+Y);
System.out.println("X3 = "+((X+c)+a*Math.cos(Math.PI+getBeta()))+" Y3 = "+ (Y+a*Math.sin(Math.PI+getBeta())));
//System.out.println("Alpha = "+getAlpha());
System.out.println("Gamma = "+(getGamma()*180)/Math.PI);
}
public double getAlpha(){
double temp = Math.acos(((Math.pow(c, 2)+Math.pow(b, 2))-Math.pow(a, 2))/(2*b*c));
System.out.println("Alpha = "+temp+" Degrees");
return temp;
}
public double getBeta(){
double temp = Math.acos(((Math.pow(c, 2)+Math.pow(a, 2))-Math.pow(b, 2))/(2*a*c));
System.out.println("Beta = "+temp+" Degrees");
return (temp);//* Math.PI)/180;
}
public double getGamma(){
double temp = Math.acos(((Math.pow(a, 2)+Math.pow(b, 2))-Math.pow(c, 2))/(2*b*a));
System.out.println("Gamma = "+temp+" Degrees");
return (temp);//* Math.PI)/180;
}
}
Dies funktioniert, aber ich brauche einen Weg zu zeichnen, das Dreieck, ohne sich auf Graphics2D
oder zeichnen Sie direkt mit der paintComponent
Methode. Gibt es eine Möglichkeit, dies zu tun?
InformationsquelleAutor Jaydeep | 2012-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der JavaDoc des Graphics2D Klasse Formen gerendert werden gemäß dem folgenden Grundsatz:
Kurz gesagt, bedeutet dies, dass die Graphics2D.draw(Shape) Methode rufen Sie Ihren TraingleShape.getPathIterator(AffineTransform) Methode und die zurückgegebenen PathIterator - Objekt, um die zu finden, die Punkte zum zeichnen von Linien zwischen.
Als solche, werden Sie wahrscheinlich erforderlich, um Ihre eigenen PathIterator-Implementierung, die entspricht Ihre TriangleShape Umsetzung.
Die oben genannte Lösung kann jedoch komplexer sein, dann muss es sein. Eine alternative wäre der Blick in die Path2D Klasse, wodurch Sie leicht geben Sie beliebige Formen mit einfachen Operationen wie lineTo(x,y). Da diese Klasse implementiert das Form-Oberfläche können Sie zulassen, dass Ihre TriangleShape Klasse diese Klasse erweitern, oder nur delegieren. Hier ist ein Beispiel mit dem GeneralPath Klasse, die arbeitet in einer ähnlichen Weise zu Path2D:
http://www.roseindia.net/java/example/java/swing/graphics2D/general-path.shtml
Es hängt jedoch sehr stark von Ihr bestimmte Zuordnung, ob dies wäre eine akzeptable Lösung, oder nicht.
Da die Path2D-Klasse implementiert das Form-interface hat er aber auch einen getPathIterator-Methode. Sie können einfach die Delegierten zu, dass die Methode aus der eigenen Klasse.
Dude, u r verfluchtes Genie !!! Vielen Dank !!
InformationsquelleAutor Jiddo