Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Ср Мар 15, 2006 2:14 pm Заголовок сообщения: Отрисовка дуг |
|
|
Здравствуйте!!
Столкнулся с проблемой отрисовки дуг. Не могу разобраться с вопросом - что такое начальный угол (element.AsArcElement.StartAngle)?
Попробовал "скопировать", т.е. перерисовать заданную дугу, изменив только Z=0 координат центра и начальной и конечной точек. В результате получаю дугу, непонятно как отзеркаленную, то есть начало и конец дуги не совпадают с нарисованным....
Почему он так "зеркально" рисует дуги? Как определять начальный угол?
----------------------------------
Public arElem() as Element
Public idxAr as Long
idxAr=0
ReDim arElem(idxAr)
'функция отрисовки дуги по заданной
Private Sub TestArcElem(welem As element)
Dim tStPt As Point3d, tEndPt As Point3d, tCntPt As Point3d
Dim tStAngle As Double, tSweepAngle As Double
Dim tRadMain As Double, tRadSec As Double
Dim tCurMatr3D As Matrix3d
tStPt = welem.AsArcElement.StartPoint
tEndPt = welem.AsArcElement.EndPoint
tCntPt = welem.AsArcElement.CenterPoint
tStAngle = welem.AsArcElement.StartAngle
tSweepAngle = welem.AsArcElement.SweepAngle
tRadMain = welem.AsArcElement.PrimaryRadius
tRadSec = welem.AsArcElement.SecondaryRadius
tCurMatr3D = Application.Matrix3dIdentity()
tStPt.Z = 0
tEndPt.Z = 0
tCntPt.Z = 0
Set arElem(idxAr) = Application.CreateArcElement2(Nothing, tCntPt, tRadMain, tRadSec, tCurMatr3D, tStAngle, tSweepAngle)
arElem(idxAr).Color = 153
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
ReDim Preserve arElem(idxAr + 3)
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.StartPoint, tStPt)
arElem(idxAr).Color = 44
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.EndPoint, tEndPt)
arElem(idxAr).Color = 214
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.CenterPoint, tCntPt)
arElem(idxAr).Color = 51
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
End Sub
' формирование фрагмента из массива элементов и вывод в модель...
----------------------------------------------
С уважением
Руслан |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Мар 15, 2006 4:45 pm Заголовок сообщения: |
|
|
На первый взгляд, дело в следующем:
Там остается матрица без изменений, а точки меняются, вот она и рисует невесть что...
Если менять только точки, то и рисовать надо бы только по точкам
Код: |
Set ArcElement = object.CreateArcElement1 (Template, StartPoint, CenterPoint, EndPoint)
|
Не знаю как она рисует в VBA арки, а в MDL если рисовать по трем точкам, то отрисовка идет строго против часовой стрелки. |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Ср Мар 15, 2006 5:32 pm Заголовок сообщения: |
|
|
Пробовал и по трем точкам. Похоже и в VBA рисует против часовой стрелки. Но что делать, если нужно по часовой отрисовать?
Кстати, какую матрицу Вы имели в виду? Возможно ли ее обновить? У меня есть уравнение плоскости, в которой должна лежать дуга, и нормаль к ней.
Есть еще функция рисования
Set ArcElement = object.CreateArcElement4 (Template, StartTangent, EndPoint)
где задается начальная точка, направление касательной и конечная точка. Как определить направление касательной?
---------------------------
Заранее спасибо. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Мар 15, 2006 5:52 pm Заголовок сообщения: |
|
|
Цитата: |
Но что делать, если нужно по часовой отрисовать?
|
По моему, ответ напрашивается сам собой
Просто поменять точки. Я поступаю именно так.
Цитата: |
Кстати, какую матрицу Вы имели в виду? Возможно ли ее обновить?
|
Matrix3d - трехмерная матрица, которая определяет положение в пространстве.
Конечно можно. Даже нужно, если требуется разместить арку без указания точек.
Цитата: |
У меня есть уравнение плоскости, в которой должна лежать дуга, и нормаль к ней.
|
Этого достаточно для определения матрицы |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Вт Окт 09, 2007 8:23 am Заголовок сообщения: |
|
|
И снова здрасте, и снова вопросы по дугам
Главная задача - заменить часть эллипса. Пробовал дугой:
Код: |
Dim behElem As element, stPoint As Point3d
Dim cntrPt As Point3d, begAng As Double, swpAng As Double, prRad As Double, secRad As Double, curMtrxRot As Matrix3d
Dim arElems() As element
cntrPt = behElem.AsEllipticalElement.centerPoint
' [DEBUG] cntrPt={1000;750;0}
prRad = behElem.AsEllipticalElement.PrimaryRadius
secRad = behElem.AsEllipticalElement.SecondaryRadius
' [DEBUG] prRad=1000; secRad=750
curMtrxRot = behElem.AsEllipticalElement.Rotation
' [DEBUG] curMtrxRot={{1;0;0},{0;1;0},{0;0;1}}
stPoint = behElem.AsEllipseElement.PointAtDistance(0)
' [DEBUG] stPoint={2000;750;0}
' функция get2DAngelLine (pt1,pt2) определяет угол наклона прямой, заданной точками pt1 и pt2, к оси OX в 2D
' функция get2DPtFrom3D преобразует Point3D в Point2D путем отсечения координаты Z
begAng = curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), curClPts.get2DPtFrom3D(stPoint))
swpAng =curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), arStruct(i).valPt)
' [DEBUG] arStruct(i).valPt={1500;923,205080756888}
' [DEBUG] begAng=0, swpAng=0,333473172251832 (~19,1066 грС)
ReDim arElems(0)
Set arElems(0) = CreateArcElement2(Nothing, cntrPt, prRad, secRad, curMtrxRot, begAng, swpAng - begAng)
|
В итоге получаю дугу, описывающую нужную часть эллипса, но...
в информации по этой дуге пишется "Угол разворота: 19.106605 грС", а на самом деле, проведя прямые из центра дуги по ее краям получаем угол 3.9632 грС, да и сама дуга намного меньше ожидаемой.
В чем проблема? И если виновата матрица, то как и почему ее нужно преобразовывать?
По поводу функции CreateArcElement2 - это единственная из 5 функций, которой в принципе можно заменить эллипс, остальные работают с окружностями, то есть prRad=secRad |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Вт Окт 09, 2007 8:40 am Заголовок сообщения: |
|
|
Попробовал использовать MDL функцию:
Код: |
Public Function getArcFromEllips(inElem As element, inStAng As Double, inSwAng As Double) As element
Dim descrP As Long, elemPOut As Long, elementP As Long
Dim curElps As Ellipse3d, curFrstPt As Point3d
Set getArcFromEllips = Nothing
' формирование структуры описания эллипса
' начальный угол
curElps.start = inStAng ' [DEBUG] curElps.start=0
' угол разворота
curElps.Sweep = inSwAng ' [DEBUG] curElps.Sweep=0,33347 (~19,1066 грС)
' центр эллипса
curElps.Center = inElem.AsEllipticalElement.centerPoint
' [DEBUG] curElps.Center={1000;750;0}
' определение начальной (0) точки
curFrstPt = inElem.AsEllipseElement.PointAtDistance(0)
' [DEBUG] curFrstPt={2000;750;0}
' формирование вектора из центра в точку по 0 градусов
curElps.Vector0.X = curFrstPt.X - curElps.Center.X
curElps.Vector0.Y = curFrstPt.Y - curElps.Center.Y
curElps.Vector0.Z = curFrstPt.Z - curElps.Center.Z
' [DEBUG] curElps.Vector0={1000;0;0}
' определение точки при 1/4 длины
curFrstPt = inElem.AsEllipseElement.PointAtDistance(inElem.AsEllipseElement.Perimeter / 4)
' [DEBUG] curFrstPt={1000;950;0}
' формирование вектора из центра в точку по 90 градусов
curElps.Vector90.X = curFrstPt.X - curElps.Center.X
curElps.Vector90.Y = curFrstPt.Y - curElps.Center.Y
curElps.Vector90.Z = curFrstPt.Z - curElps.Center.Z
' [DEBUG] curElps.Vector90={0;200;0}
' считывание описания элемента
descrP = inElem.MdlElementDescrP
' получение ссылки на элемент по его описанию
elementP = ElmdscrAccessor_getMSElement(descrP)
' попытка создания дуги по подобию эллипса
mdlArc_createByDEllipse3d elemPOut, elementP, curElps
' !!!!!! Зависает MS (в частности PowerDraft) !!!!!!!
Set getArcFromEllips = Application.MdlCreateElementFromElementDescrP(elemPOut)
End Function
|
При попытке создать дугу по приведенным данным зависает вся система. В чем здесь ошибка? |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Окт 09, 2007 10:15 am Заголовок сообщения: |
|
|
С MDL есть смысл связываться, если возможности VBA исчерпаны ...
Код: |
begAng = curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), curClPts.get2DPtFrom3D(stPoint))
swpAng =curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), arStruct(i).valPt)
|
Здесь не совсем понятно что за объект curClPts, и правильно ли работют функции get2DAngelLine и get2DPtFrom3D. В остальном все вроде верно. |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Вт Окт 09, 2007 10:41 am Заголовок сообщения: |
|
|
Ну вот потому, как не получилось в VBA, то решил проверить MDL.
Объект curClPts - это созданный свой класс, в котором собраны различные методы по работе с точками.
Функции get2DAngelLine и get2DPtFrom3D работают правильно, так как оттестированы на других проектах.
Тогда как объяснить различные данные, предоставляемые информацией и реальными размерами? Единственно, что приходит на ум - это какой-то глюк с матрицей, хотя зачем ее менять, если я объект не поворачиваю.....
Вот почему в свойствах полученной дуги показывает угол разворота 19,1 грС, а угол между прямыми, проведенными из центра дуги к ее краям, инструментом измерения угловых значений показывает 3,96 грС (что по внешнему виду более правдоподобно)??? И почему MDL не заработал? Хоть что-то бы нарисовал.....для разнообразия...
Ну и если уже окончательно запутал - вопрос сначала. Каким образом мне, зная характеристики эллипса (радиусы, координаты центра и т.п.) построить дугу по двум известным точкам, которая по кривизне была бы аналогична исходному эллипсу? |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Окт 09, 2007 12:14 pm Заголовок сообщения: |
|
|
Матрица, насколько я понимаю, не при чем.
Rus77 писал(а): | Ну и если уже окончательно запутал - вопрос сначала. Каким образом мне, зная характеристики эллипса (радиусы, координаты центра и т.п.) построить дугу по двум известным точкам, которая по кривизне была бы аналогична исходному эллипсу? |
Точки находятся на эллипсе?
Единственная сложность, имхо, которая может возникнуть - это из-за того что точки могут быть указаны произвольно, придется определяться с направлением отрисовки дуги.
Кстати, а что такое грС? |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Вт Окт 09, 2007 2:08 pm Заголовок сообщения: |
|
|
грС - градус Цельсия... при программировании надо пользоваться радианами, а для наглядности нужны грС...
Точки берутся как точки пересечения с другим элементом (в частности прямоугольником) и формируются стандартной функцией
arInterPoints = mainElem.AsIntersectableElement.GetIntersectionPoints(behElem, Matrix3dIdentity)
где arInterPoints - возвращаемый массив точек
mainElem - один из элементов
behElem - другой элемент
Matrix3dIdentity - матрица вращения
Порядок следования формируется путем сортировки расстояний по контуру от 0 точки до точек пересечения. При этом использую метод DistanceAtPoint(arInterPoints(i)). Теоретически должен получить точки эллипса в том порядке, в котором они были при отрисовки.
Единственно не пойму почему разница в свойствах полученной дуги и реальным образмериванием......Где копать-то.... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Окт 10, 2007 10:04 am Заголовок сообщения: |
|
|
вообще кажись получается, что программирование здесь совсем не при чем...
если построить все вручную, то получается такая вот картина:
информация к размышлению |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Окт 10, 2007 10:20 am Заголовок сообщения: |
|
|
А вот кстати и решение _________________ Непонимание различия операторов OR и XOR может привести к зависанию в проеме. Спросите у Винни-Пуха. |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Ср Окт 10, 2007 12:46 pm Заголовок сообщения: |
|
|
Спасибо за документальное подтверждение моих догадок...
Только не пойму для чего это делалось....
Придется искать выход из сложившегося положения.... |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|