2010-01-27 111 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+(自动装箱转换回原语)