Вниз  Java-программирование (1-ые посты)
- 9.10.2015 / 18:32
Naik
  Пользователь

Naik 
Сейчас: Offline
Вроде вышло. На картинке весь круг нарисован квадратными кривыми по 3х точках, как видно, это не совсем круг. Опытным путем нарисовал сегмент кубической кривой, и похоже то, что надо. Расположение контрольных точек на рисунках. синий - контрольные точки кривых

Изменено Naik (9.10 / 18:33) (всего 1 раз)


Прикрепленные файлы:
quad.png (1.94 кб.) Скачано 145 раз
cubic.png (2.04 кб.) Скачано 136 раз
Знімок екрана з(…).png (13.29 кб.) Скачано 535 раз
- 9.10.2015 / 18:52
Naik
  Пользователь

Naik 
Сейчас: Offline
Хотя нет, круг на кубических кривых тоже кривоват, только "в другую сторону" надо по другому размещать контрольные точки

Примерный код
Открыть спойлер


Изменено Naik (9.10 / 18:52) (всего 1 раз)


Прикрепленные файлы:
Знімок екрана з(…).png (4.65 кб.) Скачано 494 раза
- 9.10.2015 / 20:53
Naik
  Пользователь

Naik 
Сейчас: Offline
Нашел формулы
Если рисовать четырьма кубическими кривыми, то расстояние к контрольным точкам надо брать не половину радиуса как я, а
  1. L = (int) Math.Round(iRadius * 4f / 3 * Math.Tan(Math.PI / 8));

- 10.10.2015 / 12:03
Naik
  Пользователь

Naik 
Сейчас: Offline
Круги рисует теперь нормально. Но интересная проблема появилась - т.к. я делаю преобразования с пом. матрицы float-ов, то например, если крутить вокруг точки прямоугольник минуту, то он уменьшится в несколько раз :gg: накапливается ошибка

Изменено Naik (10.10 / 12:03) (всего 1 раз)
- 10.10.2015 / 12:18
Oak
  Пользователь

Oak 
Сейчас: Offline
Naik, вот это кек. Можно double использовать -- будет медленнее уменьшаться :)
__________________
 Эль Презеденте
- 10.10.2015 / 14:34
Naik
  Пользователь

Naik 
Сейчас: Offline
Oak, что-то я вообще не пойму что происходит, сменил везде на double, упростил матрицу вращения до вращения вокруг центра координат, но все равно. Если THETA задать 2 градуса в радианах, то уменьшается медленно, если задать 10 градусов за итерацию, то почти сразу уходит в точку изображение)

Явно что-то не так
Вот упрощенная матрица (без перемещений в начало координат и назад)
  1. private static final double THETA = D * PI / 180;
  2.  
  3. new Matrix3d(
  4.   cos(THETA), sin(THETA), 0,
  5.   -sin(THETA), cos(THETA), 0,
  6.    //-cx * (cos(THETA) - 1) + cy * sin(THETA), -cx * sin(THETA) - cy * (cos(THETA) - 1), 1
  7.    0, 0, 1
  8. ));

Вот как она применяется к точкам
Открыть спойлер

Что-то тут не так
- 10.10.2015 / 14:54
Naik
  Пользователь

Naik 
Сейчас: Offline
Если угол 180, или 0 град., то ничего не уменьшается..
- 10.10.2015 / 15:19
Naik
  Пользователь

Naik 
Сейчас: Offline
В общем, нужно хранить оригиналы координат точек объектов, а менять только матрицы, и применять их только при рисовании.
- 10.10.2015 / 16:37
DominaN
  Пользователь

DominaN 
Сейчас: Offline
Naik, посмотри в моем двиге самописные матрицы, к тому же GL совместимые
- 10.10.2015 / 16:42
DominaN
  Пользователь

DominaN 
Сейчас: Offline
Naik, и еще, нельзя напрямую применять матрицу к точкам, нужно так:
  1. public void transform(Matrix3d m) {
  2.     float tmp_x = x;
  3.     float tmp_y = y;
  4.  
  5.     x = tmp_x * m.m00 + tmp_y * m.m10 + m.m20;
  6.     y = tmp_x * m.m01 + tmp_y * m.m11 + m.m21;
  7. }

Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)