Java:计算三角形的面积

时间:2010-01-27 09:04:17

标签: java math geometry area

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< - 区域公式

我试图从2D笛卡尔坐标系中计算3点(x,y)的三角形面积。我假设我的上面的公式正确地产生了三角形的区域(如果没有,请纠正我),但我的编译器说“operator - 不能应用于java.awt.Point,java.awt.Point”。我假设它是这样说的,因为你不能相互减去点,但公式中的每个值都是x或y值,而不是点。如何修复我的代码以便这样做? 谢谢!

6 个答案:

答案 0 :(得分:12)

根据维基百科,you formula is correct。本文包含大量有用且清晰的数据 根据{{​​3}},您应该使用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。

答案 1 :(得分:3)

编译器正在告诉你完全正确的事情。

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

你忘了.x在.x .y in b.y等,即(a.x - c.x)* ...

答案 2 :(得分:2)

更新:我没有注意到OP已经链接到一个公式,这就是为什么我查找这个并对其进行编码的原因。你应该使用另一个公式,因为这个涉及更多的计算(包括对sqrt的4次调用,我认为这会很重)。


使用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))
}

答案 3 :(得分:0)

如链接公式所示,不要使用点计算,而应使用x和y值计算。我会留给你(这是家庭作业!)在java中做到这一点。

不要忘记除以2。

答案 4 :(得分:0)

答案 5 :(得分:0)

潜在问题:在Java中,像'+'和' - '这样的运算符只允许用于原始类型(如byte,int,long),但不允许用于对象(通常)和数组。

其他语言允许运算符重载,因此在c ++中你可以为Point对象定义一个'+'操作,你最初的想法就是编译和运行。但这在Java中是不可能的。

唯一的例外是String(它允许'添加'String对象)和Java 1.5+中的原始包装器(如Integer和Double)(自动装箱将它们转换回原语)