【问题标题】:Java: calculating area of a triangleJava:计算三角形的面积
【发布时间】:2011-01-09 21:00:20
【问题描述】:
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 值,而不是点。我怎样才能修复我的代码,这样才能工作? 谢谢!

【问题讨论】:

    标签: java math geometry area


    【解决方案1】:

    根据维基百科,you formula is correct。文章包含大量有用且清晰的数据。
    根据java.awt.point documentation,你应该使用getX()getY()方法,它们返回一个点的坐标值。

    也就是说,

    应该表示为:

    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。

    【讨论】:

    • 非常感谢亚当的全面回答。我今天学到了一些东西!
    • 我完全同意使用 getter 和 setter:一般来说这是一个很好的做法,这只是一个例外。使用的类Point 是AWT(Abstract Window Toolkit)的一部分,用于在响应时间很关键的屏幕上绘制图形。因此,由于访问变量比调用方法要快得多,因此许多 AWT 类中都暴露了内部字段。 @adam-matan 所说的一切都完全正确,只是想指出为什么 java.awt.Point 不是数学点以及为什么会发生这种情况。
    • 谢谢!很高兴知道。
    【解决方案2】:

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

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

    您忘记了 a.x 中的 .x .y 中的 b.y 等,即 (a.x - c.x)* ...

    【讨论】:

      【解决方案3】:

      更新:我没有注意到 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))
      }
      

      【讨论】:

        【解决方案4】:

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

        别忘了除以 2。

        【讨论】:

        • 我知道这是我必须做的。我在问怎么做。
        【解决方案5】:

        使用a.x - c.x

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 2017-11-21
            • 2015-07-29
            • 2010-10-07
            • 1970-01-01
            • 1970-01-01
            • 2020-06-15
            相关资源
            最近更新 更多