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

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

ответ

12

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

+0

Спасибо большое за исчерпывающий ответ, Адам. Сегодня я чему-то научился! – dukevin

+1

Я полностью согласен с использованием геттеров и сеттеров: это хорошая практика в целом, это просто исключение. Используемый класс 'Point' является частью AWT, Abstract Window Toolkit, предназначенного для рисования графики на экране, где критическое значение времени отклика. Таким образом, поскольку доступ к переменной происходит быстрее, чем вызов метода, внутренние поля отображаются во многих классах AWT. Все, что сказал @ adam-matan, совершенно правильно, просто хотел указать, почему 'java.awt.Point' не является математической точкой и почему это происходит. –

+0

Спасибо! Хорошо знать. –

0

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

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

+0

Я знаю, что это то, что я должен сделать. Я спрашивал, как это сделать. – dukevin

3

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

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

Вы забыли .x в топора .y в по пр т (Топор - сх) * ...

2

Обновление: Я не заметил, что ОП связал формулу, поэтому я посмотрел на нее и закодировал ее. Вы должны использовать другую формулу, так как это связано с большим количеством вычислений (в том числе 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)) 
} 
0

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

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

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

Смежные вопросы