2013-04-26 73 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