首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - making Triangle类

Java - making Triangle类
EN

Stack Overflow用户
提问于 2012-02-27 15:37:05
回答 1查看 6.9K关注 0票数 1

我需要创建一个包含java.awt.Shape的名为"TriangleShape“的类。现在,另一个类"TriangleComponent“应该有一个TriangleShape类的对象,并且它应该绘制一个具有给定边长的三角形。

我设法创建了它,但我读到这个三角形应该按以下方式绘制:

代码语言:javascript
复制
TriangleShape t = new TriangleShape(30,40,50);
g2.draw(t);         //This is the Graphics2D object that I use in paintComponent

下面是我创建的代码,但它使用Line2D创建一个三角形。它是TriangleShape类,假设我已经实现了Shape类的所有方法。

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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方法绘制它。有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-27 16:56:14

根据JavaDoc of the Graphics2D类,根据以下原则渲染形状:

形状操作

  1. 如果操作是绘制(形状)操作,则使用Graphics2D上下文中当前Stroke属性上的createStrokedShape方法构造包含指定形状轮廓的新Shape对象。

  1. 使用Graphics2D上下文中的当前转换将形状从用户空间转换到设备空间。

  1. 使用Shape的getPathIterator方法提取形状的轮廓,该方法返回一个沿形状边界迭代的PathIterator对象。

  1. 如果Graphics2D对象无法处理PathIterator对象返回的曲线段,则它可以调用Shape的备用getPathIterator方法,从而将形状展平。

  1. 查询Graphics2D上下文中的当前绘图以查找PaintContext,该the指定要在设备空间中呈现的颜色。

简而言之,这意味着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

然而,这取决于你的特定任务,这是否是一个可接受的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9461462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档