purebasic.info

PureBasic forum
Текущее время: Пн июл 16, 2018 6:11 am

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




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: VectorDrawing
СообщениеДобавлено: Пн авг 21, 2017 1:06 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Всем, привет.
Помогите повернуть фигуру на определённый угол. Сначала хотел сделать всё вручную, но потом обнаружил RotateCoordinates(). Нужно повернуть прямоугольник вокруг его центра. Но начального прямоугольника рисовать не нужно. Допустим заранее известны: центр, и координаты всех вершин. Ниже то, что пытался сделать:
Код:
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
; B-------------C
; |             |
; A-------------D
 
OpenWindow(0, 500, 500, 500, 500, "Test")
CanvasGadget(0,0,0,500,500)
StartVectorDrawing(CanvasVectorOutput(0))
 
MovePathCursor(30, 180)
AddPathLine(350,0, #PB_Path_Relative)
AddPathLine(0, 80, #PB_Path_Relative)
AddPathLine(-350,0, #PB_Path_Relative)
ClosePath()
 
;Координаты вершин
 
Point_Ax = 30
Point_Ay = 260
 
Point_Bx = 30   ; Координаты левого верхнего угла
Point_By = 180  ; Координаты левого верхнего угла
 
Point_Cx = 380
Point_Cy = 180
 
Point_Dx = 380  ; Координаты правого нижнего угла
Point_Dy = 260  ; Координаты правого нижнего угла
 
;угол поворота вокруг центра прямоугольника (пересечение диагоналей)
;переводим в радианы
angle.f = Radian(30)
 
;Размеры прямоугольника
Width = Point_Cx - Point_Bx
Height = Point_Ay - Point_By
 
;Центр прямоугольника
cx = Point_Bx + ((Point_Dx - Point_Bx) / 2)
cy = Point_By + ((Point_Dy - Point_By) / 2)
 
 
;Расстояние из центра до любой из вершин - радиус
;Rad = cx - Point_Ax
 
;или так
d = Sqr(Pow(Width, 2) + Pow(Height, 2)) ; узнаём диаметер - т. Пифагора
r = d/2 ; радиус
f = ASin(Height/d)
 
Ax = Cos(#PI + f + angle)*r
Ay = Sin(#PI + f + angle)*r
 
Bx = Cos(-f + angle)*r
By = Cos(-f + angle)*r
 
Cx = Cos(f + angle)*r
Cy = Sin(f + angle)*r
 
Dx = Cos(#PI - f + angle)*r
Dy = Sin(#PI - f + angle)*r
 
 
MovePathCursor(cx, cy)
RotateCoordinates(cx, cy, 30)
 
;вероятно здесь нужно установить курсор на повёрнутую вершину B
;как её узнать?
AddPathLine(350,0, #PB_Path_Relative)
AddPathLine(0, 80, #PB_Path_Relative)
AddPathLine(-350,0, #PB_Path_Relative)
ClosePath()
 
 
 
VectorSourceColor(RGBA(255, 0, 0, 255))
StrokePath(1)
StopVectorDrawing()
 
 
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow



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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
knower писал(а):
Нужно повернуть прямоугольник вокруг его центра.
Код:
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
If OpenWindow(0, 0, 0, 400, 210, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 210)
  AddWindowTimer(0, 123, 10)
 
  Angle.d=0
 
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Timer And EventTimer() = 123
      If StartVectorDrawing(CanvasVectorOutput(0))
       
        VectorSourceColor(RGBA(255, 255, 255, 255))
        FillVectorOutput()
       
        RotateCoordinates(200, 105, Angle)
       
        AddPathBox(100, 80, 200, 50)
        VectorSourceColor(RGBA(255, 0, 0, 255))
        StrokePath(1)
       
        StopVectorDrawing()
      EndIf
     
      Angle+1
      If Angle>360
        Angle=0
      EndIf
    EndIf
   
  Until Event = #PB_Event_CloseWindow
EndIf


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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Спасибо большое, Пётр.
А есть ли в этой векторной библиотеке нечно подобное LineXY? Известны координаты центра окружности(статичны) и азимут. То есть известны x1,y1,x2,y2. Нужно провести линию (радиус). И если возможно, то изобразить его в виде стрелы (вектора), направленной к центру окружности.
Вот пример с англ. форума:
Код:
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, 200, 200, "Trig", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
   
    #MiddleX = 100
    #MiddleY = 100
    #LineLen = 80
    Circle(#MiddleX,#MiddleY, #LineLen,$00A000)
 
    Degrees = 90
   
    Debug "Degrees = " + Str(Degrees)        
    CalcDegrees = 360 - Degrees + 180
    XX.f = Sin(CalcDegrees * (2 * #PI / 360))
    YY.f = Cos(CalcDegrees * (2 * #PI / 360))
    LineXY(#MiddleX, #MiddleY, #MiddleX + (XX * #LineLen),
           #MiddleY + (YY * #LineLen),           $FFFFFF)
   
    StopDrawing()
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
 
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf



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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Код:
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
If OpenWindow(0, 0, 0, 400, 210, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 210)
  AddWindowTimer(0, 123, 10)
 
  Angle.d=0
 
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Timer And EventTimer() = 123
      If StartVectorDrawing(CanvasVectorOutput(0))
       
        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, 105)
        VectorSourceColor(RGBA(255, 0, 0, 255))
        StrokePath(1)
       
        StopVectorDrawing()
      EndIf
     
      Angle+1
      If Angle>360
        Angle=0
      EndIf
    EndIf
   
  Until Event = #PB_Event_CloseWindow
EndIf


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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
И снова спасибо, Пётр.
Только хотел типа закрашенного треугольника сделать.
Код:
1
2
3
4
5
6
7
8
9
10
11
...
RotateCoordinates(200, 105, Angle - 3)
       
MovePathCursor(200, 105)
AddPathLine(290, 105)
       
RotateCoordinates(200, 105, Angle + 3)
       
MovePathCursor(200, 105)
AddPathLine(290, 105)
...


почему одна из линий постоянно "убегает" ?


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Код:
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
If OpenWindow(0, 0, 0, 400, 210, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 210)
  AddWindowTimer(0, 123, 10)
 
  Angle.d=0
 
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Timer And EventTimer() = 123
      If StartVectorDrawing(CanvasVectorOutput(0))
       
        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
    EndIf
   
  Until Event = #PB_Event_CloseWindow
EndIf


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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Пётр, спасибо.
Попытался объединить всё о чём мы здесь сегодня говорили и получается не то, что должно быть.
Код:
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
If OpenWindow(0, 0, 0, 400, 210, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 210)
  AddWindowTimer(0, 123, 10)
 
  W_Angle.d = 0
  RW_Angle.d = 55
  VarA.d = 0
  VarB.d = 45
 
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Timer And EventTimer() = 123
      If StartVectorDrawing(CanvasVectorOutput(0))
        RemoveWindowTimer(0,123)
       
        VectorSourceColor(RGBA(255, 255, 255, 255))
        FillVectorOutput()
       
        VectorSourceColor(RGBA(0, 255, 0, 255))
        MovePathCursor(200, 10)
        AddPathCircle(200, 105, 98, 0, 360)
        StrokePath(1)
       
        AddPathCircle(200, 105, 95, VarA-90, VarB-90)
        StrokePath(7)
       
       
        RotateCoordinates(200, 105, RW_Angle-90)
       
        AddPathBox(120, 85, 160, 40)
        VectorSourceColor(RGBA(255, 0, 0, 255))
        StrokePath(1)
       
       
        RotateCoordinates(200, 105, W_Angle-90)
       
        MovePathCursor(200, 105)
        AddPathLine(290, 110)
        AddPathLine(290, 100)
        ClosePath()
       
        VectorSourceColor(RGBA(255, 0, 0, 255))
        FillPath()
       
       
        AddPathLine(310, 105)
       
       
        StopVectorDrawing()
      EndIf
     
      Angle+1
      If Angle>360
        Angle=0
      EndIf
    EndIf
   
  Until Event = #PB_Event_CloseWindow
EndIf


Прямоугольник вносит искажения в отображение вектора. Если его закомментировать, то показывает то, что надо, то есть 0/360 градусов. А вместе с ним вектор направлен совсем не из угла W_Angle.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
В 35 строку нужно добавить функцию ResetCoordinates().

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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
ОГРОМНОЕ спасибо, Пётр.
Градацию сделать проблематично, поэтому буду выводить не на канвас сразу, а в ImageVectorOutput() для дальнейшего совмещения этого рисунка с основным изображением. Благо, что метка севера будет всегда сверху.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Разве нельзя основное изображение сделать фоном?

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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Наверно можно. Спасибо.

Добавлено:
Работает. Нашёл в справке LoadImage() и DrawVectorImage(ImageID(1)), а также изменил VectorSourceColor(RGBA(255, 255, 255, 0)).


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
[удалено] как ошибочное сообщение, извините. Всё работает.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Картинку можно встроить в приложение https://www.purebasic.com/documentation ... image.html
Внизу страницы пример. Поддерживаются все форматы, т. е. BMP, JPG, PNG, GIF и т. д.

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


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

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Да, это понятно. Спасибо, Пётр. Но сейчас меня интересует немного другой вопрос. Допустим нарисовал на подложке что надо и получил единый Image. Так вот есть ли в PB такой гаджет (для работы с изображениями), который бы из коробки поддерживал Resize (масштабирование изображения при изменении размеров окна).


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Масштабирование поддерживает VectorDrawing, в которой для этого есть функция ScaleCoordinates.
Пример viewtopic.php?p=81557#p81557
Чтобы изменять масштаб нужно навести курсор на канвас и покрутить колесо мышки.

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


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

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


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

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


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

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