2012-02-27 17 views
1

我需要創建一個名爲「TriangleShape」的類,它可以實現java.awt.Shape。 現在另一個類「TriangleComponent」應該有一個TriangleShape類的對象,它應該繪製一個三角形,並且具有給定的邊長。Java - 製作三角類

我設法創建它,但我讀過的三角形應以下列方式得出:

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

下面是我創建的代碼,但它使用的Line2D創建一個三角形。 這是TriangleShape類,假設我已經實現了Shape類的所有方法。

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類形狀根據以下原理渲染:

式樣操作

  1. 如果操作是平局(形狀)的操作,然後在該createStrokedShape方法Graphics2D上下文中的當前Stroke屬性用於構造包含指定Shape的輪廓的新Shape對象。

  2. 使用Graphics2D上下文中的當前Transform將Shape從用戶空間轉換爲設備空間。

  3. Shape的輪廓使用Shape的getPathIterator方法提取,該方法返回沿Shape的邊界迭代的PathIterator對象。

  4. 如果Graphics2D對象無法處理PathIterator對象返回的曲線段,則它可以調用Shape的替代getPathIterator方法,該方法將Shape變平。

  5. Paint2D上下文中的當前Paint將被查詢爲PaintContext,該PaintContext指定要在設備空間中呈現的顏色。

總之,這意味着Graphics2D.draw(Shape)方法將調用TraingleShape.getPathIterator(AffineTransform)方法,以便找到它指向畫之間的線路使用返回PathIterator對象。

因此,您可能需要實現自己的與您的TriangleShape實現相對應的PathIterator實現。

然而,上述解決方案可能更復雜,那麼它需要。另一種方法是查看Path2D類,該類允許使用簡單操作(如lineTo(x,y))輕鬆指定任意形狀。由於這個類實現了Shape接口,所以你可以讓你的TriangleShape類擴展這個類,或者只是委託給它。下面是一個使用GeneralPath類,它以類似的方式來工作的Path2D一個例子: http://www.roseindia.net/java/example/java/swing/graphics2D/general-path.shtml

但它確實取決於特定的分配是否這將是一個可接受的解決方案或沒有。

+0

但是,因爲我們必須在getPathIterator方法中返回PathIterator,所以如何將Path2D轉換爲PathIterator? 順便說一句,非常感謝您的回覆。 – Jaydeep 2012-02-27 10:49:29

+0

由於Path2D類實現了Shape接口,它也有一個[getPathIterator方法](http://docs.oracle.com/javase/6/docs/api/java/ AWT/GEOM/Path2D.Float.html#的getPathIterator(java.awt.geom.AffineTransform中))。您可以簡單地從您自己的班級委派給該方法。 – Jiddo 2012-02-27 15:51:23

+0

夥計,你該死的天才! 非常感謝! – Jaydeep 2012-02-27 20:34:23