Калибровка Таблетки
Пользователи AutoCAD с таблеткой отцифровывания могут калибровать таблетку, используя команду TABLET. С acedTablet () функция, приложения может управлять калибровками, устанавливая их непосредственно и сохраняя назначения калибровки для будущего использования. Функция берет два параметра, список и результат, каждый из которых - список буфера результата. Первый буфер результатов в первом списке - целочисленный код, который должен быть 0, чтобы отыскать текущую калибровку (в результате), или 1, чтобы установить калибровку согласно остающимся буферам в списке. Калибровки выражены как четыре трехмерных точки (в дополнение к коду). Первые три из них - направляющие — row1, row2, и row3 — три строки матрицы преобразования таблетки. Четвертая точка - вектор, направление, которое является нормальным на план поверхности таблетки (выраженное в WCS).
ОБРАТИТЕ ВНИМАНИЕ На TABMODE средство управления переменной системы, установлен ли режим Tablet в На (1) или От (0). Вы можете управлять это, используя acedSetVar().
Следующая последовательность кода отыскивает текущую калибровку таблетки, и сохраняет это в calibr2. В этом примере, пользователь использовал команду TABLET, чтобы калибровать матрицу, и режим Tablet включен.
struct resbuf *calibr1, *calibr2;
struct resbuf varbuf, rb;
// Retrieve the current calibration.
calibr1 = acutBuildList(RTSHORT, 0, RTNONE);
if (acedTablet(calibr1, &calibr2) != RTNORM) {
acdbFail("Calibration not obtainable\n");
return BAD;
}
Код, возвращенный в параметре результата, calibr2 в примере, автоматически установлен в 1. Чтобы сбрасывать калибровку к значениям, отысканным предшествующим примером, Вы могли использовать следующий код:
if (acedTablet(calibr2, &calibr1) != RTNORM) {
acdbFail("Couldn’t reset calibration\n");
return BAD;
}
rb.restype = RTSHORT;
rb.resval.rint = 1;
acedSetVar("TABMODE", &rb);
acedGetVar("TABMODE" &varbuf);
if (varbuf.resval.rint == 0) {
acdbFail("Couldn’t set TABMODE\n");
return BAD;
}
В этом примере, calibr1 теперь содержит результат калибровки. Поскольку это возможно идентично calibr2 (который был инициализирован acedTablet ()), Вы не обязательно нуждаетесь в этом результате. Когда Вы устанавливаете калибровку, Вы можете определить результат NULL, который заставляет acedTablet () устанавливать калибровку “ тихо. ”
if (acedTablet(calibr2, NULL) != RTNORM) { . . . }
Матрица преобразования прошла, поскольку row1, row2, и row3 - 3x3, матрица преобразования хотела преобразовать 2-ую точку. 2-ая точка выражена как вектор столбца в гомогенных координатах (добавляя 1.0 как третий элемент), так что преобразование напоминает это:
X' |
M 00 M 01 M 02 |
X' |
||
Y' |
= |
M 10 M 11 M 12 |
x |
Y' |
D' |
M 20 M 21 1.0 |
1.0 |
X' = M 00 X + M 01 Y + M 02
Y' = M 10 X + M 11 Y + M 12
D' = M 20 X + M 21 Y + 1.0
Чтобы поворачивать заканчивающийся вектор назад в 2-ую точку, первые два компонента разделены третью, коэффициентом масштаба, выдавая точку D ' (X '/D ', Y '/D ').
Для проективного преобразования, которое является, большинство общего случая, acedTablet () делает полное вычисление. Но для афинных и ортогональных преобразований, и - оба 0, удет быть 1.0 - также.
Вычисление опущено; заканчивающаяся 2-ая точка - просто.
Афинное преобразование - специальный, однородный случай проективного преобразования. Ортогональное преобразование - специальный случай афинного преобразования: не только являются и 0, но и и.
М. 20 М. 21 D '
( X ', Y ')
М. 20 М. 21 М. 00 = М. 11
М. 10 = - М. 01
ОБРАТИТЕ ВНИМАНИЕ, когда Вы устанавливаете калибровку, результат не равняется параметру списка, если направление в списке не было нормализовано; AutoCAD нормализует вектор направления прежде, чем это возвращает это. Также, это гарантирует, что третий элемент в третьем столбце (row3 [Z]) равен 1. Эта ситуация не должна возникнуть, если Вы устанавливаете калибровку, используя значения, отысканные из AutoCAD посредством acedTablet (). Однако, это может случаться, если ваша программа вычисляет преобразование непосредственно.