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值,而不是点。如何修复我的代码以便这样做? 谢谢!
答案 0 :(得分:12)
根据维基百科,you formula is correct。本文包含大量有用且清晰的数据
根据{{3}},您应该使用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。
答案 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)
使用a.x - c.x
等
阅读Javadoc: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Point.html
答案 5 :(得分:0)
潜在问题:在Java中,像'+'和' - '这样的运算符只允许用于原始类型(如byte,int,long),但不允许用于对象(通常)和数组。
其他语言允许运算符重载,因此在c ++中你可以为Point对象定义一个'+'操作,你最初的想法就是编译和运行。但这在Java中是不可能的。
唯一的例外是String(它允许'添加'String对象)和Java 1.5+中的原始包装器(如Integer和Double)(自动装箱将它们转换回原语)