Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: VBA Авт. отрисовка карты полей изм. цвета полилинии.

Код:

Sub color()
For i = 2 To 436
m = Sheets("Ротация").Cells(i, 1).Value
col = 1
y = Sheets("Карта").Cells(3, 23).Value
For c = 3 To 15
If Sheets("Карта").Cells(c, 25).Value = Sheets("Ротация").Cells(i, y).Value Then
col = c
Else
End If
Next c
ActiveSheet.Shapes.Range(Array(m)).Select
    With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = ActiveSheet.Cells(col, 24).Interior.color
        .Transparency = 0
        .Solid
    End With

Next i
End Sub



ссылка на файл
Ответ: Привет!
Готовый код ждёт Вас =
Вопрос: Unfolding map непрорисовка оффлайн карты

Здраствуйте. У меня возникли проблемы с отрисовкой карты в оффлайн режиме. Вернее, сама карта отображаеться, но когда приближаешь к какой-то стране на уровень региона, то становиться просто пустой черный фрейм, а если обратно отзумить, то опять прорисовываеться. Уже перепроверил нексолько способов. Думал, что сама карта такая, что деталей нету, но увы, скачав другую, лучше не стало.
Код:
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import de.fhpotsdam.unfolding.UnfoldingMap;
import de.fhpotsdam.unfolding.geo.Location;
import de.fhpotsdam.unfolding.providers.AbstractMapProvider;
import de.fhpotsdam.unfolding.providers.Google;
import de.fhpotsdam.unfolding.providers.MBTilesMapProvider;
import de.fhpotsdam.unfolding.providers.Microsoft;
import de.fhpotsdam.unfolding.utils.MapUtils;
import processing.core.PApplet;
 
public class MainMap extends PApplet {
    
    public static final boolean offline = true;
    public static final String TILES_LOCATION_APPLET = "./tiles/blankLight-1-3.mbtiles"; 
    public static String mbTilesString = TILES_LOCATION_APPLET;
    private UnfoldingMap map; 
    private int zoomLevel = 10;
    
    private AbstractMapProvider provider1, provider2, provider3;
    
    
    public void setup(){
        
        size(800,600, OPENGL);// 
        
         provider1 = new Google.GoogleMapProvider();
         provider2 = new Microsoft.AerialProvider();
         provider3 = new Microsoft.RoadProvider();
            
        
        if (offline) { 
            map = new UnfoldingMap(this, 0, 0, 800, 600, new MBTilesMapProvider(mbTilesString));
           
        
        }else{ 
            map = new UnfoldingMap(this, 0, 0, 800, 600, provider1);
        }
        
        
         map.setZoomRange(1, 15);
         MapUtils.createDefaultEventDispatcher(this, map);//
         
         map.zoomAndPanTo(zoomLevel, new Location(48.6f,  22.2f));
        
    }
    
    public void draw(){
        background(0);
        map.draw();
        this.mainRect();
    }
    
    public void keyPressed(){
        
        if (key == '1'){
            map.mapDisplay.setProvider(provider1);
        }else if (key == '2'){
            map.mapDisplay.setProvider(provider2);
        }else if (key == '3'){
            map.mapDisplay.setProvider(provider3);
        }
            
        
      }
     public void mainRect(){
        
         fill(color(250,250,250));
         rect(100, 500, 600, 100, 7);
         
        }
    }
Ответ: dulgeoion, когда есть подключение к интернету все показывает нормально?
Вопрос: Ускорение отрисовки Graphics для невидимых областей

Есть самописный контрол для работы с картами. На карту можно наносить маршруты. Маршрут представляет собой замкнутый контур, он задаётся точками маршрута которые имеют геокоординаты (долгота и широта).

Географические координаты (долгота, широта) переводятся в плоские, для отрисовки на карте, которая составляется из тайлов, используя преобразования Меркатора – и с этим проблем нет, точность отличная!
Все что написал Выше - что бы от бросить вопросы, для чего это нужно зачем так делать и дт.

Теперь собственно сама проблема: сама карта может масштабироваться, «прокручиваться», короче все, как и при использовании подобных сервисов типа Googl. Так вот, если маршрут (например как на рисунке 1) при масштабе 3, и мы изменяем масштаб карты до 12 то при отрисовке через метод DrawLines (да ваще как угодно) возникают тормоза. Понятно что точки №1 и №2 находятся ДАЛЕКО за пределами контроля (не видны), не ужели методы Graphics не учитываю такой вариант? К стати чем больше детализация карты тем сильнее тормоза. Может я чего то недопонимаю?
Обошел я данную проблему следующим образом .
Перед отрисовкой маршрута проверяю есть ли точки которые выходят за контрол, если да, то рассчитываю точку (точки) пересечения с границей контрола и отрисовываю по ним. Но это как то громоздко! Проще же написать например какой ни будь DrawLines, но он зараза тормози ЖУТКО «лаги» в десятках секунд могут исчисляться.

Можно ли применить стандартный метод Graphics в моем случаи без последствий для производительности и как в принципе получаются эти "тормоза"?
Надеюсь понятно обрисовал проблему.
Ответ:
Сообщение от Sanya_sa
Но стоит не задавать DashPattern и все нормально! Мои точечки как по маслу скользят на карте! Правда они теперь сплошными прямыми соеденены. Изначально задал этот DashPattern и даже не мелькнуло, что при пунктире может тормозить) Интересно почему (я про тормоза отрисовок).
Ну, видимо паттерн рассчитывается для всей линии до отсечения. Соответственно, если линия длинная, то расчет паттерна очень долгий.
Вы можете вместо паттерна использовать HatchBrush. Оно конечно не так красиво как с паттерном, но зато быстродействие будет не меньше как при отрисовке сплошной линии:
C#
1
2
3
4
5
            using (var brush = new HatchBrush(HatchStyle.LargeCheckerBoard, Color.FromArgb(120, 255, 5, 0), Color.Transparent))
            using (var pen = new Pen(brush))
            {
                e.Graphics.DrawLine(pen, p1, p2);
            }
Вопрос: Отрисовка изображения при нажатии кнопки MFC проект

Здравствуйте! Делаю карточную игру в MFC проекте на C++. На данном этапе нужно реализовать отрисовку новой карты на форме главного диалогового окна при нажатии кнопки. Создал на форме кнопку, добавил к ней bool переменную ibtn. В методе OnPaint() описал условие if, при котором отрисовывается новая карта...но она не отрисовывается. Для проверки работоспособности добавил в условие if MessageBox() с тестовым сообщением. При нажатии кнопки сообщение отображается. Тогда строку отрисовки новой карты вынес за пределы условия if - и она отрисовалась. Я в замешательстве...Помогите пожалуйста, что я не так делаю?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CGAME_MFCDlg::OnPaint()
{
    CPaintDC dc(this); // контекст устройства для рисования
 
    mass[10].ikart.BitBlt(dc, 5, 200);  
    if (ibtn==true)
    {
        mass[10].ikart.BitBlt(dc, 5, 200);
        MessageBoxW(L"dsad");
    }
}
 
void CGAME_MFCDlg::OnBnClickedButton2()
{
    ibtn = true;  
    OnPaint();
}
Ответ: Так не определить, может с битмапами карт или их контекстами что-то нахимичил.
Прикрепи архив с проектом, надо весь код смотреть. (кнопка со скрепкой - "Вложения" называется)
Вопрос: С++ Builder XE. Использование оффлайн карты в приложении

Уважаемые, подскажите, пожалуйста, с помощью чего можно добавить в программу можно добавить оффлайн карту? Принципиально нужна возможность расстановки точек и рисование линий на карте. Всё это прекрасно реализуется при помощи Chromium + Yandex Map Api, но, руководство выдвинуло требование, чтобы карты были оффлайн. Заранее благодарю.
Ответ: Но может кто-нибудь знает какие-то модули, расширения (C++ фреймворк???) для отрисовки файлов карт?
Вопрос: Duck Hunt отрисовка уток

Пытаюсь написать игру duck hunt с помощью SDL2.

Имеется такой цикл обработки евентов. По движению мыши происходит отрисовка прицела.

Код C++ (QT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while (!done) {
 
        SDL_WaitEvent(&event);
 
        switch (event.type) {
            case SDL_QUIT:
                done = true;
                break;
            case SDL_WINDOWEVENT:
                switch (event.window.event) {
                    case SDL_WINDOWEVENT_RESIZED:
                        SDL_RenderPresent(renderer);
                        break;
                    case SDL_WINDOWEVENT_RESTORED:
                        SDL_RenderPresent(renderer);
                        break;
                }
                break;
            case SDL_MOUSEMOTION:
                cout<<event.motion.x<<" - "<<event.motion.y<<endl, drawAim(event.motion.x,event.motion.y);
                break;
            case SDL_MOUSEBUTTONDOWN:
                attack(event.motion.x, event.motion.y);
                break;
        }
    }
Возникает проблема с отрисовкой летящей утки. Сначала сделал её тоже в while(true), но тогда не отрисовывается прицел, изза того что из while не выходит. Пробовал пустить утку в отдельный поток, но были мерцания при отрисовке. Подскажите как это лучше решить.
Ответ: Дак у Вас вообще ( а не в моём варианте) не будет рисования утки. Вы спросили как сделать вместе отрисовку - я дал идею. А то, что у Вас изначально неверно всё сделано - в том нет моей вины.
По идее верно будет так: делается таймер, в нём(событии тика таймера) производится перерасчёт всех необходимых данных, и потом вызывается функция отрисовки всего в нужном порядке (например, утка сперва , а прицел после, т.к. иначе утка будет затирать часть прицела), отрисовку более нигде производить не надо. В событии мыши менять только координаты объекта курсора, чтобы он при отрисовке рисовался по этим координатам.
Вопрос: Отрисовка в сцене

В сцене происходит отрисовка квадратов с помощью addItem
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Game : public QGraphicsView
{
    Q_OBJECT
// ...
public slots:
    void Update();
};
 
Game::Game(int win_width, int win_height, QWidget *parent)
    : winH(win_height), winW(win_width)
{
    // ...
    bkgField = new QGraphicsRectItem(0, 0, 280, 540);
    bkgField->setBrush(QBrush(QImage(":/images/bkg_gameField.png")));
    bkgField->setPos(10, 10);
 
 
    QTimer *timer = new QTimer();
    connect(timer, SIGNAL(timeout()),this,SLOT(Update()));
 
    timer->start(50);    
 
    show();
}
 
void Game::Update()
{
    mainScene->clear();
    
    mainScene->addItem(bkgField);
 
    for(int i = 0; i < field->height; i++)
        for(int j = 0; j < field->width; j++)
            if(field->gameFieldArray[i][j])
                    mainScene->addRect(j * 26 + 15, i * 26 + 15, 26, 26,
                                       QPen(QBrush(QColor::fromRgb(0,0,0)),2,Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin),
                                       QBrush(QColor::fromRgb(255,0,0)));
}
Отрисовка происходит в соответствии с массивом. Если ли альтернатива? Можно ли создать один объект а нарисовать его несколько раз там где надо?
Еще проблема в том что с появлением фона - bkgField, программа вылетает сразу после первой отрисовки
Ответ:
Сообщение от valeriy007
происходит отрисовка квадратов с помощью addItem
Это как?
addItem добавляет итем и все, отрисовка выполняется отдельно.

Вы неверно используете сцену. Вам нужно один раз все на нее добавить, а потом разве что двигать итемы.

Зачем вообще обновлять ее каждые 50мс если ничего не меняется?

Сообщение от valeriy007
Еще проблема в том что с появлением фона - bkgField, программа вылетает сразу после первой отрисовки
Не вижу что бы вы инициализировали mainScene.
Вопрос: Неправильная отрисовка линии

Проблема с отрисовкой нулевой линии при чтении линии графика из массива. Нулевая линия рисуется тем же карандашом, что и сам график. Если же график выводить не из массива, а по алгоритму, то нулевая линия отрисовывается правильным карандашом.
Отрисовка происходит в функции void GRAPH:rawLine(void)в файле trend.cpp. Складывается впечатление, что сначала отрисовывается график по нулевой линии, эта картинка сохраняется как изображение нулевой линии, но при перетаскивании графика по Y перетаскивается и неправильная
нулевая линия, не перерисовываясь нужным карандашом.
Ответ: Получается в самом конце цикла LineTo к стартовой позиции графика. Усечение цикла с обоих концов результата не дал. Как можно отладить отрисовку?

Добавлено через 10 часов 45 минут
Как ни странно проблема заключалась в самом цикле отрисовки графика. Стоило заменить for(int i=LineLen; i>0; i--) на for(int i=0; i<LineLen; i++) и проблема ушла, хотя должен был отзеркалиться вывод графика.
Вопрос: в Windows 7 изменилась стратегия отрисовки окон

это можно назвать вертикальной синхронизацией... но пока даже не понятно где инфу нарыть...
на ixbt в одной теме обмолвились, что это такая особенная технология у майкрософтов теперь - общий видео буфер для десктопа, который формируется по особенной стратегии.
для аэро это да, это понятно, но почему-то и классический интерфейс стал гораздо менее ровным для отрисовки с заданой частотой. терпимо, но тож не приятно, оно ж было в порядке...

проблема возникает с контролем fps, с плавностью отрисовки. при использовании обычного bitblit - инга.
он теперь происходит неровно, начиная примерно с 30-ти кадров в секунду. 
это конечно затрагивает только софтварные рендеры и т.п. 

OpenGL и DirectX - там все нормально. это естественно.

вот тест: 
на XP идет сверх плавно, внутри программы никаких неучтенных потерей времени нет. слева отрисовывается время расчетов, справа время простоя. ну это не важно... главное: что-то испортилось с новой версией винды и пока не понятно, что с этим делать?

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

какие у кого есть соображения, может кто-то знает где об это почитать?.  фактически изменились достаточно ключевые спецификации и только распространненость опенжл и деректикса маскируют пока какой-то толи ляп майкрософта толи интересную фичу... но пока больше на ляп похоже...
Ответ:
ага, это называется поправили)))...

в случае с XP никаких противоречий и сложностей нет...
и в 7-ке классический интерфейс (аля XP) работает достаточно хорошо, хоть и заметно дерганней, но не настолько, чтоб переживать... и с прозрачностью и без нее, там все понятно и визуально работает так же как представляется в логике. и вроде хорошо продумано с самого начала виндов и не создает препятствий к отрисовки содержимого окна в достаточно точные моменты времени.

с аэро, с ее фитчами, все запутанней. вроде там и не должно быть частоты обновления десктопа какой-то фиксированной, а вроде и должна быть иногда. т.е. там определенно есть хитрая стратегия. может пока просто не описаны некие новые элементы win-api, которые надо использовать.

Может дело и не в аэро, а некой промежуточной надстройке над классическим режимом. нифига инфы пока не нашлось...  

Это сообщение отредактировал(а) igoootm - 1.11.2013, 19:05
Вопрос: Как ускорить отрисовку изображения на PictureBox

Может кто знает как можно ускорить отрисовку загруженного изображения в PictureBox, (изображение довольно таки большое 1500х1500 и выше) когда перемещаешь сверху по рисунку какую либо форму отстается такой неприятный тормоз со шлейфом формы.
Включение всякой двойной буферезации не дает никакого эффекта, т.е. она только улушает отрисовку изображения картинки но сам шлейф(хвост) от формы так и остается.
Или может есть какой то сторонний полный аналог picturebox более производительный в этом плане?.
Ответ: Я незнаю что такое WPF, и как его правильно готовить.

В общем я решил пикчербокс сделать ограниченного размера по форме, и выводить в него часть изображения, при таком способе вроде как не томозит отрисовка, но тут главное чтобы скролинг изображения не стал тормозом