Перейти к содержимому


Удлинение отрезка.

отрезок

Сообщений в теме: 8

#1 Линар Линарович

    Посетитель

  • Пользователи
  • PipPip
  • 13 сообщений

Отправлено 23 Февраль 2018 - 22:38

Код пишу в Excel
Код уже почти готов. всё работает,
Вот там один отрезок под углом, так надо его просто удлинить на 5,24 см.
на этом я и завис...

Сообщение отредактировал Линар Линарович: 23 Февраль 2018 - 22:41


#2 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 458 сообщений
  • Пол:Мужчина

Отправлено 24 Февраль 2018 - 01:29

а в чем проблема-то?
- берем концевые точки
- считаем вектор из начала в конец
- считаем длину вектора
- норализуем вектор
- умножаем его на (len + 5.24)
- добавляем к начальной точке, получаем новое положение конца
- меняем отрезку концевую точку на новую

в таком виде выглядит жутковато, но на самом деле все просто.

на нативном с++ это будет примерно так :
OdDbLinePtr pLine = OdDbLine::cast(lineId.openObject(OdDb::kForWrite));
OdGePoint3d start, end;
pLine->getStartPoint(start);
pLine->getEndPoint(end);
OdGeVector3d dir = end - start;
double len = dir.normalizeGetLength();
pLine->setEndPoint(start + dir * (len + 5.24));


#3 amk

    Активист

  • Пользователи
  • PipPipPipPip
  • 249 сообщений
  • Пол:Мужчина
  • Город:Омск

Отправлено 24 Февраль 2018 - 02:43

Можно к конечной точке добавить умноженный на 5.24 верзор (верзор вектора это то, что получается после нормализации). Получится немного короче и нагляднее.

#4 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 458 сообщений
  • Пол:Мужчина

Отправлено 24 Февраль 2018 - 18:23

Ясное дело, что VBA код C++ не понимает - это была чисто иллюстрация, как вообще линии модифицируются.

на VBA это будет примерно так :

...

Dim startPoint, endPoint
Dim dx as double, dy as double, dz as double, len as double

startPoint = ThisDrawing.Utility.CreateSafeArrayFromVector(obj1.StartPoint)
endPoint = ThisDrawing.Utility.CreateSafeArrayFromVector(obj1.EndPoint)

dx = endPoint(0)-startPoint(0)
dy = endPoint(1)-startPoint(1)
dz = endPoint(2)-startPoint(2)

len = Sqr(dx*dx + dy*dy + dz*dz)
dx = dx / len
dy = dy / len
dz = dz / len

endPoint(0) = endPoint(0) + 5.24*dx
endPoint(1) = endPoint(1) + 5.24*dy
endPoint(2) = endPoint(2) + 5.24*dz

obj1.EndPoint = endPoint


#5 Линар Линарович

    Посетитель

  • Пользователи
  • PipPip
  • 13 сообщений

Отправлено 24 Февраль 2018 - 22:40

Великолепно! всё работает. спасибо Лион.
почему то пришлось поменять слово "len" на любое другое.

.

Сообщение отредактировал Линар Линарович: 02 Март 2018 - 23:48


#6 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 458 сообщений
  • Пол:Мужчина

Отправлено 25 Февраль 2018 - 05:14

Просмотр сообщенияЛинар Линарович (24 Февраль 2018 - 22:40) писал:

боюсь быть наглым, но точнее нужно так: Разделить отрезок на три равных части, и из одной из точек, влево построить отрезок под углом 135 градусов и длинной 3 см.

А все примерно так же. У нас есть ровно один способ воздействия на отрезок - задать его концы. все остальное - это элементарная геометрия.
вообще-то, чтобы это выглядело не настолько гадостно (да и для минимизации количества ошибок) стоит сочинить хотя бы минимальную геометрическую библиотечку -
всякое сложение-вычитание векторов и все такое - тогда становится легче жить. можно на тупых массивах из 3 элементов, можно поизвращаться и накатать, скажем, классы, типа

Class Vector3d
  Private m_coords(0 to 2) As Double
  Property x() As Double 
	 Get
	   return m_coords(0)
	 End Get
	 Set (ByVal xx As Double)
	   m_coords(0) = xx
	 End Set
  End Property

  Property y() As Double
	 Get
	   return m_coords(1)
	 End Get
	 Set (ByVal yy As Double)
	   m_coords(1) = yy
	 End Set
  End Property

  Property z() As Double 
	 Get
	   return m_coords(2)
	 End Get
	 Set (ByVal zz As Double)
	   m_coords(2) = zz
	 End Set
  End Property

  Property length() As Double
    Get
	  return Sqr(m_coords(0)*m_coords(0) + m_coords(1)*m_coords(1) + m_coords(2)*m_coords(2))
    End Get
  End Property
end class

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

#7 Линар Линарович

    Посетитель

  • Пользователи
  • PipPip
  • 13 сообщений

Отправлено 26 Февраль 2018 - 21:42

Понимаю что код тот нужный, но как им пользоваться - не понял.

#8 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 458 сообщений
  • Пол:Мужчина

Отправлено 27 Февраль 2018 - 12:17

да все просто... работать с элементами массива - неудобно и ненаглядно. и ошибок будет куча.
А так - получается что-то вроде

Dim vec As Vector3d
vec.x = 100
vec.y = 200
...
ну и всякиу полезный утиль вроде
vector.set(100,200,300)
vector.addVector(anoterVector)
и прочее и прочее. получается компактнее, нагляднее и вероятность ошибок меньше. хотя по сути - все равно везде одно и то же - манипуляции элементами массива

#9 Линар Линарович

    Посетитель

  • Пользователи
  • PipPip
  • 13 сообщений

Отправлено 02 Март 2018 - 22:12

На поставленный вопрос ответ получил .
спасибо Lion007





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей