【问题标题】:Triangle class using an abstract shape class使用抽象形状类的三角形类
【发布时间】:2013-04-20 05:43:17
【问题描述】:

所以我有这个三角形类,我需要使用抽象类来创建。它也将由测试类绘制。我是其中的一部分,但我在数学部分遇到了严重的问题。我已经在测试器类中设置了坐标,我不知道如何让笔转动一定角度来绘制三角形的下一条边。附件是所有课程,我到目前为止。任何帮助将不胜感激。

测试类

    import TurtleGraphics.*;

      public class TestShapes1 {

        public static void main (String[] args) {

        // Declare and instantiate a pen, a circle and a wheel
        Pen p = new StandardPen();
        //Shape s1 = new Circle1 (20, 20, 20);
        //Shape s2 = new Wheel1 (-20, -20, 20, 6);
        Shape1 t2 = new Triangle1 (0, 0, 50, 0, 0, 30);

        // Draw the circle and wheel
        //s1.draw (p);
        t2.draw (p);
        }

      }

形状类

    import TurtleGraphics.Pen;

       public interface Shape1 {
         public double area();
         public void   draw (Pen p);
         public double getXPos();
         public double getYPos();
         public void   move (double xLoc, double yLoc);
         public void   stretchBy (double factor);
         public String toString();
         }

三角形类

    import TurtleGraphics.Pen;

      public class Triangle1 implements Shape1 {


    private double x1, y1, x2, y2, x3, y3;
    private double s1, s2, s3;
    private double d1, d2;
    //private double height, width;

    public Triangle1() {
      x1 = 0;
      y1 = 0;
      x2 = 1;
      y2 = 0;
      x3 = 0;
      y3 = 1;
      //height = 1;
      //width = 1;
    } 

    public Triangle1 (double xLoc1, double yLoc1, double xLoc2, double yLoc2, double xLoc3, double yLoc3) {
      x1 = xLoc1;
      y1 = yLoc1;
      x2 = xLoc2;
      y2 = yLoc2;
      x3 = xLoc3;
      y3 = yLoc3;
      //height = h;
      //width = w;
    }

    public double area() {
      return (Math.abs(x1*y2-x2*y1+x2*y3-x3*y2+x3*y1-x1*y3))/2.0;
    }

    public void draw (Pen p) {
      s1 = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
      s2 = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
      s3 = Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
      p.up();
      p.move (x1, y1);
      p.down();
      p.setDirection (0); 
      p.move (s1);
      d1 = (Math.acos((s2*s2+s3*s3-s1*s1)/(2.0*s2*s3)))*180/Math.PI;
      p.turn (180 - d1); 
      p.move (s2);
      d2 = (Math.acos((s3*s3+s1*s1-s2*s2)/(2.0*s3*s1)))*180/Math.PI;
      p.turn (180 - d2); 
      p.move (s3);
      p.turn (-90); 
      //p.move ();
    }

    public double getXPos() { 
      return x1;
    }

    public double getYPos() {
      return y1;
    }

    public void move (double xLoc, double yLoc) {
      x1 = x1 + xLoc;
      y1 = y1 + yLoc;
      x2 = x2 + xLoc;
      y2 = y2 + yLoc;
      x3 = x3 + xLoc;
      y3 = y3 + yLoc;
    }

    public void stretchBy (double factor) {
      x1 *= factor;
      y1 *= factor;
    }

    public String toString() {
      String str = "TRIANGLE\n";
    //             + "Width & Height: " + width + " & " + height +"\n"
    //             + "(X,Y) Position: (" + xPos + "," + yPos + ")\n" 
    //             + "Area: " + area();
      return str;
    }
    }

【问题讨论】:

  • 你应该使用atan2 来获取向量的角度。
  • 我记得 Turtle 图形具有简单、直观的设计。你可能想多了。

标签: java turtle-graphics


【解决方案1】:

你不需要任何数学。只需将学位传递给p.turn()。所以使用

p.turn(180); 

而不是

d1 = (Math.acos((s2*s2+s3*s3-s1*s1)/(2.0*s2*s3)))*180/Math.PI;
p.turn (180 - d1); 

参考documentation

度数可以是整数或浮点数。例子: pen.turn(-45);将笔顺时针旋转 45 度。

【讨论】:

  • 那么我应该如何计算三角形的角度呢?这就是我感到困惑的部分。如果我更改测试仪中设置的坐标,那么我的三角形中的角度也会发生变化,因此我无法将角度设置为最终数字。还是我看错了?
  • @VinceCat 你不需要turn 电话。只需将 move(int x, int y) 与坐标一起使用,而不是使用 turn(x) 和 move(d) 调用。
  • 非常感谢您!完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多