программа просмотра векторной карты

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

программа просмотра векторной карты

Сообщение Cyr » 10.02.2013 (Вс) 13:51

Пишу программу для просмотра векторной карты.
С графикой до этого никогда не работал. Попробовал сделать используя в качестве объектов карты контролы label, но отрисовка
1300 объектов очень долгая.
Может у кого есть готовый пример. Сложность у меня вызвали масштабирование и скролинг.
И ещё надо, чтобы можно было вывести информацию по объекте при щелчке по нему.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: программа просмотра векторной карты

Сообщение FireFenix » 10.02.2013 (Вс) 17:01

Простой вариант - использовать WPF
Хардкор, бдсм и расово верный вариант - использовать DirectX, OpenGL

Сложность у меня вызвали масштабирование и скролинг

Масштабировние - умножение координат всех точек на некоторое число
Скролинг - сдвиг координат всех точек на некоторое число

Cyr писал(а):И ещё надо, чтобы можно было вывести информацию по объекте при щелчке по нему.

Текущая позиция мышки + проверка координат видимых объектов на предмет пересечения с координатами мышки
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 10.02.2013 (Вс) 18:27

У меня постоянно подмигивает рисунок. Потому что на форме есть кнопки управления.
Код: Выделить всё
Dim Масштаб

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Масштаб = 1
        PictureBox1.Refresh()
    End Sub

    Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim blackPen As New Pen(Color.FromArgb(255, 0, 0, 0), 5)
        Dim x, y, номер, i As UShort
        Dim размер As Byte
        'Готовим переменную GraphicsFun для графических вызовов
        Dim GraphicsFun As System.Drawing.Graphics
        GraphicsFun = Me.PictureBox1.CreateGraphics
        Dim ЦветРамки As New Pen(Color.Black)
        'Для создания заполненного прямоугольника используем кисть цвета
        Dim ЦветФона As New SolidBrush(Color.CornflowerBlue)
        Dim ЦветШрифта As New SolidBrush(Color.Black)
        Dim drawFont As New Font("Microsoft Sans Serif", 8)
        GraphicsFun.Clear(Color.White)
        'Массштабирование
        GraphicsFun.ScaleTransform(Масштаб, Масштаб)
        размер = 25
        For ряд = 0 To 6
            For i = 0 To 89
                x = i * размер
                If x < 800 Then ' меньше размера окна
                    y = ряд * 3 * размер
                    номер = ряд * 90 * 2 + i
                    GraphicsFun.DrawRectangle(ЦветРамки, x, y, размер, размер)
                    GraphicsFun.FillRectangle(ЦветФона, x + 1, y + 1, размер - 1, размер - 1)
                    GraphicsFun.DrawString(номер, drawFont, ЦветШрифта, x, y)
                    GraphicsFun.DrawRectangle(ЦветРамки, x, y + размер, размер, размер)
                    GraphicsFun.FillRectangle(ЦветФона, x + 1, y + размер + 1, размер - 1, размер - 1)
                End If
            Next
        Next

    End Sub

    Private Sub Больше_Click(sender As System.Object, e As System.EventArgs) Handles Больше.Click
        If Масштаб < 2 Then
            Масштаб = Масштаб * 2

        End If
    End Sub

    Private Sub Меньше_Click(sender As System.Object, e As System.EventArgs) Handles Меньше.Click
        If Масштаб > 0.5 Then
            Масштаб = Масштаб / 2

        End If
    End Sub

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 10.02.2013 (Вс) 18:29

Как избавится от мигания?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.02.2013 (Вс) 21:15

Cyr писал(а):Как избавится от мигания?

Во-первых, делать так в хендлере paint неправильно и плохо:
Cyr писал(а):  GraphicsFun = Me.PictureBox1.CreateGraphics

Во-вторых, мигание вполне естественно при
Cyr писал(а):        GraphicsFun.Clear(Color.White)

В третьих, объекты вроде кистей, цветов и всего такого надо либо оборачивать в using, либо создать один раз и не трогать, что пожалуй лучше. Но это на мигание не должно влиять.
В четвёртых, не надо объявлять переменные без указания типа, особенно, если при этом получается Object, который там не нужен.

Ну и напоследок - почитай про мигание и про карту.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 10.02.2013 (Вс) 21:46

Во-первых, делать так в хендлере paint неправильно и плохо:Cyr писал(а):
GraphicsFun = Me.PictureBox1.CreateGraphics

А где это делать? в Form1_Load ? Но тогда изображение исчезает сразу после первой прорисовки.
Во-вторых, мигание вполне естественно приCyr писал(а):
GraphicsFun.Clear(Color.White)

А если не стирать старое изображение, то новое изображение накладывается поверх.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.02.2013 (Вс) 21:54

Cyr писал(а):А где это делать? в Form1_Load ? Но тогда изображение исчезает сразу после первой прорисовки.
А если не стирать старое изображение, то новое изображение накладывается поверх.

А по ссылкам почитать?

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 11.02.2013 (Пн) 8:16

А по ссылкам почитать?

Сложновато...
А можно ли как-нибудь быстро выводить и перерисовывать 1300 объектов label ?
вернее у меня сейчас вот так:
Код: Выделить всё
   Dim myLabel As Label

    Private Sub Forml_Load(ByVal sender As System.Object, ByVal e As  _
    System.EventArgs) Handles MyBase.Load
        Dim TextLine As String
        Dim x, y As UInteger
        FileOpen(1, "c:\палаткиVB.txt", OpenMode.Input, OpenAccess.Read, , )
        Do While Not EOF(1)
            ' Read line into variable.
            TextLine = LineInput(1)
            ' Display result in a message box.
            x = TextLine.Split(",").GetValue(0)
            y = TextLine.Split(",").GetValue(1)
            newlabel_create(x, y, "150", 0)
        Loop
        FileClose(1)
    End Sub
    Public Sub newlabel_create(x, y, Text, tip)
        Dim newlabel As New System.Windows.Forms.Label()
        ' Задать свойства newLabel
        With newlabel
            .Visible = True
            If tip = 0 Then
                .Size = New Size(25, 25)
                .BackColor = Color.CornflowerBlue
                .Font = New Font("Microsoft Sans Serif", 6.75)
            Else
                .Size = New Size(13, 13)
                .BackColor = Color.Peru
                .Font = New Font("Microsoft Sans Serif", 3.75)
            End If
            .BorderStyle = BorderStyle.FixedSingle
            .Name = Text
            .Text = Text
            .TextAlign = ContentAlignment.MiddleCenter
            .Location = New Size(x, y)
        End With
        Me.Controls.Add(newlabel)
        AddHandler newlabel.Click, AddressOf Me.newlabel_Click

    End Sub


Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.02.2013 (Пн) 8:33

Cyr писал(а):Сложновато...

:(

Cyr писал(а):А можно ли как-нибудь быстро выводить и перерисовывать 1300 объектов label ?

Маловероятно. В любом случае, так лучше не делать.

Cyr писал(а):вернее у меня сейчас вот так:

Ты на VB.NET пишешь, а не на VB6. Работай с файлами по-человечески.
И со строками. Зачем выполнять одни и те же операции несколько раз?
И Location - это Point, а не Size, если не ошибаюсь...

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 11.02.2013 (Пн) 8:59

Ты на VB.NET пишешь, а не на VB6. Работай с файлами по-человечески.

Я делаю как проще (как умею).
И со строками. Зачем выполнять одни и те же операции несколько раз?

А как же иначе прочитать координаты из файла и нарисовать label?
Может можно как-то отключить перерисовку окна при выводе каждого label
а в конце включить отображение "одним махом"?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.02.2013 (Пн) 9:05

Cyr писал(а):Я делаю как проще (как умею).

File.ReadAllLines - куда уж проще-то?
А захардкоженные константы для номеров файлов - даже для VB6 плохой стиль.

Cyr писал(а):А как же иначе прочитать координаты из файла и нарисовать label?

Сохранять массив строк, а не выполнять Split 2 раза.

Cyr писал(а):Может можно как-то отключить перерисовку окна при выводе каждого label а в конце включить отображение "одним махом"?

Конечно можно. Поместить их на панель и скрывать её. Это значительно ускорит отрисовку, хотя, в твоём случае это вряд ли поможет.
Не надо плодить label'ы в таких количествах!

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: программа просмотра векторной карты

Сообщение Shurrik » 12.02.2013 (Вт) 7:29

В моей настольной книге "Visual Basic .NETразработка приложений" в главе "Двойная буферизация" стр. 545 читаю:
Для предотвращения мерцания при перерисовке изображения используют двойную буферизацию.
И ниже код, который надо поместить в FormLoad.
Код: Выделить всё
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.DoubleBuffer, True)

В твоем случае, если карта не изменяется, можно все построить в памяти один раз, а выводить только часть рисунка.
Колесо: Хочешь жить? Умей вертеться.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 8:40

Shurrik писал(а):В твоем случае, если карта не изменяется, можно все построить в памяти один раз, а выводить только часть рисунка.

А в каком виде хранить это в памяти (исходя из условия быстроты вывода)?

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 8:48

И ещё такая проблемка, надо как-то отделить кнопки управления от остального экрана. Когда водишь курсором над кнопками, происходит перерисовка всей формы. А т.к. объектов много, картинка тухнет и перерисовывается несколько раз медленно.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 8:49

И вообще, почему каждый раз надо изобретать велосипед заново? :(. Это типовая задача, неужели нет готового работающего и отлаженного со всех сторон примера, учитывающего все тонкости творения Microsoft?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.02.2013 (Вт) 9:16

Shurrik писал(а):Для предотвращения мерцания при перерисовке изображения используют двойную буферизацию.

Не поможет.

Cyr писал(а):И ещё такая проблемка, надо как-то отделить кнопки управления от остального экрана. Когда водишь курсором над кнопками, происходит перерисовка всей формы. А т.к. объектов много, картинка тухнет и перерисовывается несколько раз медленно.

Ничего непонятно. Нафига вообще перерисовывать карту на MouseMove?

Cyr писал(а):Это типовая задача, неужели нет готового работающего и отлаженного со всех сторон примера, учитывающего все тонкости творения Microsoft?

Чем не устраивает мой пример с движущимися кругами?
И не типовая она. Как уже писали, для графических задач существует DirectX. Если хочется сделать не используя его, то придётся выкручиваться самому.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 9:59

Qwertiy писал(а):Ничего непонятно. Нафига вообще перерисовывать карту на MouseMove?

В том то и дело, что такой процедуры в программе нет. Карта перерисовывается через paint, который вызывается самой Windows автоматически для обновления формы. При движении курсора мы ведь им заслоняем кнопки.

Qwertiy писал(а):И не типовая она. Как уже писали, для графических задач существует DirectX.

Как это не типовая? Во всех учебниках есть примеры использования класса Graphics, и везде пишут, что его методы (команды) надо вставлять в paint. Почему же MS не позаботилась о нормальной отрисовке?
Программа будет выполняется на терминальном сервере и отображаться на тонком клиенте через RDP. Поэтому DirectX неприменим.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 10:02

Qwertiy писал(а):Чем не устраивает мой пример с движущимися кругами?

попробуйте его сделать для вывода 1300 квадратиков с текстом и фоном.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.02.2013 (Вт) 10:24

Cyr писал(а):В том то и дело, что такой процедуры в программе нет. Карта перерисовывается через paint, который вызывается самой Windows автоматически для обновления формы. При движении курсора мы ведь им заслоняем кнопки.

Подозрительно. Не помню такого. Не должно так быть...

Cyr писал(а):Как это не типовая? Во всех учебниках есть примеры использования класса Graphics, и везде пишут, что его методы (команды) надо вставлять в paint.

Эм.. А в чём собственно противоречие? Да, рисование на форме надо делать в обработчика Paint. Это же очевидно.
А.. Тебя та моя фраза сбила что ли? Я только сказал, что не надо вызывать CreateGraphics в Paint. Надо использовать e.Graphics вместо этого.

Cyr писал(а):попробуйте его сделать для вывода 1300 квадратиков с текстом и фоном.

Да квадраты рисовать вообще замечательно, не то что круги.
Если их много, то можно обновлять всю картинку, а не изменившиеся куски. Но тогда мерцание всё равно имеется. Как вариант - разбить на меньшие прямоугольники область.

Cyr писал(а):Почему же MS не позаботилась о нормальной отрисовке?

Своими руками вызываешь Clear и ещё спрашиваешь...

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 11:28

Я тут подумал попробовать сделать так:
Код: Выделить всё
    Dim rects As Rectangle() 'массив квадратов

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim path As String = "c:\палаткиVB.txt"
        'файл из строк вида: x,y,номер
        Dim readText() As String = IO.File.ReadAllLines(path)
        Dim s As String
        For Each s In readText
           
            'заполнить массив квадратов
            'заполнить массив номеров
        Next
    End Sub

    Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim blackPen As New Pen(Color.Black)
        'вывести массив квадратов
        e.Graphics.DrawRectangles(blackPen, rects)
        Dim Фон As New SolidBrush(Color.Blue)
        'вывести массив заштрихованных квадратов
        e.Graphics.FillRectangles(Фон, rects)
        Dim Текст As New Pen(Color.Black)
        'вывести надписи номеров
        e.Graphics.DrawString()
    End Sub

Как заполнить массив квадратов и номеров?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.02.2013 (Вт) 14:57

Cyr писал(а):Как заполнить массив квадратов и номеров?

Зачем тебе это в таком виде хранить?
И переменную можно объявлять прямо в For Each.

Писал тут, так что правильность не гарантирую.
Код: Выделить всё
Class MapItem
  Public X As Integer, Y As Integer
  Public Text As String

  Public Sub New()
  End Sub

  Public Sub New(ByVal X As Integer, ByVal Y As Integer)
    With Me
      .X = X
      .Y = Y
      .Text = Text
    End With
  End Sub
End Class

Private Marks As New List(Of MapItem)

For Each Line As String In File.ReadAllLines(Path)
  Dim Temp As String = Line.Split(","c)
  Marks.Add(New MapItem(Integer.Parse(Temp(0)), Integer.Parse(Temp(1)), Temp(2)))
Next Line

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 16:11

Qwertiy, спасибо. Такой подход быстро работает. Надо было стразу сказать,
что не надо вызывать CreateGraphics в Paint. Надо использовать e.Graphics вместо этого.
И что рисовать надо было сразу в paint от начала и до конца, а не как я - по одному.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: программа просмотра векторной карты

Сообщение FireFenix » 12.02.2013 (Вт) 16:42

Qwertiy писал(а):Да квадраты рисовать вообще замечательно, не то что круги.

Зато по таймеру анимировать это Hi-Tech Изображение
И как ни странно, круги, которые мерцают и немного плющит :D

Мой вариант на WPF, впрочем как почти и должно быть...
Mouse Click (не на синих квадратах) + Move -> перемещение всех квадратов
Mouse Click (на квадрате) -> MsgBox с именем квадрата
Mouse Scroll -> масштаб

Кому лень компилить, то запускать WPFGraphics\WPFGraphics\bin\Debug\WPFGraphics.exe
Вложения
WPFGraphics.rar
(60 Кб) Скачиваний: 192
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.02.2013 (Вт) 16:56

Cyr писал(а):Надо было стразу сказать,

Ну а я как говорил? К тому же, в примере это ведь было :)

FireFenix писал(а):И как ни странно, круги, которые мерцают и немного плющит :D

Я как раз поэтому и сказал, не то что круги. Если увеличивать bounding box не на пару пикселей, как в моём коде, а на пару десятков, то шевеление границ круга пропадает. Видимо, там баг имеется где-то...
Ты оригинальный пример компилировал? Там вообще ужас!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: программа просмотра векторной карты

Сообщение FireFenix » 12.02.2013 (Вт) 17:14

Qwertiy писал(а):Я как раз поэтому и сказал, не то что круги. Если увеличивать bounding box не на пару пикселей, как в моём коде, а на пару десятков, то шевеление границ круга пропадает.

Вот именно, делать всё это программно, очищать части BB каждого и рисовать с заливкой - это медленно и уже прошлый век.

Вот моя интерпретация задачи выше, только с кружками. и работает нормально хиттест для кружков и ничего не мелькает, хоть как насилуй мышку перемещением объектов (по крайне мерее у меня) :D
Вложения
WPFGraphicsCircles.rar
(57.22 Кб) Скачиваний: 171
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 12.02.2013 (Вт) 18:11

FireFenix писал(а):Мой вариант на WPF, впрочем как почти и должно быть...
Mouse Click (не на синих квадратах) + Move -> перемещение всех квадратов
Mouse Click (на квадрате) -> MsgBox с именем квадрата
Mouse Scroll -> масштаб

Вот спасибо :D Посмотрю.

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 13.02.2013 (Ср) 8:33

FireFenix, посмотрел. Реализация классная. Но единственно, что мне не понравилось - это то, что толщина границ объектов при изменении масштаба тоже изменяется. И большинство линий получаются размытыми почти при любом масштабе, кроме крупных. Как будто схема один раз рисуется на канве, а потом масштабируется уже не как векторный рисунок, а как растровая картинка.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: программа просмотра векторной карты

Сообщение FireFenix » 13.02.2013 (Ср) 17:03

Cyr писал(а):FireFenix, посмотрел. Реализация классная. Но единственно, что мне не понравилось - это то, что толщина границ объектов при изменении масштаба тоже изменяется. И большинство линий получаются размытыми почти при любом масштабе, кроме крупных. Как будто схема один раз рисуется на канве, а потом масштабируется уже не как векторный рисунок, а как растровая картинка.

Ну дык, возьми убери масштабирование границ и переделай как хочешь/нужно, исходники же там...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Cyr
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.02.2013 (Вс) 13:40
Откуда: Пенза

Re: программа просмотра векторной карты

Сообщение Cyr » 13.02.2013 (Ср) 20:00

FireFenix писал(а):возьми убери масштабирование границ

Как это сделать? пробовал убирать толщину, не помогло :(

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: программа просмотра векторной карты

Сообщение FireFenix » 14.02.2013 (Чт) 0:55

Cyr писал(а):И большинство линий получаются размытыми почти при любом масштабе, кроме крупных.

Ну понятное дело, стоит толщина контура в 1 пиксель, а при уменьшении происходит умножение на дробное число и как по твоему компьютер должен отобразить линию в 0,78 пикселя толщиной?

Cyr писал(а): потом масштабируется уже не как векторный рисунок, а как растровая картинка.

Как по вашему масштабируется векторный рисунок? каждый объект представлен некоторым замкнутым контуром контуром по определённым точкам. Контур, внутрненняя область заливки, внешняя область заливки. При масштабировании изменяются эти точки и получаем то что видим.

Cyr писал(а):пробовал убирать толщину, не помогло

А чё оно должно было помочь, если Убираешь, а не изменяешь.

Cyr писал(а):Как это сделать?

С учётом телепатии, то по хорошему нужно написать пиксельный шейдер, который делает обводку для нужных элементов в 1 пиксель

Hardcore, bsdm и медленное - рисовать границы таблицы отдельными объектами и по некоторым законам масштабировать
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList