- Даже любопытно, что случится раньше, я с ума сойду или наступит полная победа разума над Автокадом?
-
- Я очередной раз зашел в тупик, никак не соображу, как правильно вычислить угол поворота примитива (блока) в UCS. Из исходных данных у меня есть точка вставки (WCS), угол поворота (видимо в OCS) и масштабные факторы, хотя они тут и не при делах. Есть еще матрица перевода координат из WCS в UCS.
- На текущий момент у меня вроде как получается вычислить угол повората в WCS. Методом вычисления координат второй точки, дополняющей первую до вектора. Вычислив две точки в OCS, я перевожу их координаты в WCS и беру угол наклона этого вектора. Так получается угол поворота блока в WCS. Натурные эксперименты пока подтверждают правильность подхода.
-
- Но мне надо воспроизвести блок в UCS. И тут начинаются траблы. Посмотрим на картинку:
- Тут видно примеры блоков и углы в UCS (что должно получаться) и в WCS (что у меня получается).
- На левой картинке видно, что мы имеем UCS; синяя «Т» это блок с точкой вставки в основании «буквы». Нарисованная дуга (я ее спецом нарисовал, для иллюстрации) показывает угол поворота, около 220 градусов, если угол положительный. Черная «буква» Т показывает как вставляется блок, если угол поворота = 0. Выходит, мне надо раздобыть значение угла = 220 град (3.8 рад).
- На правой картинке видно, что происходит в WCS. Как видите, угол поворота около 60 град. Эту правую картинку я воспроизвожу, но вот пересчитать угол, чтобы из 60 градусов получилось 220 — никак. 30 градусов — запросто (методом доп.точки), а 220 — фигу.
-
- Очевидно, что надо добавить Pi радиан, но не пойму, откуда это очевидно. И что делать, если в другом случае будет другая матрица пересчета КС. Кстати, неудача с методом доп.точки в данном случае наводит на мысль, что и вычисление угла в WCS из OCS даст ошибку при других обстоятельствах.
-
- Кстати, вот матрица WCS->UCS:
- ucsMatrix = ((0.0, 1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0))
- а вот код пересчета:
def wcs2ucs(matrix, x, y, z=0.0): ''' transform point from WCS to UCS ''' a,b,c,d = matrix xt = x*a[0] + y*b[0] + z*c[0] + d[0] yt = x*a[1] + y*b[1] + z*c[1] + d[1] zt = x*a[2] + y*b[2] + z*c[2] + d[2] return (xt, yt, zt) |
- И что мне делать с углами, ума не приложу.
-
На картинке неправильно нарисованы дуги, показывающие углы. В Автокаде углы отсчитываются от оси Х против часовой стрелки. Так, вектор 1,0 (от нуля) дает 0 градусов; вектор 0,1 дает 90 градусов.
ОтветитьУдалитьНо сути это не меняет.