Java:计算三角形的面积

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 <--三角形面积公式

我正在尝试从二维直角坐标系中的3个点(x,y)计算三角形的面积。我假设上面的公式能正确地给出三角形的面积(如果不是,请纠正我),但是我的编译器说“operator - cannot be applied to java.awt.Point,java.awt.Point” 。我假设它之所以这样说是因为您不能将点从彼此减去,但公式中的每个值都是x或y值,而不是点。如何修复我的代码以使其工作? 谢谢!

6个回答

12
根据维基百科,您的公式是正确的。这篇文章包含了很多有用且清晰的数据。
根据 java.awt.point文档,您应该使用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。


非常感谢你提供的全面回答,亚当。我今天学到了新东西! - dukevin
1
我完全同意使用getter和setter:这是一种通常的好习惯,只是这里有一个例外。所使用的类Point是AWT(抽象窗口工具包)的一部分,旨在在屏幕上绘制图形,响应时间至关重要。因此,由于访问变量比调用方法快得多,许多AWT类中都会公开内部字段。@adam-matan所说的一切都是完全正确的,我只是想指出为什么java.awt.Point不是数学上的点以及为什么会发生这种情况。 - Yago Méndez Vidal
谢谢!好知道。 - Adam Matan

3
编译器告诉你的是完全正确的事情。
Math.abs((a-c)*(b-a)-(a-b)*(c-a)

你忘了在a.x中加入“.x”,在b.y中加入“.y”等。这意味着应该是(a.x - c.x)* ...

2
更新:我没有注意到OP已经链接了一个公式,这就是为什么我查找并编写了这个公式。你应该使用另一个公式,因为这个公式涉及更多的计算(包括4次调用sqrt,我认为会很重)。
使用海伦公式
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
如链接的公式所示,请不要使用点来计算,而是使用它们的x和y值。我会把这个任务留给你(这是一份作业!)在Java中完成。同时不要忘记除以2。

我知道那是我必须要做的,我只是在问如何去做。 - dukevin

0

0
潜在问题:在Java中,像'+'和'-'这样的运算符仅允许用于原始类型(如byte、int、long),而不适用于对象(一般情况下)和数组。
其他语言允许运算符重载,因此在C++中,您可以为Point对象定义一个'+'操作,然后您的初始想法将编译并运行。但是,在Java中不可能实现这一点。
唯一的例外是String(允许“添加”String对象)和Java 1.5+中的原始包装器,如Integer和Double(自动装箱将它们转换回原始类型)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接