purebasic.info

PureBasic forum
Текущее время: Ср янв 24, 2018 12:22 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Ср авг 23, 2017 2:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Код:
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
Global StartWidth, StartHeight, ScaleX.d=1, ScaleY.d=1, Angle.d=0
 
Procedure Timer()
 
  If StartVectorDrawing(CanvasVectorOutput(0))
   
    ScaleCoordinates(ScaleX, ScaleY)
   
    VectorSourceColor(RGBA(255, 255, 255, 255))
    FillVectorOutput()
   
    VectorSourceColor(RGBA(0, 255, 0, 255))
    MovePathCursor(200, 10)
    AddPathCircle(200, 105, 98, 0, 360)
    StrokePath(1)
   
   
    RotateCoordinates(200, 105, Angle)
   
    MovePathCursor(200, 105)
    AddPathLine(290, 110)
    AddPathLine(290, 100)
    ClosePath()
   
    VectorSourceColor(RGBA(255, 0, 0, 255))
    FillPath()
   
    StopVectorDrawing()
  EndIf
 
  Angle+1
  If Angle>360
    Angle=0
  EndIf
 
EndProcedure
 
Procedure Resize()
 
  Width = WindowWidth(0)
  Height = WindowHeight(0)
 
  ScaleX = Width / StartWidth
  ScaleY = Height / StartHeight
 
  ResizeGadget(0, #PB_Ignore, #PB_Ignore, Width, Height)
 
EndProcedure
 
If OpenWindow(0, 0, 0, 400, 210, "VectorDrawing", #PB_Window_MinimizeGadget |
                                                  #PB_Window_MaximizeGadget |
                                                  #PB_Window_ScreenCentered |
                                                  #PB_Window_SizeGadget)
  CanvasGadget(0, 0, 0, 400, 210)
  AddWindowTimer(0, 123, 10)
 
  StartWidth = GadgetWidth(0)
  StartHeight = GadgetHeight(0)
 
  BindEvent(#PB_Event_Timer, @Timer(), 0, 123)
  BindEvent(#PB_Event_SizeWindow, @Resize(), 0)
 
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Ср авг 23, 2017 2:36 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Пётр, огромное спасибо. Это то, что надо!

Добавлено:
Пока просмотрел ту тему, тестировал на своём коде и печатал ответ, тут уже целый код появился. Ещё раз спасибо, Пётр. Просто замечательно работает!
Пока что больше вопросов нет. Нужно всё собрать воедино, причесать и т.д.
А пока что, кому интересно - небольшое demo


Вложения:
Demo_2.rar [156.77 KiB]
Скачиваний: 21
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Ср авг 23, 2017 6:17 pm 
Не в сети
студент

Зарегистрирован: Сб июл 05, 2014 4:14 am
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Что то подобное можно применить для отображения угла поворота антенны.....


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Чт авг 24, 2017 3:32 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
офтоп
Можно. Видел в реале подобное. Только мне не для РЛС (в поворотном механизме должны быть установлены датчики положения для формирования МАИ).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 4:05 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Всем, привет!
Теперь немного другая задача (простая): вписать текст в прямоугольник ровно по центру (подобие флага #PB_Text_Center для TextGadget). Делаю так:
Код:
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
If OpenWindow(0, 0, 0, 300, 150, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 300, 150)
 
  LoadFont(0, "Arial", 32, #PB_Font_Bold)
 
  If StartVectorDrawing(CanvasVectorOutput(0))
    AddPathBox(120, 40, 80, 40)
    VectorSourceColor(RGBA(255, 0, 0, 255))
    StrokePath(2)
   
    ; центр прямоугольника
    cx = 160
    cy = 60
   
    Text$ = "123"
   
    VectorFont(FontID(0), 32)
    MovePathCursor(cx - VectorTextWidth(Text$, #PB_VectorText_Visible)/2, cy - VectorTextHeight(Text$, #PB_VectorText_Visible)/2)
   
    VectorSourceColor(RGBA(0, 180, 0, 255))
    DrawVectorText(Text$)
   
    StopVectorDrawing()
  EndIf
     
 
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf


А текст всё-равно не по центру (по оси ординат). Почему?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 4:30 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Код:
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
If OpenWindow(0, 0, 0, 300, 150, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 300, 150)
 
  LoadFont(0, "Arial", 32, #PB_Font_Bold)
 
  If StartVectorDrawing(CanvasVectorOutput(0))
    AddPathBox(120, 40, 80, 40)
    VectorSourceColor(RGBA(255, 0, 0, 255))
    StrokePath(2)
       
    Text$ = "123"
   
    VectorFont(FontID(0), 32)
    VectorSourceColor(RGBA(0, 180, 0, 255))
    MovePathCursor(120, 40)
    DrawVectorParagraph(Text$, 80, 40, #PB_VectorParagraph_Center)
   
    StopVectorDrawing()
  EndIf
     
 
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 4:45 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Оригинально!
Спасибо, Пётр.

А если эти BOX'ы будут на подложке и их будет несколько (десятки), как тогда лучше поступить? Запомнить все их верхние левые углы (заранее выверенные) в массив и заполнять всегда в одном и том же порядке (сдвигая курсор по мере перебора массива)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 4:58 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Координаты в любом случае нужно знать. А хранить их можно как будет удобнее.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 5:02 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Понял. Ещё раз спасибо, Пётр.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Пт авг 25, 2017 6:31 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 390
Благодарил (а): 49 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
В итоге такая вот приборная панель вырисовывается. :D

Пётр, без твоей помощи пришлось бы очень тяжко, спасибо.


Вложения:
demo_3.rar [225.55 KiB]
Скачиваний: 26
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Сб авг 26, 2017 5:48 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
А мне понадобилось сделать квадратную картинку с прозрачным кругом в центре, чтобы при наложении просматривалась нижняя картинка, так и не понял как это сделать.
Напрямую 2D и vector ни чего не предлагают, наверно чего то не докопал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Сб авг 26, 2017 7:31 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6225
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
newJS писал(а):
А мне понадобилось сделать квадратную картинку с прозрачным кругом в центре

Рисуешь в любом редакторе, который поддерживает альфа канал картинку с прозрачным кругом посредине, сохраняешь в PNG. Потом выводишь эту картинку поверх изображения обычным способом в Пурике.
Ещё способ это спрайты. Рисуешь на любой картинке круг каким либо цветом, который не используется в самой картинке, сохраняешь как PNG, JPG, BMP без разницы. Грузишь в Пурик как спрайт с поддержкой альфа канала и назначаешь этому спрайту прозрачный цвет тот, что на круге.
Код:
1
2
LoadSprite(#Dirka,"dirka.png",#PB_Sprite_AlphaBlending)
TransparentSpriteColor(#Dirka, #White); если круг белый


Выводи теперь на экран как спрайт с прозрачностью - DisplayTransparentSprite

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Вс авг 27, 2017 7:19 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
Виталя спасибо, но это не то, размеры и цвет углов разные, да и внешняя картинка не очень хорошо.
Выкрутился черезжопным способом. В нужный момент известны размеры, а цвет у винды беру. Рисую квадрат, вписываю круг другим цветом, потом собираю в лист точки нужного цвета, а потом из листа кладу куда надо с коррекцией координат.
В моём случае такой фокус прокатил.
Я то думал может чего пропустил или недопонял в кривеньком переводе, вот и спросил.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Вс авг 27, 2017 11:19 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6225
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
newJS писал(а):
да и внешняя картинка не очень хорошо

Ну это я как сделать проще написал. А вообще прозрачное изображение можно и динамически нарисовать в самом Пурике при помощи RGBA.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: VectorDrawing
СообщениеДобавлено: Вс авг 27, 2017 12:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Пример из справки
Код:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
If OpenWindow(0, 0, 0, 800, 600, "Alphachannel demo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  LoadFont(0, "Impact", 30)
 
  ; Alphachannel output image
  ;
  If CreateImage(0, 800, 600, 32) And StartDrawing(ImageOutput(0))
 
    ; Make the whole image transparent
 
    ;
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 800, 600, $00000000)
   
    ; The classic Circle-thing :)
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle( 75,  75, 50, RGBA(255,   0,   0, 128))
    Circle(125,  75, 50, RGBA(  0, 255,   0, 128))
    Circle(100, 125, 50, RGBA(  0,   0, 255, 128))
 
    ; Some DrawText stuff
    ;
    DrawingFont(FontID(0))
    w = TextWidth("Alphachannel demo")
    h = TextHeight("Alphachannel demo")
   
    DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
   
    ; draw the text semi-transparent
    DrawText(25, 275, "Alphachannel demo", $40FF0000)
    DrawText(50, 300, "Alphachannel demo", $80FF0000)
    DrawText(75, 325, "Alphachannel demo", $A0FF0000)
           
   
    ; Show the difference between the drawing modes
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    y = 400
    For i = 0 To 255 Step 4
      Line(25, y, 500, 1, RGBA(0, 0, 255, 255-i))
      y + 1
    Next i
   
    DrawingFont(#PB_Default)
    DrawText( 50, 380, "Default",      $FF000000, $00000000)
    DrawText(150, 380, "AlphaBlend",   $FF000000, $00000000)
    DrawText(250, 380, "AlphaClip",    $FF000000, $00000000)
    DrawText(350, 380, "AlphaChannel", $FF000000, $00000000)
    DrawText(450, 380, "AllChannels",  $FF000000, $00000000)
   
   
    ; Now lets see the gradient drawing mode
    ; The gradient defined the color to draw, the color parameter of the commands is then ignored
    ;
    DrawingFont(FontID(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient)  
    LinearGradient(310, 10, 310+TextWidth("Alphachannel Gradient demo"), 10+TextHeight("Alphachannel Gradient demo"))
    GradientColor(0.0,  $80FF0000)
    GradientColor(0.25, $FF00FF00)
    GradientColor(0.50, $8000FFFF)
    GradientColor(0.75, $FF0000FF)
    GradientColor(1.0,  $80FF0000)
    DrawText(310, 10, "Alphachannel Gradient demo")
 
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
    Box(350, 75, 400, 150, $FF0000FF)  
    Circle(400, 125, 20,  $FF0000FF)
    Circle(600, 125, 20,  $FF0000FF)
    Circle(500, 175, 40,  $FF0000FF)
    Circle(700, 150, 40,  $FFFF0000)  
    Box(430, 80, 15, 140, $FF0000FF)
   
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
    ConicalGradient(550, 150, 0)
    ResetGradientColors()
    GradientColor(0.0,  $FF0000FF)
    GradientColor(0.25, $8000FF00)
    GradientColor(0.5,  $FFFF0000)
    GradientColor(0.75, $8000FFFF)
    GradientColor(1.0,  $FF0000FF)  
    FillArea(360, 80, -1)    
   
    StopDrawing()
  EndIf
 
  ; Solid image for display
  ;
  If CreateImage(1, 800, 600, 24) And StartDrawing(ImageOutput(1))
 
    ; create the background effect
    #box_size = 7
   
    Box(0, 0, 800, 600, $FFFFFF)
    For y = 0 To 600 Step #box_size*2
      For x = 0 To 800 Step #box_size*2
        Box(x, y, #box_size, #box_size, $C0C0C0)
        Box(x+#box_size, y+#box_size, #box_size, #box_size, $C0C0C0)
      Next x
    Next y  
 
    ; draw the alpha image
    DrawAlphaImage(ImageID(0), 0, 0)
 
 
    StopDrawing()
  EndIf
 
  ImageGadget(0, 0, 0, 0, 0, ImageID(1))
 
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB