Java-программирование (1-ые посты) 9.10.2015 / 18:32 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Вроде вышло. На картинке весь круг нарисован квадратными кривыми по 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 Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Хотя нет, круг на кубических кривых тоже кривоват, только "в другую сторону" надо по другому размещать контрольные точки Примерный код Открыть спойлер Закрыть спойлер public void draw(GraphicsContext graphicsContext) {
graphicsContext.beginPath();
graphicsContext.moveTo(midLeft.getX(), midLeft.getY());
graphicsContext.bezierCurveTo(midLeft.midpoint(leftTop).getX(), midLeft.midpoint(leftTop).getY(),
leftTop.midpoint(midTop).getX(), leftTop.midpoint(midTop).getY(),
midTop.getX(), midTop.getY());
graphicsContext.bezierCurveTo(midTop.midpoint(rightTop).getX(), midTop.midpoint(rightTop).getY(),
rightTop.midpoint(midRight).getX(), rightTop.midpoint(midRight).getY(),
midRight.getX(), midRight.getY());
graphicsContext.bezierCurveTo(midRight.midpoint(rightDown).getX(), midRight.midpoint(rightDown).getY(),
rightDown.midpoint(midDown).getX(), rightDown.midpoint(midDown).getY(),
midDown.getX(), midDown.getY());
graphicsContext.bezierCurveTo(midDown.midpoint(leftDown).getX(), midDown.midpoint(leftDown).getY(),
leftDown.midpoint(midLeft).getX(), leftDown.midpoint(midLeft).getY(),
midLeft.getX(), midLeft.getY());
graphicsContext.stroke();
}
Изменено Naik (9.10 / 18:52) (всего 1 раз)
Прикрепленные файлы: Знімок екрана з(…).png (4.65 кб.) Скачано 494 раза |
9.10.2015 / 20:53 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Нашел формулы Если рисовать четырьма кубическими кривыми, то расстояние к контрольным точкам надо брать не половину радиуса как я, а L = (int) Math.Round(iRadius * 4f / 3 * Math.Tan(Math.PI / 8));
|
10.10.2015 / 12:03 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Круги рисует теперь нормально. Но интересная проблема появилась - т.к. я делаю преобразования с пом. матрицы float-ов, то например, если крутить вокруг точки прямоугольник минуту, то он уменьшится в несколько раз накапливается ошибка Изменено Naik (10.10 / 12:03) (всего 1 раз) |
10.10.2015 / 12:18 | | Oak Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| Naik, вот это кек. Можно double использовать -- будет медленнее уменьшаться __________________
Эль Презеденте |
10.10.2015 / 14:34 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Oak, что-то я вообще не пойму что происходит, сменил везде на double, упростил матрицу вращения до вращения вокруг центра координат, но все равно. Если THETA задать 2 градуса в радианах, то уменьшается медленно, если задать 10 градусов за итерацию, то почти сразу уходит в точку изображение) Явно что-то не так Вот упрощенная матрица (без перемещений в начало координат и назад) private static final double THETA = D * PI / 180;
new Matrix3d(
cos(THETA), sin(THETA), 0,
-sin(THETA), cos(THETA), 0,
//-cx * (cos(THETA) - 1) + cy * sin(THETA), -cx * sin(THETA) - cy * (cos(THETA) - 1), 1
0, 0, 1
));
Вот как она применяется к точкам Открыть спойлер Закрыть спойлер import javax.vecmath.Matrix3d;
public class Point {
private double x, y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public Point add(double x, double y) {
return new Point(this.x + x, this.y + y);
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void transform(Matrix3d m) {
x = x * m.m00 + y * m.m10 + m.m20;
y = x * m.m01 + y * m.m11 + m.m21;
}
public static void transform(Matrix3d m, Point... points) {
for (Point p : points) p.transform(m);
}
}
Что-то тут не так |
10.10.2015 / 14:54 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Если угол 180, или 0 град., то ничего не уменьшается..
|
10.10.2015 / 15:19 | | Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| В общем, нужно хранить оригиналы координат точек объектов, а менять только матрицы, и применять их только при рисовании.
|
10.10.2015 / 16:37 | | DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Naik, посмотри в моем двиге самописные матрицы, к тому же GL совместимые
|
10.10.2015 / 16:42 | | DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Naik, и еще, нельзя напрямую применять матрицу к точкам, нужно так: public void transform(Matrix3d m) {
float tmp_x = x;
float tmp_y = y;
x = tmp_x * m.m00 + tmp_y * m.m10 + m.m20;
y = tmp_x * m.m01 + tmp_y * m.m11 + m.m21;
}
|
Всего сообщений: 16875 Фильтровать сообщения Поиск по теме Файлы топика (794)
|