LINUX.ORG.RU

Сообщения xterro

 

.Net AvaloniaUI Маленький вопрос

Приветствую, решил потыкать палкой AvaloniaUI, собрал простейшей приложение из одного пустого окна, запустил, после заглянул в менеджер процессов и малость офигел - потребление памяти больше 100Мб на одном пустом окне О_о. Как-то уменьшить нельзя?

https://add.pics/Y6KeId

 avaloniaui, netcore

xterro
()

KTechLab кто-нибудь юзает?

Приветствую, кто-нибудь юзает KTechlab? Имеется вопрос, в нём имеется поддержка только 84-го пика? А если надо камень чуть потолще, пару тройку таймеров, АЦП и т.д как с этим в KTechlab?

DarthVadimius

 

xterro
()

Кто нибудь юзает FLTK?

Как он вам, как лечите тормоза менюбара?

 

xterro
()

Astra Linux просветите по их FlyWM

Приветствую, мучает вопрос, просветите, в астре их DE Fly это всё таки собственная разработка или скомунизженное KDE? Если своя, то насколько своя, а насколько скомунизженная, а то вот тут нарыл https://tlhp.cf/astra-linux-violate-gpl/ получается что скомунизженное... тогда интересует, насколько сильно они перепилили оригинальный KDE? А ежели это всё таки свое hand made DE, то почему такую окаменелость как QT3 выбрали для разработки, посвежее или поинтереснее ничего другого не нашли? Cogniter

 atsra linux

xterro
()

Get*/Set* отдельными методами или одним, какой вариант более православный?

Приветствую, пишу портянку и всплыл вопрос, какой из двух вариантов на ваш взгляд православней и почему?

class A {
public:
    int  getVal() { return _val; }
    void setVal(int val) { _val = val; }
private:
    int _val;
}

или получение и установку переменной-члена класса объединить в одном методе:

class A {
public:
    int val(int val=-1) { if(val > -1) return _val; else _val = val; }
private:
   int _val;

}
имеет ли второй вариант право на жизнь, или он только для хипстеров волосатых под накуркой? )

 

xterro
()

Что можете сказать про СУВ Bazaar?

Чисто субъективно, как оно? Особенно в сравнении с «мастодонтами» в виде Git и Mercurial? Чего может не хватает при работе с ней?

 ,

xterro
()

Java2D Не получается сделать привязку курсора к узлам сетки

Доброго времени суток. Есть JPanel, расчертил на ней сетку, нужно чтобы при движении мышки, курсор(не сам указатель мышки, а просто нарисованный мной крестик) перемещался только по узлам этой сетки. Попробовал реализовать(код ниже). Вроде как всё работает, но немного не так как надо, курсор не совсем точно встаёт в узлы сетки - как-то неправильно высчитываются координаты узлов, причём, если поставить курсор у левой стороны окна(где координата Х меньше), то всё нормально, но чем больше вправо сдвигаюсь по Х, тем сильнее «убегает» курсор, тоже самое и по оси Y. Пояснение на скриншотах. Не пойму в чём причина, грешу на округление, либо как-то не так считаю помогите разобраться (

Немного картинок, чтобы было понятней: Когда всё ровно - http://savepic.ru/10767351.png

Теперь когда сдвигаемся в противоположный край окна - курсор убегает от узла сетки, причём, чем больше сдвиг - тем сильнее «убегание» - http://savepic.ru/10754039.png

тоже самое убегание по Y - http://savepic.ru/10803190.png

Код класса панели, на которой рисую

public class DrawArea extends JPanel implements MouseListener, 
                                                MouseMotionListener, 
                                                MouseWheelListener  {

    private int aDPI = 300;
        
    /** По умолчанию панель будет размером с лист А4 */
    private Dimension aSize = TR_Utils.mmsToPixels(TR_Utils.A4_PAGE_SIZE_MM, aDPI);  
    
     /** Коэффициент зумирования */
    private double  scaleFactor           = 1.0;
    
    /** Размер сетки(во внутренник единицах измерения), если включена */
    private int     gridSize              = 40;
    /** Позиция курсора - позиция от которой рисуем(в логических, мировых координатах) */
    private Point2D crossHairPosition     = new Point2D.Double();
    /** Привязывать ли курсор к сетке */
    private boolean snapCursorToGrid      = true;
    /** Включаем выключаем сетку */
    private boolean isGridEnabled         = true;
    /** Крест по центру экрана, если надо */
    private boolean isCrossEnabled        = true;
    /** Сглаживание, если требуется */
    private boolean isAnlialiasingEnabled = false;
    
    /** Включен режим рисования(рисуется курсор для 
     * рисования на панели, иначе простой указатель) */
    private boolean isDrawMode            = true;
    
    /** Включен ли режим просмотра для панели.
     * В этом режиме запрещено редактировать или что-либо рисовать на панели,
     * события мыши и клавиатуры игнорируются, изображение на панели 
     * панорамируется(если необходимо) */
    private boolean isViewMode            = false;
    
    /** Координата, на которой нажали кнопку */
    private Point mousePressedPos;
    
    //GridSize s = new GridSize(15, SizeMeasureUnits.MIL);
    
    private AffineTransform at = new AffineTransform();
    
    public DrawArea() {
        
        setPreferredSize(aSize);
        
        System.out.println("Size w: " + aSize.width + " h: " + aSize.height);
        
        addMouseMotionListener(this);
        addMouseListener(this);
        addMouseWheelListener(this);    
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension((int)(aSize.width*scaleFactor), 
                             (int)(aSize.height*scaleFactor));
    }
    
    /** Переводит координаты окна в координаты панели(мировые координаты) */
    private Point TranslateW2WCoordinates(int winX, int winY) {
        Container parent = getParent();
        Point point = null;
        if(parent != null)
            point = SwingUtilities.convertPoint(parent, new Point(winX, winY), this);
        
        return point;
    }
    
    public void setCenterInViewport() {
        Container parent = getParent();
        if (parent instanceof JViewport) {

            JViewport port = (JViewport)parent;
            Rectangle viewRect = port.getViewRect();

            int width = getWidth();
            int height = getHeight();

            viewRect.x = (width - viewRect.width) / 2 - viewRect.x;
            viewRect.y = (height - viewRect.height) / 2 - viewRect.y;
                
            port.scrollRectToVisible(viewRect);
        }
    }
    
    /** Находит ближайший узел сетки для установки курсора.
      * curX, curY - координаты курсора в мировых координатах */
    private Point getNearestGridPosition(int curX, int curY) {
        
        double scaledGridSize = gridSize * scaleFactor; 
               
        int cellx = (int)Math.round(curX / scaledGridSize);
        int celly = (int)Math.round(curY / scaledGridSize);
        
        int x = (int)Math.round(cellx * scaledGridSize);
        int y = (int)Math.round(celly * scaledGridSize);
        
        System.out.println("Grid size: " + gridSize + " ScaleFactor: " + scaleFactor + " Scaled grid size: " + scaledGridSize);
        System.out.println("Cursor pos - x: " + curX + " y: " + curY);
        System.out.println("Cell num - x: " + cellx + " y: " + celly);
        System.out.println("CrossHairPos - x: " + x + " y: " + y);
        System.out.println("--------------------");
        
        return new Point(x, y);
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        Graphics2D g2d = (Graphics2D) g;
        
        setBackground(Color.WHITE);
               
        if(isAnlialiasingEnabled) {
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                    RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        }
        
        /* Prepare draw area */
        if(isGridEnabled) {
            int w = getWidth();
            int h = getHeight();
            int gridStep = (int)Math.round(gridSize * scaleFactor);
            
            g2d.setColor(new Color(235, 235, 235));
            for(int i = 0; i < w; i += gridStep) 
                g2d.drawLine(i, 0, i, h);
            
            for(int j = 0; j < h; j += gridStep) 
                g2d.drawLine(0, j , w, j);
        }
        
        if(isCrossEnabled) {
            g2d.setColor(Color.GRAY);
            float[] dash = {2f, 0f, 2f};
            Stroke oldStroke = g2d.getStroke();
            BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, 
                                            BasicStroke.JOIN_ROUND, 1.0f, dash, 2f);
            g2d.setStroke(bs);
            g2d.drawLine(getWidth()/2, 0, getWidth()/2, getHeight());
            g2d.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
            g2d.setStroke(oldStroke);
        }
        
        if (isDrawMode) {
            int cs = 12; // размер крестика-курсора в пикселях
            g2d.setColor(Color.GRAY);
            
            /* Координаты курсора в мировых координатах, приведем их к оконным */
            int cx = (int)crossHairPosition.getX(); 
            int cy = (int)crossHairPosition.getY();
            
            Point p = SwingUtilities.convertPoint(this, new Point(cx, cy), getParent());
            
            g2d.drawLine(p.x-cs/2, p.y, p.x+cs/2, p.y);
            g2d.drawLine(p.x, p.y-cs/2, p.x, p.y+cs/2);
        }
      
        /* Отрисовываем всё остальное(рисуем модель) */  
        /*
        g2d.setColor(Color.WHITE);
        g2d.fillRect(100, 100, 80, 160);
        g2d.setColor(Color.BLACK);
        g2d.drawRect(100, 100, 80, 160); */
        
        
        g2d.dispose();
        
    }
    
    public void setDPI(int dpi) {
        aDPI = dpi;
        repaint();
    }
    
    public int getDPI() {
        return aDPI;
    }
    
    public void setGridSize(int sizePx) {
        if(sizePx <= 0)
            sizePx = 1;
        
        gridSize = sizePx;
        repaint();
    }
    
    public void setGridEnabled(boolean enabled) {
        isGridEnabled = enabled;
        repaint();
    }
    
    public void setCrossEnabled(boolean enabled) {
        isCrossEnabled = enabled;
        repaint();
    }
    
    public void setAntialiasingEnabled(boolean enabled) {
        isAnlialiasingEnabled = enabled;
        repaint();
    }
    
    public void setViewModeEnabled(boolean enabled) {
        isViewMode = enabled;
        repaint();
    }
    
    /** Включает режим просмотра и панорамирует всё что нарисовано
     * (чтобы оно влезло в вид) */
    public void setViewModeEnabled(boolean enabled, boolean panning) {
        isViewMode = enabled;
        
        /* Если включено панорамирование, перерисуем всё что есть 
         * предварительно отмасштабировав под размеры viewport-а */
        
        //...
        
        repaint();
    }

    /****** MOUSE EVENTS  ******/
    
    @Override
    public void mouseClicked(MouseEvent me) {}

    @Override
    public void mousePressed(MouseEvent me) {
        mousePressedPos = new Point(me.getPoint());
        System.out.println("mousePressedPos " + mousePressedPos.x + "/" + mousePressedPos.y);
    }

    @Override
    public void mouseReleased(MouseEvent me) {
        
    }

    @Override
    public void mouseEntered(MouseEvent me) {}

    @Override
    public void mouseExited(MouseEvent me) {}

    @Override
    public void mouseDragged(MouseEvent me) {
        if(!isViewMode) {
            if(SwingUtilities.isMiddleMouseButton(me)) {
                if(mousePressedPos != null) {

                    JViewport port = (JViewport)getParent();
                    Rectangle viewRect = port.getViewRect(); 

                    int deltaX = mousePressedPos.x - me.getX();
                    int deltaY = mousePressedPos.y - me.getY();

                    viewRect.x += deltaX;
                    viewRect.y += deltaY;

                    scrollRectToVisible(viewRect);
                }
            }
        }
    }

    @Override
    public void mouseMoved(MouseEvent me) {
        if(!isViewMode) {
            int x = me.getX();
            int y = me.getY();
            
            // в мировые координаты
            Point p = SwingUtilities.convertPoint(getParent(), new Point(x, y), this);
            JViewport port = (JViewport)getParent();
            Point vp = port.getViewPosition();

            //System.out.println( "view.x: " + x + " view.y: " + y + 
            //                    " / area.x: " + p.x + " area.y: " + p.y + 
            //                    " / vpos.x: " + vp.x + " vpos.y: " + vp.y);
            
            if(snapCursorToGrid) {
                // Привязываем курсор к узлам сетки
                Point np = getNearestGridPosition(p.x, p.y);
                crossHairPosition.setLocation(np.x, np.y);
            }
            else {
                crossHairPosition.setLocation(p.x, p.y);
            }
            repaint();
        }
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent mwe) {
        if(!isViewMode) {
            /* минус для изменения направления движения колесика при маштабировании, так удобнее */
            scaleFactor += -(0.035 * mwe.getWheelRotation());
            scaleFactor = Math.max(0.05, scaleFactor);
            scaleFactor = Math.min(scaleFactor, 4);
            revalidate();
            repaint();
        }
    }
}

P.S. Пытался убрать код под кат, не получилось (

 

xterro
()

Дайте ликбез про Node.js

Что это собственно такое, на пальцах и на что оно способно? Я так понял, это взяли JavaScript движок от браузера Chrome(V8), затолкали в отдельный пакет, который можно установить и вуаля, теперь можно на десктопе запускать JS код. Но везде всё какие-то «серверные» примеры использования, а возможно ли на этом делать десктопные приложения, скажем, какую-нибудь гляделку таблиц БД или графический редактор, чтобы не через веб-браузер?. Если да, то пара вопросов:

  • Насколько это целесообразно?
  • Есть ли библиотеки контролов к этому делу, там, вклади, текстовые поля, кнопки, таблицы, скроллбары и т.д или раз это всё «из веба», то это всё хозяйство рисуется самостоятельно на «всяких там css»?
  • Как оно по потреблению памяти и удобству установки и распространения на клиентских местах? Т.е сажем достаточно скачать папку с проектом, запустить в ней условно start.exe и всё будет работать, или нужно плясать с бубном на каждой машине?

Вроде всё, если ещё вспомню, спрошу :)

 

xterro
()

Эти ваши линуксы-2... KDE, как ускорить плазму?

Доброго времени суток, продолжаем серию «Эти ваши линуксы», теперь обратим свой взор на KDE, а именно на плазму. Как-то медленно она работает, причём, нет ощущения что тормозит(нет рывков, подвисаний и т.д), а как будто это программная задержка. Например, открываю менюшку(видео: http://vk.com/doc9268375_437283212?hash=f95eeaeebb969906e9&dl=3e60c19f4d4... двигаю курсором вверх-вниз, а выделение не поспевает за курсором. У кого какие мысли по этому поводу, что можно подкрутить чтобы пореактивней стало? :)

 , ,

xterro
()

Эти ваши линуксы... медленная отрисовка окон, доколе?

Почему в «этих ваших линуксах» медленно отрисовываются окна? И дрова видеокарты установлены и компьютер не слабый, а всё равно, при перетаскивании окон, заметно как его границы «перерисовываются», эдакой полосой, снизу вверх. В Хроме, при изменении размеров окна, так вообще с «залипаниями» всё перерисовывается... трэш какой-то. Отключил вертикальную синхронизацию, glxgears стал показывать под 2000 fps(до отключения только ~60), а толку... Использую ROSA Linux Fresh R7 (KDE), но это не важно, потому что такая же петрушка была и в Ubuntu, и в ALT-е, и даже в Fedora-e ... такая балалайка везде. Конфиги и вывод моей машины можно глянуть тут: http://hw.rosalinux.ru/index.php?probe=b4436bd6e7 Современные компы с туевой хучей гигафлопс и не могут отрисовать несчастное окошко... окошко Карл! Доколе?

Теперь по сути, доставайте свои поваренные книги по настройке граф. подсистемы и давайте мне народные советы, чего подкрутить или забить и страдать дальше?

 , ,

xterro
()

Chrome Выпадающий список адресов по клику мышки, как включить?

Приветствую, надоело в Хроме постоянно в панели адреса вбивать адрес сайта(хоть поиск и сразу находит по первым буквам, всё равно надоело...), можно ли как-то включить, чтобы было как в Firefox-е - треугольничег - жмякнул на него - выпал список с основными адресами. Имхо это гораздо удобнее, нежели тянуться к клавиатуре. Может в настройках чего есть?

 

xterro
()

Алгоритм заливки полигона, не могу понять один момент :(

Доброго времени суток, мне требуется коллективный разум. Суть в следующем: имеется документ с описанием нескольких алгоритмов заливки полигона http://www.fit.com.ru/Surveys/Course/Lecture_05_Part_2.doc Конкретно разбираю алгоритм построчной заливки с активными рёбрами(пункт 2.2). Для примера, я набросал простейший полигон с тремя вершинами, чтобы было попроще http://itmages.ru/image/view/2415642/8b32f19c Алгоритм по сути состоит из 2 основных этапов:

  • Заполнить список ребёр(вернее информацией о рёбрах) и упорядочить этот список по y1, т.е по у-координате начала ребра.
  • В цикле от верха до низа(по y координате) полигона, если достигли вершины, вычислить список активных рёбер, далее для них найти точки пересечения по оси х и закрасить эти промежутки линиями.

Вроде как всё просто. Проблема заключается в том, что я немного не догоняю, как найти ВСЕ активные рёбра для вершины. Попробую пояснить. По алгоритму(этап II), при достижении вершины полигона, т.е y_curr(тек. позиция скан.линии) = y1( у- координата начала) вершины, это ребро мы добавляем в список активных. Но фишка в том, что в этом случае, в списке акт. ребёр у нас будет всего одно ребро, а не два, как должно быть. Для приведённой картинки, это будет ребро AB, хотя, туда же должно добавиться ребро CA. Потому что, у ребра CA, точка начала, находится в вершине С, а не А, соответственно при сканировании, когда ещё «скан-линия» находится в точке А, координата(у) начала ребра CA ни как не может быть равна y_curr, ей может быть равна y-координата конца, но не начала. И ьак получается для любого ребра, по мере прохождения «скан-линии» сверху вниз.

Почему так получается: потому что ребра рисуются по о череди, и в кажой вершине не могут быть одновременно кординаты начала одного и другого ребра(вернее могут, но не в случае выпуклого многоугольника)... Собственно что я упускаю? Растолкуйте :(

 ,

xterro
()

FreeBSD(10.1, amd64) MPLABX как добавить 32-х разрядные библиотеки?

Доброго времени суток. Запилил я себе значит FreeBSD на машину, типа amd64, и захотелось мне MPLABX поиспользовать, да только 32-х разрядный он, и под Linux изрядно. При установке, библиотек своих 32-разрядных просит. Как грамотно добавить, чтоб всё по фен-шую было и нигде ничего не отпало?

$ sudo sh ./MPLABX-v2.35-linux-installer.sh 
Password:
64 Bit, check libraries
Check for 32 Bit libraries
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
These 32 bit libraries were not found and are needed for MPLAB X to run:
libc.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libdl.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libgcc_s.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libm.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libpthread.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
librt.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libstdc++.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libexpat.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libX11.so
ldconfig: illegal option -- p
usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]
libXext.so

iZEN

P.S. Надеюсь что ещё Pickit3 заведётся, по крайней мере девайс видит :)

 ,

xterro
()

Зачем юзать stm32 если для большинства задач хватает AVR?

Приветствую, смотрю, многие увлеклись STM32 контроллерами и переходят на них с AVR-ок(на том же хабре кучка статей). Собственно появился вопрос, а зачем? Понимаю, что фарша больше, но есть ли смысл? ведь для большинства задач, хватит и AVR, не жалко вставлять какой-нибудь STM32F100 в часы-термометр, чтоб весь этот фарш впустую пропадал?

 ,

xterro
()

Сертификация ФСТЭК, а что это собственно такое?

Приветствую, стало интересно, а что собственно за сертификация ФСТЭК, зачем она нужна. Вернее зачем нужна вроде как понятно, типа чтобы можно было использовать дистр. в гос. учреждениях и предприятиях, а собственно в чём заключается, эта самая сертификация? Почему дистрибутив с «сертификация ФСТЭК» стоит дороже? Там что весь исходный код перелопачивают, анализируют, бэкдоры выискивают или что?

xterro
()

маленький вопрос по Python

Приветствую, ситуация значит следующая, есть некий базовый класс с несколькими переменными-членами(типа общими для всех потомков) и несколько наследованных от него потомков. К потомках есть метод save, который возвращает строчку со значением всех переменных класса: Примерно так:

class Primitive:
    def __init__(self):
        self.type       = None
        self.thickness  = 1
        self.color      = "#000000"

    def save(self):
        pass
    
    def load(self, values):
        pass


class Line(Primitive):
    def __init__(self):
        self.x1 = 0
        self.x2 = 0
        self.y1 = 0
        self.y2 = 0

    def save(self):
        return  self.__class__.__name__ + " " +\
                str(self.x1)            + " " +\
                str(self.y1)            + " " +\
                str(self.x2)            + " " +\
                str(self.y2)            + " " +\
                str(super(Line, self).color)   # <---- ? как обратиться к родителю, чтобы подтянуть значения эго перемнных

    def load(self):
        pass

if __name__ == "__main__":
    line = Line()
    print line.save()

Но возникает вопрос, как из потомка обратиться к родителю, чтобы получить значения его переменных? Т.е на выходе должно быть что-то вроде:

Line 10 10 50 50 line 1 #ff0000

 

xterro
()

Потыкал тут малость Motif

... и знаете что? Оно мне доставило :) В связи с этим появился вопрос, чего такого, принципиального в этих тулкитах Motif/OpenMotif/Lesstif, что мешает использовать их и сейчас? Ну, внешний вид в расчёт не берём, он на любителя(но его можно же немножко прилизать, чтоб выглядело поприличнее http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=bks&a... ). Сглаживание шрифтов, локализация, оно тяжёлое? Ведь для серьезного софта, коим пользуются толстые бородатые дядьки, не важно, какой там тулкит, лишь бы всё работало, и работало хорошо, не так ли? )

xterro
()

Хочется странного Motif/Open Motif/Lesstif

Приветствую, захотелось странного, захотелось потыкать Motif (OpenMotif/Lesstif)... да да, не надо в меня помидорами кидать, поковыряю его палочкой, пусть повоняет немножко. Собсна собрал пару примеров, появился вопрос, чего кнопки то такие «толстые», поднастроить эту старину никак нельзя, кроме цвета и шрифтов? Кнопочки чуть потоньше сделать, например как tkinter питоновском, там ж более-менее выглядит. А тут прям толстота всего ))) Ну и вызовем главного по антиквариату: Eddy_Em

xterro
()

Tkinter + OpenGL киньте нормальным примером

Приветсвую, киньте нормальным примером работы с OpenGL в Tkinter. Так, вот чтобы был нормальный фрейм, с скажем меню, туллбаром, виджетом OpenGL, статусбаром А то все примеры что находятся, какие-то обрубки-недописки, непонятные совсем :(

xterro
()

OpenGL Двигать viewport в границах «области рисования» как ?

Приветствую, немного загрузился с одним вопросом:

Определил себе некую область, на ней нарисовал белый прямоугольник(это типа полотно для будущего рисования). Сдвинул систему координат в нижний левый угол. Добавил масштабирование. Соответственно, теперь при изменении масштаба, когда мой прямоугольник не влазит в экран, мне надо добавить перемещение окна, т.е viewport-а в границах моей области(чтобы он не выходил за её границы) Вроде всё просто, используем glTranslatef(...) но не понимаю, как это правильно сделать, что-то не идёт это у меня :( Подскажите, может примерами покидаетесь. Ну или хотя бы на пальцах объясните :)


mPaperSize = new FXSize(8268, 11693);  // 210x297 mm
mAreaSize = new FXSize(mPaperSize->w*2, mPaperSize->h*2);

void MainWindow::render()
{
  mGLCanvas->makeCurrent();
    glViewport(0, 0, mGLCanvas->getWidth(), mGLCanvas->getHeight());
    glClearColor(0.85, 0.85, 0.85, 1.0);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    
  // mAreaSize - моя область для рисования, на котором рисуется полотно, 
  // чтобы оставить некоторый отступ от полотна до края области
  glOrtho(0,  mAreaSize->w, 0, mAreaSize->h, -100, 100);
  glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

  glScalef(mScaleFactor, mScaleFactor, mScaleFactor);
    
  // начало положения листа
  int x = 50;
  int origin_x = mAreaSize->w/2 - mPaperSize->w/2; 
  int origin_y = mAreaSize->h/2 - mPaperSize->h/2;

  FXPoint points[4] = {  FXPoint(origin_x, origin_y), 
              FXPoint(origin_x + mPaperSize->w, origin_y), 
              FXPoint(origin_x + mPaperSize->w, origin_y + mPaperSize->h), 
              FXPoint(origin_x, origin_y + mPaperSize->h) };
  
  // чтобы было видно начало системы координат
  glBegin(GL_LINES);
    glVertex2i(1, 1);
    glVertex2i(1, 250);
    glVertex2i(1, 1);
    glVertex2i(100, 1);
  glEnd();

  glColor3f(1.0, 1.0, 1.0);  //paper blank
  glBegin(GL_QUADS);
    glVertex2i(points[0].x-x, points[0].y+x*2);
    glVertex2i(points[1].x-x, points[1].y+x*2);
    glVertex2i(points[2].x-x, points[2].y+x*2);
    glVertex2i(points[3].x-x, points[3].y+x*2);
  glEnd();

  
  glColor3f(0.0, 0.0, 0.0);  // edging 
  glBegin(GL_LINE_LOOP);
    glVertex2i(points[0].x-x, points[0].y+x*2);
    glVertex2i(points[1].x-x, points[1].y+x*2);
    glVertex2i(points[2].x-x, points[2].y+x*2);
    glVertex2i(points[3].x-x, points[3].y+x*2);
  glEnd();
  
    mGLCanvas->swapBuffers();
    mGLCanvas->makeNonCurrent();
}



// при масштабировании просто меняю коэффициент и перерисовываю

long MainWindow::onMouseWheel(FXObject*, FXSelector, void* ptr)
{
  FXEvent *ev = (FXEvent*)ptr;

  if(ev->code > 0)
    mScaleFactor += 0.1;
  else
    mScaleFactor -= 0.1;

  updateStatusBar();

  render();
  return 1;
}

Так же есть ещё один вопрос, как устанавливать коэффициент масштабирования? Т.е его лучше брать просто каким-то фиксированным, например 10, 100, 1000... или как-то высчитывать в соответствии с масштабом?

xterro
()

RSS подписка на новые темы