home *** CD-ROM | disk | FTP | other *** search
- Sub DrawDiagram()
- Const Pi As Double = 3.14159265 'Определение константы Pi
- Const cdStep As Double = Pi/20 'Задание шага изменения координаты X при построении графика
- Const PiDiv2Neig As Double = Pi/2 - cdStep 'Нижняя окрестность точки Pi/2, используется при построении графика функции y=tn(x) для изоляции точки разрыва
- Const X0 As Double = 1000 'Абсцисса центра координат графика.
- Const Y0 As Double = 1500 'Ордината центра координат графика.
- Const cdScale As Double = 200 'Масштаб строящегося графика. Единица шкалы графика соответствует 200 юнитам документа.
- Dim active_page As Page 'Ссылка на активную страницу нового документа.
- Dim new_Shape As Shape 'Ссылка на объект-шэйп, представляющий новую построенную диаграмму.
- Dim dX As Double 'Координата X следующей определяющейся точки диаграммы.
-
- 'Получаем ссылку на активную страницу текущего документа. Используем глобальную переменную thisDoc
- 'для доступа к объекту Document.
- Set active_page = thisDoc.ActivePage
-
- 'Получаем количество шэйпов на активной странице активного документа
- iShapesCount = active_page.ShapesNum()
- 'Очищаем страницу документа от всех шэйпов, не находящихся на Layer "Axis".
- 'Выполняем цикл для всех шэйпов страницы. При инициализации
- 'значение счетчика становится равным количеству шэйпов на активной странице
- 'активного документа. Затем значение счетчика уменьшается до 1 с шагом -1.
- 'Если бы значение счетчика изменялось от 1 до iShapesCount, после удаления
- 'шэйпа происходила бы переиндексация остальных объектов, и обращения к объектам
- 'по уже несуществующему индексу.
- For i=iShapesCount To 1 Step -1
- 'Если шэйп не находится на Layer "Axis", удаляем его.
- If thisDoc.LayerByID(active_page.Shape(i).Layer).Name <> "Axis" Then
- active_page.RemoveShape(i)
- End If
- Next
-
-
- 'Начинаем построение графика. График аппроксимируется полигоном.
- 'Строим один период [-Pi;Pi] периодической функции.
- Set new_Shape = active_page.BeginShape()
- 'Устанавливаем графику ширину линии и цвет, используя индексное представление цвета.
- new_Shape.PenWeight = 8
- new_Shape.PenColor.Index = 1
- 'Определяем первую точку графика.
- active_page.MoveTo(X0 - Pi* cdScale, Y0 - sin(-Pi)* cdScale)
- For dX=-Pi To Pi Step cdStep
- 'Строим сегменты полигона. При этом следует учесть, что ось ординат графика направлена
- 'противоположно оси ординат документа.
- active_page.LineTo(X0 + dX*cdScale, Y0 - sin(dX)*cdScale)
- Next
- 'Завершаем построение шэйпа.
- active_page.EndShape()
-
- 'Аналогично строим график функции y=cos(x)
- Set new_Shape = active_page.BeginShape()
- new_Shape.PenWeight = 8
- new_Shape.PenColor.Index = 12
- active_page.MoveTo(X0 - Pi*cdScale, Y0 - cos(-Pi)*cdScale)
- For dX=-Pi To Pi Step cdStep
- active_page.LineTo(X0 + dX*cdScale, Y0 - cos(dX)*cdScale)
- Next
- active_page.EndShape()
-
- 'Построение графика функции y=arctn(x) на промежутке [-Pi;Pi]
- Set new_Shape = active_page.BeginShape()
- new_Shape.PenWeight = 8
- new_Shape.PenColor.Index = 3
- active_page.MoveTo(X0 - Pi*cdScale, Y0 - atn(-Pi)*cdScale)
- For dX=-Pi To Pi Step cdStep
- active_page.LineTo(X0 + dX*cdScale, Y0 - atn(dX)*cdScale)
- Next
- active_page.EndShape()
-
- 'Построение графика функции y=tn(x). Эта функция периодическая с периодом Pi.
- 'Поскольку значение функции стремиться к бесконечности при x, стремящемся к -Pi/2 и Pi/2,
- 'график строится только на промежутке [-PiDiv2Neig;PiDiv2Neig].
- Set new_Shape = active_page.BeginShape()
- new_Shape.PenWeight = 8
- new_Shape.PenColor.Index = 5
- active_page.MoveTo(X0 - PiDiv2Neig * cdScale, Y0 - tan(-PiDiv2Neig)*cdScale)
- For dX=-PiDiv2Neig To PiDiv2Neig Step cdStep
- active_page.LineTo(X0 + dX*cdScale, Y0 - tan(dX)*cdScale)
- Next
- active_page.EndShape()
- End Sub
-
-