Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java生成三角类_Java_Class_Geometry_Paintcomponent - Fatal编程技术网

Java生成三角类

Java生成三角类,java,class,geometry,paintcomponent,Java,Class,Geometry,Paintcomponent,我需要创建一个名为“TriangleShape”的类,它实现java.awt.Shape。 现在,另一个类“TriangleComponent”应该有一个三角形形状类的对象,它应该绘制一个三角形,边的长度给定 我成功地创建了它,但我读到三角形应该用以下方式绘制: TriangleShape t = new TriangleShape(30,40,50); g2.draw(t); //This is the Graphics2D object that I use in paint

我需要创建一个名为“TriangleShape”的类,它实现java.awt.Shape。 现在,另一个类“TriangleComponent”应该有一个三角形形状类的对象,它应该绘制一个三角形,边的长度给定

我成功地创建了它,但我读到三角形应该用以下方式绘制:

TriangleShape t = new TriangleShape(30,40,50);
g2.draw(t);         //This is the Graphics2D object that I use in paintComponent
下面是我创建的代码,但它使用Line2D创建三角形。 它是三角形形状类,假设我已经实现了形状类的所有方法

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();
}
这是可行的,但我需要一种不依赖
Graphics2D
或直接使用
paintComponent
方法绘制三角形的方法。有什么方法可以做到这一点吗?

根据类,形状根据以下原则渲染:

形状操作

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

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

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

  • 如果Graphics2D对象无法处理PathIterator对象返回的曲线段,那么它可以调用Shape的备用getPathIterator方法,该方法会展平形状

  • 将查询Graphics2D上下文中的当前绘制以查找PaintContext,该PaintContext指定要在设备空间中渲染的颜色

  • 简而言之,这意味着该方法将调用您的方法并使用返回的对象来查找要在哪些点之间划线

    因此,您可能需要实现自己的PathIterator实现,该实现与您的TriangleShape实现相对应

    然而,上述解决方案可能比需要的更复杂。另一种方法是查看类,该类允许您使用简单的操作(如lineTo(x,y))轻松指定任意形状。因为这个类实现了Shape接口,所以您可以允许您的TriangleShape类扩展这个类,或者只是委托给它。下面是使用GeneralPath类的示例,其工作方式与Path2D类似:

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

    根据类,形状根据以下原则呈现:

    形状操作

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

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

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

  • 如果Graphics2D对象无法处理PathIterator对象返回的曲线段,那么它可以调用Shape的备用getPathIterator方法,该方法会展平形状

  • 将查询Graphics2D上下文中的当前绘制以查找PaintContext,该PaintContext指定要在设备空间中渲染的颜色

  • 简而言之,这意味着该方法将调用您的方法并使用返回的对象来查找要在哪些点之间划线

    因此,您可能需要实现自己的PathIterator实现,该实现与您的TriangleShape实现相对应

    然而,上述解决方案可能比需要的更复杂。另一种方法是查看类,该类允许您使用简单的操作(如lineTo(x,y))轻松指定任意形状。因为这个类实现了Shape接口,所以您可以允许您的TriangleShape类扩展这个类,或者只是委托给它。下面是使用GeneralPath类的示例,其工作方式与Path2D类似:


    但是,这取决于您的特定分配,这是否是一个可接受的解决方案。

    但是,由于我们必须在getPathIterator方法中返回PathIterator,如何将Path2D转换为PathIterator??顺便说一句,非常感谢您的回复..因为Path2D类实现了Shape接口,所以它也有一个。您可以从自己的类简单地委托给该方法。但是,由于我们必须在getPathIterator方法中返回PathIterator,如何将Path2D转换为PathIterator??顺便说一句,非常感谢您的回复..因为Path2D类实现了Shape接口,所以它也有一个。您可以从自己的类简单地委托给该方法。
    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;
    }
    
    }