- Похоже, я сообразил, что мне делать с углами. Даже в коде реализовал, осталось проверить «в бою».
-
- Если достаточно долго глядеть на картинку, то можно увидеть, что показанная 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) |
- Вкратце так. Могу обещать полный комплект, но только после окончания всех проверок.
-
Комментариев нет:
Отправить комментарий