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) 计算三角形的面积。我假设我上面的公式正确地产生了三角形的面积(如果不是,请纠正我)但我的编译器说“运算符 - 不能应用于 java.awt.Point,java.awt.Point”。我假设它是这样说的,因为你不能互相减去点,但公式中的每个值都是 x 或 y 值,而不是点。我怎样才能修复我的代码,这样才能工作?谢谢!

4

6 回答 6

12

根据维基百科,你的公式是正确的。文章包含大量有用且清晰的数据。
根据java.awt.point 文档,您应该使用getX()andgetY()方法,它返回一个点的坐标值。

那是,

替代文字

应表示为:

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。

于 2010-01-27T09:07:20.040 回答
3

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

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

你忘记了 .x in ax .y in by etc. 即 (ax - cx)* ...

于 2010-01-27T09:11:20.473 回答
2

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


使用Heron公式

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))
}
于 2010-01-27T09:15:50.957 回答
0

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

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

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

于 2010-01-27T09:31:47.913 回答
0

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

并且不要忘记除以 2。

于 2010-01-27T09:10:02.153 回答
0

使用a.x - c.x

只需阅读 Javadoc:http: //java.sun.com/j2se/1.5.0/docs/api/java/awt/Point.html

于 2010-01-27T09:11:37.477 回答