Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2013, 23:17   #1
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
Вопрос Проблема с double при вычислении выражения

Здравствуйте! Пишу свою первую программу на java. Застрял на этой строке:
Код:
xCalc=points[j].getX()+(points[j+1].getX()-points[j].getX())*(n/calculatedPoints.length);
где:
xCalc - double,
points[], basePoints[] и calculatedPoints[]- Point2D(double),
Код:
points=basePoints.clone();
n - int.

И при таких значениях:
points[j].x = 0,
points[j+1].x = 100,
calculatedPoints.length = 4,
n = 1
xCalc получается не 25 (0+(100-0)*(1/4)), а 0

Выдайт такую ошибку: java.lang.ArrayIndexOutOfBoundsExce ption: 10, но это, скорее всего, с вопросом не связано.

Наверное много ненужного написал, зато лишних вопросов не будет) Подскажите пожалуйста как правильно записать выражение?
x_Alex_x вне форума Ответить с цитированием
Старый 18.07.2013, 08:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну так приведите аргументы выражения в скобках к double перед делением.

я не знаю java, но я бы попробовал так:
Код:
....((1.0*n)/calculatedPoints.length)
или так:
Код:
....((1.0*n)/(1.0*calculatedPoints.length))
или так:
Код:
....((double)n)/(double)calculatedPoints.length)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.07.2013, 10:00   #3
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Это, конечно, самый очевидный выход , но я бы хотел обойтись без приведения типов
И ещё: хоть я и писал points=basePoints.clone(); при изменении значений points[] (например points[0].setLocation(50,60), всё равно изменяются и значения basePoints[]

Последний раз редактировалось x_Alex_x; 18.07.2013 в 10:12.
x_Alex_x вне форума Ответить с цитированием
Старый 18.07.2013, 13:05   #4
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
или так:
Код:
....((1.0*n)/(1.0*calculatedPoints.length))
Вот это помогло. Спасибо!

Не поможете теперь разобраться с clone()?
x_Alex_x вне форума Ответить с цитированием
Старый 18.07.2013, 20:21   #5
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

При отладке обнаружил, что после выполнения строки points=basePoints.clone(); переменные в массиве points не обновлятся, а изменяется только.. не знаю как правильно сказать, но происходит то же самое, что и при использовании чего-то типа points = new Point2D[x];
x_Alex_x вне форума Ответить с цитированием
Старый 18.07.2013, 20:47   #6
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Сам разобрался) Не стал использовать clone(), а просто переписал в цикле все элементы.
x_Alex_x вне форума Ответить с цитированием
Старый 22.07.2013, 19:44   #7
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

Возник ешё один вопрос, по тому же самому выражению.
Для вычисления значений точки использую несколько повторений просчёта по такой строке:
Код:
xCalc=points[j].getX()+(points[j+1].getX()-points[j].getX())*(n/(calculatedPoints.length-1.0));
xCalc это double.
Затем, используя (int) и Graphics2D drawLine рисую на экране линии по вычисленным точкам (это кривые Безье) Выходит вот что:

Вопрос: почему появляются такие зазубрины и как их убрать?

ps: когда-то писал подобную штуку на winapi и там то же самое было.

Последний раз редактировалось x_Alex_x; 22.07.2013 в 19:48.
x_Alex_x вне форума Ответить с цитированием
Старый 24.07.2013, 00:38   #8
darknim
Пользователь
 
Регистрация: 14.12.2012
Сообщений: 36
По умолчанию

Углубляясь в Graphics2D там почитай про сглаживание.
darknim вне форума Ответить с цитированием
Старый 24.07.2013, 10:59   #9
x_Alex_x
Пользователь
 
Регистрация: 13.01.2013
Сообщений: 94
По умолчанию

darknim, сглаживание не поможет я уже его ставил. Проблема в самом расчёте точек или способе округления. Очевидно же, что таких углов на кривой быть не может.
x_Alex_x вне форума Ответить с цитированием
Старый 24.07.2013, 12:03   #10
darknim
Пользователь
 
Регистрация: 14.12.2012
Сообщений: 36
По умолчанию

ну тогда тут у тебя косяк с округлением. например у тебя в расчетах получается число 1.6 ты его приводишь к int, получаешь 1. А при правильном округлении должно получится 2.
darknim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в вычислении. caliente Общие вопросы C/C++ 4 22.02.2013 02:56
Сообщение об ошибке при вычислении длины строки vedro-compota Общие вопросы Delphi 24 17.05.2010 16:23
При вычислении максимального значения выдает О kerill385884 Помощь студентам 3 25.03.2010 18:52
Ошибка при вычислении.. CodeExpert Помощь студентам 7 17.02.2010 17:24
Странная проблема при сложении double. Помогите разобраться. ivank Общие вопросы C/C++ 2 23.09.2008 13:04