Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:23

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 22, 2007 18:45 
chess писал(а):
Вопрос не понял. У тебя же точки тоже имеют только положительные координаты.
Все точки в квадрате с размером gbr(максимум gbr*gbr точек). Любое множество точек может быть в нем размещено.
Если надо чтобы были и отрицательные координаты - на входе задать соответствующие смещения, на выходе эти смещения убрать. Вообщем непонятно что непонятно - запусти программу. (Ухожу из Ineta - до завтра.)


"100 CHOOSE 50 - ->s 100 CHOOSE 50 - ->s 2 list". Мысль ясна?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 22, 2007 19:00 
2chess: Чтобы избежать в дальнейшем реплик вида "непонятно - запусти программу", предлагаю простой тест на работоспособность:
( (1000000 1000000) (0 0) (1000000 -1000000) )


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 24, 2007 17:15 
В приведеных ранее решениях тоже без тригонометрии. Для сравнения углов радиус-вектора необязательно сами углы вычислять-то.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 08, 2007 12:34 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Использовал итеративный алгоритм. на каждом шаге при добавлении новой точки (слово feed) пробегаются точки оболочки (по часовой стрелке) и находятся все стороны для которых новая точка лежит строго слева (слово side-left?). Если таковых нет - точка внутри многоугольника, иначе найденные стороны удаляются, а новая точка добавляется на их место. Использовал 5 глобальных переменных, хотя на самом деле нужна только одна, остальные используются только внутри feed в LAMBDA{ } в основном, а так как клозуров у нас нет (пока-что :) ), то пришлось сделать их глобальным, иначе код был бы гораздо запутаннее.
<pre>
S" ~ygrek/~day/lib/memreport.f" INCLUDED

REQUIRE { lib/ext/locals.f
REQUIRE NOT ~profit/lib/logic.f
REQUIRE write-list ~ygrek/lib/list/all.f
REQUIRE zipcar ~ygrek/lib/list/more.f
REQUIRE /TEST ~profit/lib/testing.f
REQUIRE [IF] lib/include/tools.f

HERE

100 VALUE DIMENSION
100 VALUE TOTAL-POINTS

\ -------------------------------------------------------

\ true if (x3,y3) is strictly to the left from (x1,y1)->(x2,y2)
: side-left? { x1 y1 x2 y2 x3 y3 -- ? }
x2 x1 - y3 y1 - *
x3 x1 - y2 y1 - *
- 0 > ;

\ -------------------------------------------------------

() VALUE mango \ оболочка-многоугольник
0 VALUE new
FALSE VALUE hole
() VALUE rem-list
0 VALUE last \ last from hole

: LIST> ( l -- i*x ) ['] NOOP SWAP mapcar ;

: remember rem-list vcons TO rem-list ;
: >xy ( x y -- l ) SWAP %[ % % ]% ;
: copy LIST> >xy ;
: pr mango write-list ;

: feed ( x y -- )
>xy TO new

mango length 2 < IF new vnode as-list mango cons TO mango EXIT THEN
mango length 2 = IF
new vnode as-list mango append TO mango
mango car LIST> mango cdar LIST> new LIST> side-left? IF mango reverse-list TO mango THEN
EXIT
THEN

LAMBDA{ >R LIST> R@ LIST> new LIST> side-left? IF R> ( DUP write-list) remember ELSE RDROP THEN }
DUP mango zipcar
mango end car mango car ROT EXECUTE

\ point already inside mango
rem-list empty? IF new FREE-LIST EXIT THEN

\ CR mango write-list

0 TO last
FALSE TO hole
%[
LAMBDA{
DUP rem-list member?
IF
TO last
new 0 = IF EXIT THEN \ already pasted new node
new %l
0 TO new
TRUE TO hole
ELSE
hole IF last copy %l FALSE TO hole THEN
copy %l
THEN
} mango mapcar
hole IF last copy %l FALSE TO hole THEN
]%
mango FREE-LIST
( l ) TO mango

rem-list FREE-LIST
() TO rem-list ;

HERE - ABS CR . .( bytes )

/TEST

\ -------------------------------------------------------

REQUIRE TESTCASES ~ygrek/lib/testcase.f

TESTCASES side-left?

(( 10 2 10 8 13 -1 side-left? -> FALSE ))
(( 10 2 10 8 11 100 side-left? -> FALSE ))
(( 10 2 10 8 1000 1 side-left? -> FALSE ))
(( 10 2 10 8 10 1 side-left? -> FALSE ))
(( 10 2 10 8 9 1 side-left? -> TRUE ))
(( 1 2 3 4 4 1 side-left? -> FALSE ))
(( 4 1 3 4 1 2 side-left? -> TRUE ))

END-TESTCASES

REQUIRE time-reset ~af/lib/elapse.f
\ REQUIRE SGENRAND ~ygrek/lib/neilbawd/mersenne.f
\ WINAPI: GetTickCount KERNEL32.DLL
\ GetTickCount SGENRAND
REQUIRE SEED lib/ext/rnd.f

1234 SEED
: GENRANDMAX CHOOSE ;

: random-point 2 0 DO DIMENSION GENRANDMAX ( DIMENSION 2 / -) LOOP ;
: test ( n -- ) 0 DO random-point 2DUP SWAP CR . . feed LOOP ;

(( countMem -> 0 0 ))
time-reset
TOTAL-POINTS test
CR .elapsed

CR mango write-list
mango FREE-LIST
(( countMem -> 0 0 ))
</pre>

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 08, 2007 12:40 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Бонус - визуализация оболочки :)
Точки тыкаются мышкой, скармливаются алгоритму и рисуются в GL окне. Так как алгоритм пошаговый то каждая новая точка добавляется к уже посчитанным. Для отрисовки использовал ~profit/misc/basicdraw.f. Не хватает возможности простого рисования отрезков, а портить код явными вызовами glBegin/glEnd не хотелось поэтому ограничился выделеним точек оболочки цветом и размером.

<pre>
REQUIRE START-DRAW ~profit/misc/basicdraw.f

S" mango.f" INCLUDED

600 TO DIMENSION

() VALUE all-points

:NONAME ( x y -- )
2DUP >xy all-points vcons TO all-points
feed
REFRESH ; TO click

: NPIXEL { x y n -- } y n + y DO x n + x DO I J PIXEL LOOP LOOP ;

\ Создание слова-отрисовщика
:NONAME
DIMENSION DIMENSION SET-SIZE \ установка размера экрана (одновременно с его очисткой)

200 200 200 SET-COLOR
LAMBDA{ LIST> 4 NPIXEL } all-points mapcar

0 200 0 SET-COLOR \ установка текущего цвета
LAMBDA{ LIST> 10 NPIXEL } mango mapcar

; START-DRAW
BYE
</pre>

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 08, 2007 13:08 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Сравнение реализаций решения этой задачки.

Для начала стресс-тест. 100 000 точек на поле 1000х1000. Реализацию by profit не пробовал потому что там неудобный способ задания данных для такого теста.
Все программы пришлось немного подкрутить :
qhull.f - (by true-grue) - se.f - область работы GC перенёс в хип
chess.f - (by chess) - память для поля тоже перенёс в хип
mango.f - это моё - убрать подключение memreport

Результаты :
Цитата:
qhull.f
Elapsed time: 00:00:37:671

chess.f
Elapsed time: 00:00:00:144

mango.f
Elapsed time: 00:00:01:254


По алгоритмам (N - кол-во точек, m - кол-во точек в оболочке,dim - размерность поля):
qhull.f похоже имеет временную сложность O(N*logN), сложность по памяти оценить сложно, может быть автор нам подскажет? ;)
до алгоритма в chess.f продраться не смог :(, потребление памяти - O(dim*dim) - хранится всё поле полностью.
profit использовал алгоритм Джарвиса, временная сложность O(N*m)
у моего алго тоже O(N*m), (для каждой новой точки - O(N) - пробегается вся оболочка 2 раза - O(m)), а по памяти - O(m) - хранится список точек оболочки.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 08, 2007 13:15 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Также в реализации by chess замечены следующие проблемы :
- вывод отличается от ввода зеркально относительно оси x
- точки вида (x, 0) превращаются в (x+1,dim)
- некоторые точки указываются в оболочке несколько раз подряд

После применения соответствующих изменений все три реализации дают одинаковый результат (насколько я проверил).

ЗЫ В тестах использовался одинаковый ГСЧ - lib/ext/rnd.f - и инициализировался одним и тем же значением.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 17, 2007 23:59 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
А задачка то до сих пор не решена!
...Surprise :)
Ни одна из реализаций не обрабатывает корректно граничный случай входных данных - все точки на одной прямой.

mango писал(а):
1 10 feed 2 10 feed 3 10 feed 4 10 feed 5 10 feed
Ok
mango write-list
( ( 2 10 ) ( 1 10 ) ( 3 10 ) ) Ok


qhull писал(а):
<?xml version='1.0'?><svg height='100' width='100'><g style='fill-opacity:1.0; stroke:black; stroke-width:1;'>
<circle cx=' 10 ' cy=' 48 ' r='2'/>
<circle cx=' 10 ' cy=' 12 ' r='2'/>
<circle cx=' 10 ' cy=' 77 ' r='2'/>
<circle cx=' 10 ' cy=' 1 ' r='2'/>
<circle cx=' 10 ' cy=' 53 ' r='2'/>
<circle cx=' 10 ' cy=' 49 ' r='2'/>
<circle cx=' 10 ' cy=' 90 ' r='2'/>
<circle cx=' 10 ' cy=' 52 ' r='2'/>
<circle cx=' 10 ' cy=' 30 ' r='2'/>
<circle cx=' 10 ' cy=' 27 ' r='2'/>
<circle cx=' 10 ' cy=' 68 ' r='2'/>
<circle cx=' 10 ' cy=' 60 ' r='2'/>
<circle cx=' 10 ' cy=' 57 ' r='2'/>
<circle cx=' 10 ' cy=' 13 ' r='2'/>
<circle cx=' 10 ' cy=' 98 ' r='2'/>
<polygon fill='none' points='10 , 48 10 , 48 '/></g></svg>


hull писал(а):
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
BYCZR..X.E..F..SID.KUTV.NO..WH.QGP.A.JML
[ ZXWQPML ]


В chess.f ошибки описаны выше.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 18, 2007 00:02 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Для тестирования (true-grue предложил потестировать на предмет различного распределения точек - не только случайного равномерного) было бы удобно задавать входные данные с помощью вектора ( -- x y ) чтобы потом его подменять.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 18, 2007 00:35 
ygrek писал(а):
Ни одна из реализаций не обрабатывает корректно граничный случай входных данных - все точки на одной прямой.


Очень интересно! Какой же вариант Вы посчитаете корректным?

1. Все точки отрезка входят в оболочку.
2. Крайние 2 точки отрезка.

И чем так плох вариант двумя одинаковыми точками? Не забывайте, речь ведется о вырожденном случае, который просто нужно как-то опознать. В моем варианте это можно сделать вполне очевидным образом.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 19, 2007 09:17 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
По определению выпуклой оболочки - сгодится любой вариант в котором будут присутствовать две крайние точки отрезка.
Про (не)включение точек лежащих на границе оболочки в условии ничего не сказано поэтому это не имеет значения.
Существующие ответы плохи тем что они неправильны :)

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 19, 2007 09:59 
ygrek писал(а):
По определению выпуклой оболочки - сгодится любой вариант в котором будут присутствовать две крайние точки отрезка.
Про (не)включение точек лежащих на границе оболочки в условии ничего не сказано поэтому это не имеет значения.
Существующие ответы плохи тем что они неправильны :)

Код:
   ...
   15 points
   s-dup draw-points
   s-dup length 3 < ABORT" bad hull!"
   quick-hull s-dup length 3 < ABORT" bad hull!"
   draw-hull
   ...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 24, 2007 18:44 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Входные и выходные данные отличались из-за попытки оси X и Y в Inscape поставить в стандартное положение(Замечание от ygrek'а)
Изменил программу для явного вывода всех точек оболочки, вместо полигона точки оболочки выводятся большим размером.
Применен похоже алгоритм Джарвиса(измененный). Для ускорения отказался от единой функции поиска, ввел 5 разных функций, используемых в зависимости от места точек в их множестве. Алгоритм реализован не самым быстрым образом. Можно ускорить как минимум в 8 раз. При увеличении числа функций поиска до 8-ми - алгоритм ускорится раза в два и при изменении порядка поиска в функциях поиска еще в 4 раза. На скорость поиска сильно влияет
организация хранения входных данных. В общем случае точка кодируется битом(реально 1-м байтом) - при явном кодировании координат точек 2-мя 32-разрядными числами на одну точку расходуется 64 бита. В общем (для скорости) должен быть набор реализаций алгоритмов, подключаемых по ситуации.

Код:
100 CONSTANT gbr                \ размер области поля 
100 CONSTANT N-points           \ количество точек
CREATE Abeg  gbr DUP * ALLOT

REQUIRE RANDOMIZE lib\ext\rnd.f

: gen-points  N-points RANDOMIZE 0 DO 1 Abeg gbr CHOOSE gbr * gbr CHOOSE + + C! LOOP ;

\ геом. характеристики множества точек
gbr VALUE X-  gbr VALUE Y-    0 VALUE X+    0 VALUE Y+
gbr VALUE X-- gbr VALUE Y--   0 VALUE Y+-   0 VALUE X+-
  0 VALUE X++   0 VALUE Y++ gbr VALUE Y-+ gbr VALUE X-+
\ параметры для функции поиска точек
0 VALUE XB      0 VALUE XE  0 VALUE YB   0 VALUE YE   0 VALUE AREA?
0 VALUE X       0 VALUE Y   0 VALUE dX   0 VALUE dY
0 VALUE XO      0 VALUE YO  0 VALUE dXO  0 VALUE dYO

: @A   gbr * + Abeg + C@ ;
: xy-bounds  \ выделение областей поиска
Abeg gbr DUP * + Abeg
DO I C@
   IF  I Abeg - gbr /MOD DUP X- MIN TO X- X+ MAX TO X+ DUP Y- MIN TO Y- Y+ MAX TO Y+ THEN
LOOP
X- TO X BEGIN Y- X  @A IF X TO X-- 1 ELSE X 1+ TO X 0 THEN UNTIL
X+ TO X BEGIN Y- X  @A IF X TO X+- 1 ELSE X 1- TO X 0 THEN UNTIL
X- TO X BEGIN Y+ X  @A IF X TO X-+ 1 ELSE X 1+ TO X 0 THEN UNTIL
X+ TO X BEGIN Y+ X  @A IF X TO X++ 1 ELSE X 1- TO X 0 THEN UNTIL
Y- TO Y BEGIN Y  X- @A IF Y TO Y-- 1 ELSE Y 1+ TO Y 0 THEN UNTIL
Y+ TO Y BEGIN Y  X- @A IF Y TO Y+- 1 ELSE Y 1- TO Y 0 THEN UNTIL
Y- TO Y BEGIN Y  X+ @A IF Y TO Y-+ 1 ELSE Y 1+ TO Y 0 THEN UNTIL
Y+ TO Y BEGIN Y  X+ @A IF Y TO Y++ 1 ELSE Y 1- TO Y 0 THEN UNTIL
;
0 VALUE FL 0 VALUE FS  0 VALUE XS 0 VALUE YS \ для подавления повторного вывода
: AREA XB XE > YE YB > AND XB XE < YB YE > AND OR IF 1 ELSE 0 THEN TO AREA? ;
: d+        < IF 1- ELSE 1+ THEN ;
: dX+       XE XB d+ ;     : dY+       YE YB d+ ;
: x++       X dX+ TO X ;   : y++       Y dY+ TO Y ;
: K1++      AREA? IF x++         ELSE y++         THEN ;
: K2++      AREA? IF y++         ELSE x++         THEN ;
: K1=E?     AREA? IF X XE =      ELSE Y YE =      THEN ;
: K2=E?     AREA? IF Y YE =      ELSE X XE =      THEN ;
: K1=B++    AREA? IF XB dX+ TO X ELSE YB dY+ TO Y THEN ;
: SET-dXYO  XE XB - ABS TO dXO YE YB - ABS TO dYO ;
: SET-dXY   X  XB - ABS TO dX  Y  YB - ABS TO dY  ;
: ANG<=     SET-dXY AREA? IF dY dXO * dYO dX * ELSE dX dYO * dXO dY * THEN
            2DUP < IF 0 TO FS 0 TO FL 1 ELSE 0 THEN -ROT =
            IF  FL IF 0 TO FL 1 ELSE 0 THEN ELSE 0 THEN OR ;
: ~dXYO     dY TO dYO  dX TO dXO X TO XO Y TO YO ;
: ~XYB      XO TO XB  YO TO YB ;
: POINT?    Abeg X gbr * Y + + C@ ;
: .end         ." ' r='0.4'/>" CR ;
: .end-contur  ." ' r='0.8'/>" CR ;
: point ." <circle cx=' " . ." ' cy=' " . ;
: point. point .end ;
: point-contur. 2DUP XS <> SWAP YS <> OR
  IF 2DUP point .end-contur TO XS TO YS ELSE 2DROP THEN ;
: points. Abeg gbr DUP * + Abeg  DO I C@ IF I Abeg - gbr /MOD  point. THEN LOOP ;

: area. TO YE TO YB TO XE TO XB 
FS N-points 3 - <> IF \ для подавления повторного вывода точек на единственном отрезке
AREA 1 TO FL YB XB point-contur.
BEGIN
  XE XB - ABS 1 > YE YB - ABS 1 > AND
  IF XB dX+ TO X  YB dY+ TO Y  SET-dXYO  SET-dXY  XB TO XO  YB TO YO
    BEGIN 
      POINT? IF ANG<= IF ~dXYO THEN THEN K1++
      K1=E?  IF K2++ K2=E? IF 1 ELSE K1=B++ 0 THEN ELSE 0 THEN
    UNTIL
    XO XB = YO YB = AND XB XE = OR
    IF  1 ELSE FS 1+ TO FS  1 TO FL ~XYB YB XB point-contur. 0 THEN
  ELSE 1 THEN
UNTIL  YE XE point-contur.
THEN
;
: line1. Y+- TO YE Y-- TO Y BEGIN Y 1+ TO Y Y X- @A IF Y X- point-contur. THEN Y YE = Y YE > OR UNTIL ;
: line2. X++ TO XE X-+ TO X BEGIN X 1+ TO X Y+ X @A IF Y+ X point-contur. THEN X XE = X XE > OR UNTIL ;
: line3. Y-+ TO YE Y++ TO Y BEGIN Y 1- TO Y Y X+ @A IF Y X+ point-contur. THEN Y YE = Y YE < OR UNTIL ;
: line4. X-- TO XE X+- TO X BEGIN X 1- TO X Y- X @A IF Y- X point-contur. THEN X XE = X XE < OR UNTIL ;

: contur.  \ по часовой стрелке
X-- X- Y- Y-- area. line1. X- X-+ Y+- Y+ area. line2.
X++ X+ Y+ Y++ area. line3. X+ X+- Y-+ Y- area. line4.
;
: SVG  gen-points  xy-bounds
  ." <?xml version='1.0'?>" CR
  ." <svg height=' " gbr . ." ' width=' " gbr . ." '>" CR
  ." <g style='fill-opacity:1.0; '>" CR
  points. contur.
  ." </g></svg>"
;
' SVG MAINX !  S" svg.exe" SAVE BYE

_________________
С уважением, chess


Последний раз редактировалось chess Ср окт 03, 2007 08:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 25, 2007 18:25 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
profiT писал(а):
В 65-ой строке нужно убрать отладочный вывод......

Установил Firefox, после указанных исправлений - посмотрел и в нем. Спасибо.
Кстати, Inkscape работает корректно и при наличии отладочной информации(удобно для отладки).

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 26, 2007 16:49 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
profiT писал(а):
Иначе получается невалидный XML и ни один их трёх SVG-совместимых браузеров (Opera, Firefox, Safari) его не читают.

Инсталировал Adobe SVG Viewer 3.02, теперь и в IE можно смотреть SVG-файлы, причем уровень сервиса под IE выше чем под Firefox(масштабирование, качество изображения).
Кроме того как и для Inkscape допускаются вольности с пробелами, и становится необязательным указание пространства имени для корня svg-документа.

_________________
С уважением, chess


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB