2010-01-27 213 views
4
import java.lang.Math; 
import java.awt.* 
public class Triangle implements Shape 
{ 
    java.awt.Point a; 
    java.awt.Point b; 
    java.awt.Point c; 

    public Triangle(java.awt.Point a, java.awt.Point b, java.awt.Point c) 
    { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    }  
public double getArea() 
    { 
     double area; 
     return area = Math.abs((a-c)*(b-a)-(a-b)*(c-a)); 
    } ... 

http://upload.wikimedia.org/math/f/e/5/fe56529cdaaaa9bb2f71c1ad8a1a454f.png < --area式爪哇:一個三角形

我試圖從2D笛卡爾計算從3點(X,Y)的三角形的面積座標系的計算面積。我假設我的上述公式正確地產生了一個三角形的面積(如果沒有,請糾正我),但我的編譯器說「運算符 - 不能應用於java.awt.Point,java.awt.Point」。我假設它是這樣說的,因爲你不能相互減去點數,但公式中的每個值都是x或y值,而不是一個點。我如何修復我的代碼,這樣可以工作? 謝謝!

回答

12

根據維基百科,you formula is correct。該文章包含大量有用和清晰的數據。
根據java.awt.point documentation,您應該使用getX()getY()方法,它們返回一個點的座標值。

也就是說,

alt text

應該表示爲:

Math.abs((a.getX()-c.getX())*(b.getY()-a.getY())- 
     (a.getX()-b.getX())*(c.getY()-a.getY()))*0.5; 

這可能並不是一個好的做法是使用point.x,因爲如果你不應該訪問對象的變量你有一個getter方法來做到這一點。這是接口和實現之間分離的一個方面:數據point.x可能以多種形式存儲,而不僅僅是int;接口方法確保每次使用它時都會得到一個int。

+0

非常感謝了全面的回答,亞當。我今天學到了一些東西! – dukevin 2010-01-27 09:17:05

+1

我完全同意使用getters和setter:這是一個很好的習慣,這只是一個例外。 Point使用的類是AWT的一部分,抽象窗口工具包,用於在響應時間至關重要的屏幕上繪製圖形。因此,由於訪問變量比調用方法快,因此內部字段在許多AWT類中暴露。 @ adam-matan所說的一切都是完全正確的,只是想指出爲什麼'java.awt.Point'不是數學問題以及爲什麼會發生這種情況。 – 2015-02-25 15:04:09

+0

謝謝!很高興知道。 – 2015-02-25 15:12:44

0

由於鏈接的公式說明,不要用點而是用它們的x和y值來計算。我會留給你(這是作業!)在java中做到這一點。

而且不要忘記2.

+0

我知道這就是我必須做的。我在問怎麼做。 – dukevin 2010-01-27 09:12:35

3

編譯器來劃分告訴你確切的正確的事情。

Math.abs((a-c)*(b-a)-(a-b)*(c-a) 

你的斧頭.Y忘記.X由等是(AX - CX)* ...

2

更新:我沒有注意到OP已經鏈接到一個公式,這就是爲什麼我查找這個並編碼它。你應該使用其他公式,因爲這涉及更多的計算(包括4個電話sqrt,我認爲這將是沉重的)。


使用Heron's

double distance(Point a, Point b) 
{ 
    double dx = a.x - b.x; 
    double dy = a.y - b.y; 
    return Math.sqrt(dx * dx + dy * dy); 
} 
double getArea() 
{ 
    double ab = distance(a, b); 
    double bc = distance(c, b); 
    double ca = distance(a, c); 
    double s = (ab + bc + ca)/2; 
    return Math.sqrt(s * (s - ab) * (s - bc) * (s - ca)) 
} 
0

潛在的問題:在Java中,像 '+' 和運營商 ' - ' 僅允許基本類型(如字節,整型,長),但不用於對象(通常)和數組。

其他語言允許運算符重載,所以在C++中,您可以爲Point對象定義一個'+'操作,並且您的最初想法可以編譯和運行。但這在Java中是不可能的。

唯一的例外是字符串(它允許「添加」 String對象)和如Integer和Double在Java的原始包裝1.5+(自動裝箱轉換回原語)