Рисование карт

  • Автор темы Автор темы dimohha
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Рисование карт

Овраг? Ну через Blend, например. Нарисовать первый штрих и последний, в нужных местах, потом Blend протащить. Потом назначить новый путь по нужной кривой и подрегулировать плотность и степень поворота штрихов.
А еще можно попробовать Sprayer соответствующего внешнего вида создать...
 
Ответ: Рисование карт

Cyrax сказал(а):
...как средствами Corel'а нарисовать овраг...
Рисуем линию и штрихи – комбинируем – создаём кисть – применяем к линиям оврага.
 

Вложения

  • OVRAG.jpg
    OVRAG.jpg
    33.5 КБ · Просм.: 1 050
Ответ: Рисование карт

1. Вариант с новой кистью хорош, только вот плотность расположения штрихов зависит от длины рисуемой линии. А это крайне нежелательно. Можно ли в этом случае сделать так, чтобы линии находились всегда на одном расстоянии ?
2. Вариант с расположением blend'а вдоль кривой тоже неплох. Но в этом случае плотность расположения штрихов также не задаётся в абсолютных единицах и зависит от длины линии-образца. Даже если линию-образец один раз откорректировать (плотность расположения штрихов), а потом просто копировать эти штрихи, то возникает неудобство, связанное с необходимостью рисования линий (оврагов) разной длины (образец-то одной длины).
 
Ответ: Рисование карт

И ещё одни серьёзный недостаток второго способа - штрихи не перпендикулярны кривой...
 
Ответ: Рисование карт

Вот вам для начала. Дальнейшую обвязку делать поленился.
Код:
Sub Ravine()
  Dim sp As SubPath, s As Shape
  Dim t As Double
  Dim out As New Outline
  Dim d As Double
  Dim x As Double, y As Double
  Dim dx As Double, dy As Double
  Dim a1 As Double, a2 As Double
  Dim sr As New ShapeRange
  
  If ActiveShape Is Nothing Then MsgBox "Выделите кривую": Exit Sub
  ActiveDocument.Unit = cdrMillimeter
  ActiveDocument.BeginCommandGroup ("Ravine")
  Set out = ActiveShape.Outline
  d = 2  'длина засечки
  For Each sp In ActiveShape.DisplayCurve.SubPaths
    For t = 0 To 0.99 Step 0.01
      'MarkPoint sp, t, out, d
      sp.GetPointPositionAt x, y, t, cdrRelativeSegmentOffset
      a = sp.GetPerpendicularAt(t, cdrRelativeSegmentOffset) * 3.1415926 / 180
      dx = 2 * Cos(a)
      dy = 2 * Sin(a)
      Set s = ActiveLayer.CreateLineSegment(x, y, x + dx, y + dy)
      s.Outline.CopyAssign out
      sr.Add s
    Next t
  Next sp
  sr.Group
  ActiveDocument.EndCommandGroup
End Sub
 
Ответ: Рисование карт

Можно создать свой шрифт, состоящий из нужных значков, далее -- fit text to patch, настраиваем, радуемся. :)
 
Ответ: Рисование карт

Вот оно как. Скока вариантов-то есть.
Только в том случае, когда у меня замкнутая кривая, возникает проблема стыковки символов (начало и конец)...
 
Ответ: Рисование карт

замкнутая кривая
сделать 2 кривых, дольше, но надежнее, чтоб небыло проблем при печати, снять галку "Print>PostScript>Fonts>"download type 1 fonts", так поле для деятельности получается несколько больше, ибо всё в кривых. ЗЫ: поищите (м.б. с целью покупки) в сети шрифты, которые относятся к MAP*шрифтам (mapmaker etc.), в них есть много интересного, лет 15 назад ими много пользовались.
 
Ответ: Рисование карт

Кстати, хороший способ представил lev.
Правда пришлось там поправить ошибочку (название переменной). Еще добавил простейший ввод параметров штриховки.

Код:
Sub Ravine()
  Dim sp As SubPath, s As Shape
  Dim t As Double
  Dim out As New Outline
  Dim d As Double
  Dim x As Double, y As Double
  Dim dx As Double, dy As Double
  Dim a As Double
  Dim sr As New ShapeRange
  Dim szSh As String
  Dim szStep As String
  
  If ActiveShape Is Nothing Then MsgBox "Выделите кривую": Exit Sub
  ActiveDocument.Unit = cdrMillimeter
  
  szSh = InputBox("Размер штриха", "Введите размер", 12)
  szSh = Replace(szSh, ",", ".")
  szStep = InputBox("Шаг", "Введите размер шага", 0.01)
  szStep = Replace(szStep, ",", ".")
  ActiveDocument.BeginCommandGroup ("Ravine")
  Set out = ActiveShape.Outline
  d = 2  'длина засечки
  For Each sp In ActiveShape.DisplayCurve.SubPaths
    For t = 0 To 0.99 Step Val(szStep)
      'MarkPoint sp, t, out, d
      sp.GetPointPositionAt x, y, t, cdrRelativeSegmentOffset
      a = sp.GetPerpendicularAt(t, cdrRelativeSegmentOffset) * 3.1415926 / 180
      dx = Val(szSh) * Cos(a)
      dy = Val(szSh) * Sin(a)
      Set s = ActiveLayer.CreateLineSegment(x, y, x + dx, y + dy)
      s.Outline.CopyAssign out
      sr.Add s
    Next t
  Next sp
  sr.Group
  ActiveDocument.EndCommandGroup
End Sub
 

Вложения

  • shtrih.gif
    shtrih.gif
    15.4 КБ · Просм.: 968
Ответ: Рисование карт

Насчёт процедур LayerVis (оставляет видимым только активный слой) и LayerVis2 (делает видимым все слои).
Здесь иногда наблюдается небольшой артефакт:
1. Делаем все слои видимыми
2. Выполняем макрос LayerVis - изображение не перерисовывается (видны объекты всех слоёв)
3. Выполняем макрос LayerVis повторно - изображение перерисовывается (видны объекты только активного слоя)
Т.е. иногда после первого применения макроса LayerVis изображение не перерисовывается...
 
Ответ: Рисование карт

Кстати, хороший способ представил lev.
Правда пришлось там поправить ошибочку (название переменной). Еще добавил простейший ввод параметров штриховки.
Только вот шаг должен быть абсолютным, а не относительным, т.е. он не должен зависеть от длины кривой...
 
Ответ: Рисование карт

Абсолютный шаг можно сделать блендом. И размеры точные тоже блендом. Вообще кореловский бленд весьма функционален, по сравнению с убогим блендом Иллюстратора.
 
Ответ: Рисование карт

Cyrax сказал(а):
Насчёт процедур LayerVis
Т.е. иногда после первого применения макроса LayerVis изображение не перерисовывается...
Попробуйте в конце добавить Refresh
 
Ответ: Рисование карт

Абсолютный шаг можно сделать блендом. И размеры точные тоже блендом. Вообще кореловский бленд весьма функционален, по сравнению с убогим блендом Иллюстратора.
Т.е. необходимо переписать процедуру Ravine таким образом, чтобы вместо ручного вырисовывания штрихов был использован blend ?
 
Ответ: Рисование карт

Не надо никаких процедур. Простой штатный кореловский бленд может расставлять объекты на фиксированное расстояние.
 
Ответ: Рисование карт

Простой штатный кореловский бленд может расставлять объекты на фиксированное расстояние.
Уже существующие объекты, расположенные вдоль некоторой кривой, можно расставить на фиксированное расстояние вдоль той же самой кривой ?
 
Ответ: Рисование карт

Послушайте Cyrax, ваши вопросы возникают из-за того что вы не хотите проверить свойства кореловского бленда.

Например это утверждение ошибочно
Cyrax сказал(а):
2. Вариант с расположением blend'а вдоль кривой тоже неплох. Но в этом случае плотность расположения штрихов также не задаётся в абсолютных единицах и зависит от длины линии-образца.
Смотрим на рисунке цифру 1, и на всякий случай проверяем Dimensions Tool-ом

Cyrax сказал(а):
И ещё одни серьёзный недостаток второго способа - штрихи не перпендикулярны кривой...
Смотрим на рисунке цифру 2
 

Вложения

  • blend.gif
    blend.gif
    15.7 КБ · Просм.: 922
Ответ: Рисование карт

Спасибо, разобрался.
Только странно, что шаг в абсолютных единицах можно задавать только в случае расположения blend'а вдоль кривой...
 

Вложения

  • Овраг 1.jpg
    Овраг 1.jpg
    11 КБ · Просм.: 815
Ответ: Рисование карт

Cyrax

Ну хоть так и то ладно. Вон в ai вообще ничего подобного задать нельзя. К тому же там бленд напрямую зависит от рычагов безье. Вытянул рычаг и появилась ненужная акселерация.
 
Статус
Закрыто для дальнейших ответов.