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

2011-06-12

Два раза вычесть

Похоже, я сообразил, что мне делать с углами. Даже в коде реализовал, осталось проверить «в бою».

Если достаточно долго глядеть на картинку, то можно увидеть, что показанная UCS отличается от WCS двумя вещами. Первое — направление отсчета углов меняется на противоположное. В WCS против часовой стрелки, в UCS по ч.стрелке. Второе — вектор с нулевым углом повернут на 90 градусов (ибо совпадает с положительным направлением оси Х).

А больше и знать ничего не надо. Чтобы повернуть блок на нужный угол (60 град) в UCS, надо его поворачивать в обратном направлении и довернуть еще на 90 градусов. Опять же, в нужном направлении.

Как определять факт смены направления на противоположное я знаю, научился когда булжи (bulge) рисовал. Достаточно перевести в UCS два вектора с заранее известными углами, один больше второго, и сравнить углы векторов в UCS. Если тот, что больше, стал меньше — направление поменялось.
Смещение нуля определить еще проще. Переводим в UCS вектор с нулевым углом (0,0; 1,0) и меряем его угол. Считай готово.

trans = Vwcs2ucs()
trans.config(ucsMatrix)
ucsA = trans.wcs2ucsAngle(a)

class Vwcs2ucs:
 def config(self, matrix):
  self.ucsMatrix = matrix
  # detect clock hands directions for UCS
  p0 = self.wcs2ucs(0.0, 0.0)
  p1 = self.wcs2ucs(2.0, 1.0)
  p2 = self.wcs2ucs(2.0, 2.0)
  self.bulgeSign = getBulgeSign(p0, p1, p2)
  # detect origin angle for UCS
  p10 = self.wcs2ucs(1.0, 0.0)
  self.ucsZA = AutoLISP.angleP(p0, p10)
  print 'ucs angle origin [%s] deg, rotation sign [%s]' % (math.degrees(self.ucsZA), self.bulgeSign)

 def wcs2ucsAngle(self, a):
  ta = (self.bulgeSign * self.ucsZA) + (self.bulgeSign * a)
  return normAngle2pi(ta)
Вкратце так. Могу обещать полный комплект, но только после окончания всех проверок.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (185) web-develop (170) gov.ru (157) video (123) бытовуха (112) sysadm (100) GIS (97) Zope(Plone) (88) Book (81) programming (81) бурчалки (81) грабли (77) development (73) Fun (72) windsurfing (72) Microsoft (64) hiload (62) opensource (58) internet provider (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) language (45) hardware (44) JS (41) curse (40) driving (40) money (40) DBMS (38) bigdata (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (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) tourism (19) Apache (16) Manager (15) web-browser (15) Никонов (15) happiness (14) music (14) todo (14) PHP (13) course (13) functional programming (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) crypto (11) game (11) map (11) scala (11) HTTPD (9) ODF (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) Photo (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) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) display (4) holywar (4) nginx (4) pistol (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) USA (3) holiday (3) mount (3) spark (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) font (2) ftp (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) Palanga (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) krusader (1) license (1) mindmap (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)

Google+ Followers