2012-02-27 13 views
1

私はjava.awt.Shapeを意味する "TriangleShape"という名前のクラスを作成する必要があります。 今度は別のクラス "TriangleComponent"は、TriangleShapeクラスのオブジェクトを持つ必要があり、与えられた長さの辺を持つ三角形を描画する必要があります。Java製作Triangleクラス

私はそれを作成するために管理し、しかし、私は、三角形は、次のように描かれるべきであることを読んだ:

TriangleShape t = new TriangleShape(30,40,50); 
g2.draw(t);   //This is the Graphics2D object that I use in paintComponent 

以下は、私が作成したコードですが、それは、三角形を作成するためにLine2Dの両方を使用しています。 それは、私がShapeクラスのすべてのメソッドを実装したと仮定して、TriangleShapeクラスです。

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(); 
} 

そしてTriangleComponentクラス:

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; 
} 

} 

これは動作しますが、私はGraphics2Dに頼るかpaintComponent方法で直接描画することなく、三角形を描画するための方法が必要です。これを行う方法はありますか?

答えて

1

JavaDoc of the Graphics2Dクラス形状は、以下の原理に従ってレンダリングされるによれば操作はドロー(形状)操作、上その後createStrokedShape方法である場合

形状操作

  1. Graphics2Dコンテキストの現在のStroke属性を使用して、指定されたShapeのアウトラインを含む新しいShapeオブジェクトを構築します。

  2. Shapeは、Graphics2Dコンテキストで現在のTransformを使用して、ユーザー空間からデバイス空間に変換されます。

  3. Shapeのアウトラインは、ShapeのgetPathIteratorメソッドを使用して抽出されます。このメソッドは、Shapeの境界に沿って反復するPathIteratorオブジェクトを返します。

  4. Graphics2DオブジェクトがPathIteratorオブジェクトから返される曲線セグメントを処理できない場合、シェイプを平坦化するShapeの代替getPathIteratorメソッドを呼び出すことができます。

  5. PaintContextに対して、Graphics2Dコンテキストの現在のペイントが照会されます.PaintContextは、デバイス空間でレンダリングする色を指定します。要するに

が、これはGraphics2D.draw(Shape)方法は、あなたのTraingleShape.getPathIterator(AffineTransform)メソッドを呼び出すとの間に線を描画するポイントを見つけるために返されたPathIteratorオブジェクトを使用することを意味します。

したがって、TriangleShape実装に対応する独自のPathIterator実装を実装する必要があります。

ただし、上記の解決策は複雑である必要があります。代わりに、Path2Dクラスを調べると、lineTo(x、y)などの単純な操作を使用して任意のシェイプを簡単に指定できるようになります。このクラスはShapeインタフェースを実装しているので、TriangleShapeクラスがこのクラスを拡張したり、そのクラスに委譲したりすることができます。Path2Dと同様に動作するGeneralPathクラスの使用例を次に示します。 http://www.roseindia.net/java/example/java/swing/graphics2D/general-path.shtml

ただし、これは許容可能な解決方法であるかどうかは、特定の割り当てによって異なります。

+0

しかし、getPathIteratorメソッドでPathIteratorを返さなければならないので、Path2DをPathIteratorに変換する方法は? お寄せいただきありがとうございます。 – Jaydeep

+0

Path2DクラスはShapeインタフェースを実装しているため、getPathIteratorメソッドも用意されています(http://docs.oracle.com/javase/6/docs/api/java/ awt/geom/Path2D.Float.html#getPathIterator(java.awt.geom.AffineTransform))。あなたは自分のクラスからそのメソッドに委譲することができます。 – Jiddo

+0

おい、天才! 多くのことがあります! – Jaydeep