Java: вычисление площади треугольника - PullRequest
4 голосов
/ 27 января 2010
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 <- формула площади </p>

Я пытаюсь вычислить площадь треугольника из 3 точек (x, y) из двухмерной декартовой системы координат. Я предполагаю, что моя формула, приведенная выше, правильно отображает площадь треугольника (если нет, пожалуйста, исправьте меня), но мой компилятор говорит: «Оператор - нельзя применить к java.awt.Point, java.awt.Point» Я предполагаю, что это говорит об этом, потому что вы не можете вычитать точки друг из друга, но каждое значение в формуле является либо значением x, либо y, а не точкой. Как я могу исправить свой код, чтобы это работало? Спасибо!

Ответы [ 6 ]

12 голосов
/ 27 января 2010

Согласно Википедии, ваша формула верна . Статья содержит много полезных и понятных данных.
Согласно документации java.awt.point , вы должны использовать методы 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, потому что вам не следует обращаться к переменной объекта, если у вас есть метод получения, который это делает. Это один из аспектов разделения между интерфейсом и реализацией: данные point.x могут храниться во многих формах, а не только int; Метод интерфейса гарантирует, что вы будете получать int каждый раз, когда будете его использовать.

3 голосов
/ 27 января 2010

компилятор говорит вам точно правильную вещь.

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

вы забыли .x в a.x .y в b.y и т. Д., То есть (a.x - c.x) * ...

2 голосов
/ 27 января 2010

Обновление: я не заметил, что 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))
}
0 голосов
/ 27 января 2010

Основная проблема: в Java такие операторы, как '+' и '-', разрешены только для примитивных типов (таких как byte, int, long), но не для объектов (в целом) и массивов.

Другие языки допускают перегрузку операторов, поэтому в c ++ вы можете определить операцию '+' для объектов Point, и там ваша первоначальная идея будет компилироваться и выполняться. Но это невозможно в Java.

Единственными исключениями являются String (допускается «добавление» объектов String) и примитивные оболочки, такие как Integer и Double в Java 1.5+ (автобокс преобразует их обратно в примитивы)

0 голосов
/ 27 января 2010

Использование a.x - c.x и т. Д.

Просто прочитайте Javadoc: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Point.html

0 голосов
/ 27 января 2010

Как говорит связанная формула, рассчитывайте не по точкам, а по их значениям x и y. Я оставлю это вам (это домашнее задание!) Делать это в Java.

И не забудьте поделить на 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...