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<-面積式

2Dデカルト座標系の3点(x、y)から三角形の面積を計算しようとしています。上記の式は三角形の面積を正しく生成すると想定していますが(そうでない場合は修正してください)、コンパイラーは「演算子-java.awt.Point、java.awt.Pointに適用できません」と言っています。互いにポイントを引くことはできないので、これを言っていると思いますが、数式の各値は、ポイントではなく、x値またはy値のいずれかです。これが機能するようにコードを修正するにはどうすればよいですか?ありがとう!

4

6 に答える 6

12

ウィキペディアによると、あなたの公式は正しいです。この記事には、有用で明確なデータがたくさん含まれています。java.awt.pointのドキュメント
に よると、ポイントの座標値を返すメソッドとメソッドを使用する必要があります。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メソッドがある場合は、オブジェクトの変数にアクセスするべきではないからです。これは、インターフェイスと実装を分離する1つの側面です。データは、 ;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など、つまり(ax --cx)*..を忘れました。

于 2010-01-27T09:11:20.473 に答える
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))
}
于 2010-01-27T09:15:50.957 に答える
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 に答える
0

根本的な問題:Javaでは、「+」や「-」などの演算子はプリミティブ型(byte、int、longなど)でのみ許可され、オブジェクト(一般)や配列では許可されません。

他の言語では演算子のオーバーロードが許可されているため、C ++ではPointオブジェクトに対して「+」操作を定義でき、そこで最初のアイデアがコンパイルされて実行されます。しかし、それはJavaでは不可能です。

唯一の例外は、String(Stringオブジェクトを「追加」することが許可されている)と、Java 1.5以降のIntegerやDoubleなどのプリミティブラッパー(オートボクシングはそれらをプリミティブに戻す)です。

于 2010-01-27T09:31:47.913 に答える