Java - создание класса Triangle - PullRequest
       21

Java - создание класса Triangle

1 голос
/ 27 февраля 2012

Мне нужно сделать класс с именем "TriangleShape", который подразумевает java.awt.Shape.Теперь другой класс "TriangleComponent" должен иметь объект класса TriangleShape, и он должен рисовать треугольник с заданной длиной сторон.

Мне удалось его создать, но я читал, что треугольник должен быть нарисованследующим образом:

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 Ответ

1 голос
/ 27 февраля 2012

Согласно JavaDoc класса Graphics2D Формы отображаются в соответствии со следующим принципом:

Операции с фигурами

  1. Еслиоперация представляет собой операцию рисования (Shape), затем метод createStrokedShape для текущего атрибута Stroke в контексте Graphics2D используется для создания нового объекта Shape, который содержит контур указанного Shape.

  2. Форма преобразуется из пространства пользователя в пространство устройства с использованием текущего преобразования в контексте Graphics2D.

  3. Схема Shape извлекается с использованием метода getPathIterator из Shape, который возвращаетОбъект PathIterator, который выполняет итерацию вдоль границы Shape.

  4. Если объект Graphics2D не может обработать изогнутые сегменты, которые возвращает объект PathIterator, то он может вызвать альтернативный метод Shape getPathIterator, который выравниваетФорма.

  5. Текущая краска в граКонтекст phics2D запрашивается для PaintContext, который определяет цвета для отображения в пространстве устройства.

Короче говоря, это означает, что Graphics2D.draw (Shape) *Метод 1032 * вызовет ваш метод TraingleShape.getPathIterator (AffineTransform) и будет использовать возвращенный объект PathIterator , чтобы найти точки, между которыми нужно провести линии.

Таким образом, вам, вероятно, потребуется реализовать собственную реализацию PathIterator, соответствующую вашей реализации TriangleShape.

Приведенное выше решение может быть более сложным, чем необходимо.В качестве альтернативы можно обратиться к классу Path2D , который позволяет легко указывать произвольные фигуры, используя простые операции, такие как lineTo (x, y).Поскольку этот класс реализует интерфейс Shape, вы можете позволить вашему классу TriangleShape расширить этот класс или просто делегировать ему.Вот пример использования класса GeneralPath, который работает аналогично Path2D: http://www.roseindia.net/java/example/java/swing/graphics2D/general-path.shtml

Однако это зависит от вашего конкретного назначения, будет ли это приемлемым решением или нет.

...