Перейти к содержанию
Авторизация  
Линар Линарович

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

Рекомендуемые сообщения

Код пишу в Excel

Код уже почти готов. всё работает,

Вот там один отрезок под углом, так надо его просто удлинить на 5,24 см.

на этом я и завис...

Изменено пользователем Линар Линарович

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем проблема-то?

- берем концевые точки

- считаем вектор из начала в конец

- считаем длину вектора

- норализуем вектор

- умножаем его на (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));

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ясное дело, что 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

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Великолепно! всё работает. спасибо Лион.

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

 

.

Изменено пользователем Линар Линарович

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

боюсь быть наглым, но точнее нужно так: Разделить отрезок на три равных части, и из одной из точек, влево построить отрезок под углом 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

и все в таком духе...

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

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А так - получается что-то вроде

 

Dim vec As Vector3d

vec.x = 100

vec.y = 200

...

ну и всякиу полезный утиль вроде

vector.set(100,200,300)

vector.addVector(anoterVector)

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация  

×
×
  • Создать...