Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-06-11

OCS, WCS, UCS + Rotation angle

Даже любопытно, что случится раньше, я с ума сойду или наступит полная победа разума над Автокадом?

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

  1. На картинке неправильно нарисованы дуги, показывающие углы. В Автокаде углы отсчитываются от оси Х против часовой стрелки. Так, вектор 1,0 (от нуля) дает 0 градусов; вектор 0,1 дает 90 градусов.
    Но сути это не меняет.

    ОтветитьУдалить

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)