ObjectARX, AutoCAD. Среда программирования библиотеки C++



         

Манипуляция наборами выборов - часть 4


ads_matrix matrix;

{

ident_init(matrix); // Initialize to identity.

// Initialize translation vector.

matrix[0][T] = usrpt[X];

matrix[1][T] = usrpt[Y];

matrix[2][T] = usrpt[Z];

return RTNORM; // Matrix was modified.

}

Наоборот, следующая версия dragsample () масштабирует набор выборов в текущем XY плане, но не перемещает это.

 int dragsample(usrpt, matrix)

ads_point usrpt

ads_matrix matrix;

{

ident_init(matrix); // Initialize to identity.

matrix[0][0] = userpt[X];

matrix[1][1] = userpt[Y];

return RTNORM; // Matrix was modified.

}

Запрос к acedDragGen () который использует функцию преобразования, напоминает это:

int rc;

ads_name ssname;

ads_point return_pt;

// Prompt the user for a general entity selection:

if (acedSSGet(NULL, NULL, NULL, NULL, ssname) == RTNORM)

rc = acedDragGen(ssname, // The new entities

"Scale the selected objects by dragging", // Prompt

0, // Display normal cursor (crosshairs)

dragsample, // Pointer to the transform function

return_pt); // Set to the specified location

Более сложные преобразования могут вращать примитивы, комбинировать{*объединять*} преобразования (как в acedXformSS () пример), и т.д.

Объединение матриц преобразования известно как матричный состав. Следующая функция составляет две матрицы преобразования,  возвращая их изделие{*программу*} в resmat.

void xformcompose(ads_matrix xf1, ads_matrix xf2,

ads_matrix resmat)

{

int i, j, k;

ads_real sum;

for (i=0; i<=3; i++) {

for (j=0; j<=3; j++) {

sum = 0.0;

for (k=0; k<3; k++) {

sum += xf1[i,k] * xf2[k,j];

}

resmat[i,j] = sum;

}

}

}




Содержание  Назад  Вперед