Java-программирование (1-ые посты)  9.10.2015 / 18:32 |  |  Naik    Пользователь  
   Сейчас: Offline 
 Имя: %name% Регистрация: 14.03.2010
   | Вроде вышло. На картинке весь круг нарисован квадратными кривыми по 3х точках, как видно, это не совсем круг. Опытным путем нарисовал сегмент кубической кривой, и похоже то, что надо. Расположение контрольных точек на рисунках. синий - контрольные точки кривых
   Изменено Naik (9.10 / 18:33) (всего 1 раз)
 Прикрепленные файлы:   quad.png (1.94 кб.) Скачано 146 раз    cubic.png (2.04 кб.) Скачано 140 раз    Знімок екрана з(…).png (13.29 кб.) Скачано 562 раза   |  
   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 кб.) Скачано 522 раза   |  
   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) 
                 |