2013-04-26 59 views
0

因此,我需要使用抽象类创建这个三角形类。它也将由测试者班级绘制。我是通过它的一部分,但我对数学部分有严重的问题。我在测试班中设置了坐标,我不知道如何让笔转动一定的角度来绘制三角形的下一侧。附加是所有的课程,我到目前为止。任何帮助将不胜感激。使用抽象形状类的三角类

Tester类

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; 
    } 
    } 
+0

你应该使用'atan2'来获得矢量的角度。 – Eric 2013-04-26 06:29:10

+1

我记得龟图形有一个简单,直观的设计。你可能正在推翻这一点。 – 2013-04-26 08:23:31

回答

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度。

+0

我该如何找出三角形的角度呢?这是我感到困惑的部分。如果我改变测试仪中设置的坐标,那么我三角形中的角度也会改变,所以我不能将角度设置为最终数字。还是我看着这一切都错了? – VinceCat 2013-04-26 21:17:16

+0

@VinceCat你不需要'turn'调用。只需使用['move(int x,int y)'](http://www.ualberta.ca/~cdigout/GETCA/NewTurtleGraphics/JavaDoc/TurtleGraphics/AbstractPen.html#move%28double,%20double%29)坐标代替转弯(x)和移动(d)调用。 – Kai 2013-04-27 12:41:41

+0

非常感谢你!作品完美无瑕! – VinceCat 2013-05-01 21:52:44