【计算机图形学】3-2 二维几何变换基本代码

返回目录

基本理论参见:【计算机图形学】3-1 二维几何变换基本理论

注:这里不考虑插值的问题。

全部的代码都在https://github.com/CyberZHG/ZPIC上,欢迎各位前来围观和提出意见。

效果截图:

移动:

缩放:

旋转:

错切 :

改变旋转中心后的旋转:

transform_matrix.h

#ifndef TRANSFORM_MATRIX_H_INCLUDED

#define TRANSFORM_MATRIX_H_INCLUDED

#include

#include "define.h"

typedef struct Transform_Matrix_9d

{

double m[3][3];

}Transform_Matrix_9d;

void transform_matrix_init(Transform_Matrix_9d *matrix);

void transform_matrix_clear(Transform_Matrix_9d *matrix);

void transform_matrix_add(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2);

void transform_matrix_substract(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2);

void transform_matrix_multiply(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2);

void transform_matrix_copy(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2);

void transform_matrix_transformPoint(const Transform_Matrix_9d matrix, int32 *x, int32 *y);

void transform_matrix_move(Transform_Matrix_9d *matrix, double tx, double ty);

void transform_matrix_scale(Transform_Matrix_9d *matrix, double sx, double sy);

void transform_matrix_rotate(Transform_Matrix_9d *matrix, double angle);

void transform_matrix_shear(Transform_Matrix_9d *matrix, double b, double d);

#endif // TRANSFORM_MATRIX_H_INCLUDED

transform_matrix.c

#include "transform_matrix.h"

void transform_matrix_init(Transform_Matrix_9d *matrix)

{

int32 i, j;

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

{

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

{

matrix->m[i][j] = 0.0;

}

matrix->m[i][i] = 1.0;

}

}

void transform_matrix_clear(Transform_Matrix_9d *matrix)

{

int32 i, j;

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

{

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

{

matrix->m[i][j] = 0.0;

}

}

}

void transform_matrix_add(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2)

{

int32 i, j;

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

{

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

{

m1->m[i][j] += m2.m[i][j];

}

}

}

void transform_matrix_substract(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2)

{

int32 i, j;

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

{

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

{

m1->m[i][j] -= m2.m[i][j];

}

}

}

void transform_matrix_multiply(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2)

{

int32 i, j, k;

Transform_Matrix_9d temp;

transform_matrix_clear(&temp);

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

{

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

{

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

{

temp.m[i][j] += m1->m[i][k] * m2.m[k][j];

}

}

}

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

{

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

{

m1->m[i][j] = temp.m[i][j];

}

}

}

void transform_matrix_copy(Transform_Matrix_9d *m1, const Transform_Matrix_9d m2)

{

int32 i, j;

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

{

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

{

m1->m[i][j] = m2.m[i][j];

}

}

}

void transform_matrix_transformPoint(const Transform_Matrix_9d matrix, int32 *x, int32 *y)

{

int32 tx, ty;

tx = (int)(*x * matrix.m[0][0] + *y * matrix.m[1][0] + matrix.m[2][0]);

ty = (int)(*x * matrix.m[0][1] + *y * matrix.m[1][1] + matrix.m[2][1]);

*x = tx;

*y = ty;

}

void transform_matrix_move(Transform_Matrix_9d *matrix, double tx, double ty)

{

Transform_Matrix_9d moveMatrix;

transform_matrix_init(&moveMatrix);

moveMatrix.m[2][0] = tx;

moveMatrix.m[2][1] = ty;

transform_matrix_multiply(matrix, moveMatrix);

}

void transform_matrix_scale(Transform_Matrix_9d *matrix, double sx, double sy)

{

Transform_Matrix_9d scaleMatrix;

transform_matrix_init(&scaleMatrix);

scaleMatrix.m[0][0] = sx;

scaleMatrix.m[1][1] = sy;

transform_matrix_multiply(matrix, scaleMatrix);

}

void transform_matrix_rotate(Transform_Matrix_9d *matrix, double angle)

{

Transform_Matrix_9d rotateMatrix;

transform_matrix_init(&rotateMatrix);

rotateMatrix.m[0][0] = rotateMatrix.m[1][1] = cos(angle);

rotateMatrix.m[1][0] = - (rotateMatrix.m[0][1] = sin(angle));

transform_matrix_multiply(matrix, rotateMatrix);

}

void transform_matrix_shear(Transform_Matrix_9d *matrix, double b, double d)

{

Transform_Matrix_9d shearMatrix;

transform_matrix_init(&shearMatrix);

shearMatrix.m[0][1] = b;

shearMatrix.m[1][0] = d;

transform_matrix_multiply(matrix, shearMatrix);

}

transform_selection.h

#ifndef TRANSFORM_SELECTION_H_INCLUDED

#define TRANSFORM_SELECTION_H_INCLUDED

#include

#include

#include "define.h"

#include "gui.h"

#include "draw.h"

#include "transform_matrix.h"

typedef struct Transform_Selection_10i2f1m

{

int32 x[4], y[4];

float cx, cy;

draw_color **color;

int32 **px;

int32 **py;

Transform_Matrix_9d transMatrix;

}Transform_Selection_10i2f1m;

void transform_selection_display(void);

void transform_selection_mouseEvent(int32 state, int32 x, int32 y);

void transform_selection_keyboardEvent(int32 key, int32 state);

#endif // TRANSFORM_SELECTION_H_INCLUDED

transform_selection.c

#include "transform_selection.h"

static Transform_Selection_10i2f1m transform_default_selection;

int32 isMovingCenter;

int32 isSelecting;

int32 isSelected;

int32 isMoving;

int32 isResizing;

int32 isRotating;

int32 isShearing;

int32 isMouseDown;

int32 isFinshed;

int32 startX, startY;

int32 endX, endY;

int32 lastEdgeX, lastEdgeY;

Transform_Matrix_9d startMatrix;

int32 isShiftDown;

void transform_selection_display(void)

{

int32 i, j, w, h;

int32 x[4], y[4], mx, my;

float cx, cy;

int32 edgeL, edgeR, edgeB, edgeT;

draw_color **color;

int32 **px, **py;

int32 tx, ty;

Transform_Matrix_9d *matrix = &transform_default_selection.transMatrix;

draw_color penColor = draw_pen_getColor();

draw_color brushColor = draw_brush_getColor();

draw_pen_setColor(DRAW_COLOR_WHITE);

draw_brush_setColor(DRAW_COLOR_BLACK);

for(i=0;i<4;++i)

{

x[i] = transform_default_selection.x[i];

y[i] = transform_default_selection.y[i];

transform_matrix_transformPoint(*matrix, &x[i], &y[i]);

}

edgeL = min(min(x[0], x[1]), min(x[2], x[3]));

edgeR = max(max(x[0], x[1]), max(x[2], x[3]));

edgeB = min(min(y[0], y[1]), min(y[2], y[3]));

edgeT = max(max(y[0], y[1]), max(y[2], y[3]));

mx = (edgeL + edgeR) >> 1;

my = (edgeB + edgeT) >> 1;

cx = transform_default_selection.cx;

cy = transform_default_selection.cy;

w = abs(transform_default_selection.x[0] - transform_default_selection.x[2]) - 1;

h = abs(transform_default_selection.y[0] - transform_default_selection.y[2]) - 1;

color = transform_default_selection.color;

px = transform_default_selection.px;

py = transform_default_selection.py;

if(isSelecting)

{

if(isSelected)

{

for(i=0;i

{

for(j=0;j

{

gui_setPixel_2i1u(px[i][j], py[i][j], DRAW_COLOR_BLACK);

}

}

for(i=0;i

{

for(j=0;j

{

tx = px[i][j], ty = py[i][j];

transform_matrix_transformPoint(*matrix, &tx, &ty);

gui_setPixel_2i1u(tx, ty, color[i][j]);

}

}

if(isFinshed)

{

gui_saveCurrentImage();

isSelecting = 0;

isSelected = 0;

isMoving = 0;

isResizing = 0;

isRotating = 0;

isShearing = 0;

isFinshed = 0;

isMouseDown = 0;

w = abs(transform_default_selection.x[0] - transform_default_selection.x[2]) - 1;

h = abs(transform_default_selection.y[0] - transform_default_selection.y[2]) - 1;

for(i=0;i

{

free(transform_default_selection.color[i]);

free(transform_default_selection.px[i]);

free(transform_default_selection.py[i]);

}

free(transform_default_selection.color);

free(transform_default_selection.px);

free(transform_default_selection.py);

}

else

{

draw_line_4i(edgeL, edgeT, edgeR, edgeT);

draw_line_4i(edgeL, edgeB, edgeR, edgeB);

draw_line_4i(edgeL, edgeT, edgeL, edgeB);

draw_line_4i(edgeR, edgeT, edgeR, edgeB);

draw_dotted_line_4i(x[0], y[0], x[1], y[1]);

draw_dotted_line_4i(x[1], y[1], x[2], y[2]);

draw_dotted_line_4i(x[2], y[2], x[3], y[3]);

draw_dotted_line_4i(x[3], y[3], x[0], y[0]);

draw_rectangle_4i(edgeL - 3, edgeT - 3, edgeL + 3, edgeT + 3);

draw_rectangle_4i(edgeL - 3, edgeB - 3, edgeL + 3, edgeB + 3);

draw_rectangle_4i(edgeR - 3, edgeT - 3, edgeR + 3, edgeT + 3);

draw_rectangle_4i(edgeR - 3, edgeB - 3, edgeR + 3, edgeB + 3);

draw_rectangle_4i(edgeL - 3, my - 3, edgeL + 3, my + 3);

draw_rectangle_4i(mx - 3, edgeB - 3, mx + 3, edgeB + 3);

draw_rectangle_4i(edgeR - 3, my - 3, edgeR + 3, my + 3);

draw_rectangle_4i(mx - 3, edgeT - 3, mx + 3, edgeT + 3);

draw_circle_3i(cx, cy, 3);

if(isMoving)

{

gui_setMainWindowCursor(CURSOR_SIZEALL);

}

else if(isResizing)

{

switch(isResizing)

{

case POSITION_LEFT:

gui_setMainWindowCursor(CURSOR_SIZEWE);

break;

case POSITION_RIGHT:

gui_setMainWindowCursor(CURSOR_SIZEWE);

break;

case POSITION_TOP:

gui_setMainWindowCursor(CURSOR_SIZENS);

break;

case POSITION_BOTTOM:

gui_setMainWindowCursor(CURSOR_SIZENS);

break;

case POSITION_TOPLEFT:

gui_setMainWindowCursor(CURSOR_SIZENESW);

break;

case POSITION_TOPRIGHT:

gui_setMainWindowCursor(CURSOR_SIZENWSE);

break;

case POSITION_BOTTOMLEFT:

gui_setMainWindowCursor(CURSOR_SIZENWSE);

break;

case POSITION_BOTTOMRIGHT:

gui_setMainWindowCursor(CURSOR_SIZENESW);

break;

}

}

else if(isRotating)

{

gui_setMainWindowCursor(CURSOR_NO);

}

else if(isShearing)

{

switch(isShearing)

{

case POSITION_BOTTOM:

case POSITION_TOP:

gui_setMainWindowCursor(CURSOR_SIZEWE);

break;

case POSITION_LEFT:

case POSITION_RIGHT:

gui_setMainWindowCursor(CURSOR_SIZENS);

break;

}

}

}

}

else

{

gui_setMainWindowCursor(CURSOR_CROSS);

draw_dotted_line_4i(x[0], y[0], x[2], y[0]);

draw_dotted_line_4i(x[0], y[2], x[2], y[2]);

draw_dotted_line_4i(x[0], y[0], x[0], y[2]);

draw_dotted_line_4i(x[2], y[0], x[2], y[2]);

}

}

else

{

gui_setMainWindowCursor(CURSOR_CROSS);

}

draw_pen_setColor(penColor);

draw_brush_setColor(brushColor);

}

void transform_selection_mouseEvent(int32 state, int32 x, int32 y)

{

int32 i, j, w, h;

int32 rx[4], ry[4], mx, my, cx, cy;

int32 edgeL, edgeR, edgeB, edgeT;

double angle;

Transform_Matrix_9d *matrix = &transform_default_selection.transMatrix;

for(i=0;i<4;++i)

{

rx[i] = transform_default_selection.x[i];

ry[i] = transform_default_selection.y[i];

transform_matrix_transformPoint(*matrix, &rx[i], &ry[i]);

}

edgeL = min(min(rx[0], rx[1]), min(rx[2], rx[3]));

edgeR = max(max(rx[0], rx[1]), max(rx[2], rx[3]));

edgeB = min(min(ry[0], ry[1]), min(ry[2], ry[3]));

edgeT = max(max(ry[0], ry[1]), max(ry[2], ry[3]));

mx = (edgeL + edgeR) >> 1;

my = (edgeB + edgeT) >> 1;

cx = transform_default_selection.cx;

cy = transform_default_selection.cy;

switch(state)

{

case MOUSE_DOWN_LEFT:

isMouseDown = 1;

if(isSelected)

{

startX = x;

startY = y;

endX = x;

endY = y;

transform_matrix_copy(&startMatrix, *matrix);

if(isResizing)

{

switch(isResizing)

{

case POSITION_LEFT:

lastEdgeX = edgeR;

break;

case POSITION_RIGHT:

lastEdgeX = edgeL;

break;

case POSITION_BOTTOM:

lastEdgeY = edgeT;

break;

case POSITION_TOP:

lastEdgeY = edgeB;

break;

case POSITION_BOTTOMLEFT:

lastEdgeX = edgeR;

lastEdgeY = edgeT;

break;

case POSITION_BOTTOMRIGHT:

lastEdgeX = edgeL;

lastEdgeY = edgeT;

break;

case POSITION_TOPLEFT:

lastEdgeX = edgeR;

lastEdgeY = edgeB;

break;

case POSITION_TOPRIGHT:

lastEdgeX = edgeL;

lastEdgeY = edgeB;

break;

}

}

else if(isShearing)

{

switch(isShearing)

{

case POSITION_BOTTOM:

case POSITION_RIGHT:

lastEdgeX = edgeL;

lastEdgeY = edgeT;

break;

case POSITION_TOP:

case POSITION_LEFT:

lastEdgeX = edgeR;

lastEdgeY = edgeB;

break;

}

}

}

else

{

isSelecting = 1;

transform_default_selection.x[0] = x;

transform_default_selection.y[0] = y;

transform_default_selection.x[2] = x;

transform_default_selection.y[2] = y;

transform_matrix_init(&transform_default_selection.transMatrix);

}

break;

case MOUSE_UP_LEFT:

isMouseDown = 0;

if(isSelecting)

{

if(isSelected)

{

if(isMovingCenter || isMoving || isResizing || isRotating || isShearing)

{

return;

}

if(x < edgeL - 10 || x > edgeR + 10 || y < edgeB - 10 || y > edgeT + 10)

{

isFinshed = 1;

}

}

else

{

transform_default_selection.x[1] = x;

transform_default_selection.y[1] = ry[0];

transform_default_selection.x[3] = rx[0];

transform_default_selection.y[3] = y;

transform_default_selection.x[2] = x;

transform_default_selection.y[2] = y;

transform_default_selection.cx = (transform_default_selection.x[0] +

transform_default_selection.x[2]) >> 1;

transform_default_selection.cy = (transform_default_selection.y[0] +

transform_default_selection.y[2]) >> 1;

isSelected = 1;

w = abs(transform_default_selection.x[0] - transform_default_selection.x[2]) - 1;

h = abs(transform_default_selection.y[0] - transform_default_selection.y[2]) - 1;

transform_default_selection.color = (draw_color**)malloc(sizeof(draw_color*) * h);

transform_default_selection.px = (int32**)malloc(sizeof(int32*) * h);

transform_default_selection.py = (int32**)malloc(sizeof(int32*) * h);

for(i=0;i

{

transform_default_selection.color[i] = (draw_color*)malloc(sizeof(draw_color) * w);

transform_default_selection.px[i] = (int32*)malloc(sizeof(int32) * w);

transform_default_selection.py[i] = (int32*)malloc(sizeof(int32) * w);

for(j=0;j

{

transform_default_selection.color[i][j] = gui_getPixel(min(transform_default_selection.x[0], transform_default_selection.x[2]) + j + 1,

min(transform_default_selection.y[0], transform_default_selection.y[2]) + i + 1);

transform_default_selection.px[i][j] = min(transform_default_selection.x[0], transform_default_selection.x[2]) + j + 1;

transform_default_selection.py[i][j] = min(transform_default_selection.y[0], transform_default_selection.y[2]) + i + 1;

}

}

}

}

break;

case MOUSE_MOVE:

if(isSelecting)

{

if(isSelected)

{

if(isMouseDown)

{

if(isMovingCenter)

{

transform_default_selection.cx += x - endX;

transform_default_selection.cy += y - endY;

endX = x;

endY = y;

}

else if(isMoving)

{

transform_matrix_move(matrix, x - startX, y - startY);

transform_default_selection.cx += x - startX;

transform_default_selection.cy += y - startY;

startX = x;

startY = y;

}

else if(isResizing)

{

transform_matrix_copy(matrix, startMatrix);

switch(isResizing)

{

case POSITION_LEFT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, 0);

if(x > lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

transform_matrix_move(matrix, lastEdgeX, 0);

}

transform_default_selection.cx += (x - endX) * 0.5;

endX = x;

break;

case POSITION_RIGHT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, 0);

if(x < lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

transform_matrix_move(matrix, lastEdgeX, 0);

}

transform_default_selection.cx += (x - endX) * 0.5;

endX = x;

break;

case POSITION_BOTTOM:

if(startY != lastEdgeY && endY != lastEdgeY)

{

transform_matrix_move(matrix, 0, - lastEdgeY);

if(y > lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, 0, lastEdgeY);

}

transform_default_selection.cy += (y - endY) * 0.5;

endY = y;

break;

case POSITION_TOP:

if(startY != lastEdgeY && endY != lastEdgeY)

{

transform_matrix_move(matrix, 0, - lastEdgeY);

if(y < lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, 0, lastEdgeY);

}

transform_default_selection.cy += (y - endY) * 0.5;

endY = y;

break;

case POSITION_BOTTOMLEFT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, -lastEdgeY);

if(x > lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

if(y > lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

}

transform_default_selection.cx += (x - endX) * 0.5;

transform_default_selection.cy += (y - endY) * 0.5;

endX = x;

endY = y;

break;

case POSITION_BOTTOMRIGHT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, -lastEdgeY);

if(x < lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

if(y > lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

}

transform_default_selection.cx += (x - endX) * 0.5;

transform_default_selection.cy += (y - endY) * 0.5;

endX = x;

endY = y;

break;

case POSITION_TOPLEFT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, -lastEdgeY);

if(x > lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

if(y < lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

}

transform_default_selection.cx += (x - endX) * 0.5;

transform_default_selection.cy += (y - endY) * 0.5;

endX = x;

endY = y;

break;

case POSITION_TOPRIGHT:

if(startX != lastEdgeX && endX != lastEdgeX)

{

transform_matrix_move(matrix, - lastEdgeX, -lastEdgeY);

if(x < lastEdgeX)

{

transform_matrix_scale(matrix, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

else

{

transform_matrix_scale(matrix, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX), 1.0);

}

if(y < lastEdgeY)

{

transform_matrix_scale(matrix, 1.0, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

else

{

transform_matrix_scale(matrix, 1.0, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY));

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

}

transform_default_selection.cx += (x - endX) * 0.5;

transform_default_selection.cy += (y - endY) * 0.5;

endX = x;

endY = y;

break;

}

}

else if(isRotating)

{

transform_matrix_copy(matrix, startMatrix);

angle = atan2(y - cx, x - cy) - atan2(startY - cy, startX - cx);

transform_matrix_move(matrix, -cx, -cy);

transform_matrix_rotate(matrix, angle);

transform_matrix_move(matrix, cx, cy);

}

else if(isShearing)

{

switch(isShearing)

{

case POSITION_BOTTOM:

transform_matrix_copy(matrix, startMatrix);

transform_matrix_move(matrix, -lastEdgeX, -lastEdgeY);

if(x > lastEdgeX)

{

transform_matrix_shear(matrix, 0.0, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX) + 1.0);

}

else

{

transform_matrix_shear(matrix, 0.0, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX) + 1.0);

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

transform_default_selection.cx += x - endX;

endX = x;

break;

case POSITION_RIGHT:

transform_matrix_copy(matrix, startMatrix);

transform_matrix_move(matrix, -lastEdgeX, -lastEdgeY);

if(y < lastEdgeY)

{

transform_matrix_shear(matrix, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY) + 1.0, 0.0);

}

else

{

transform_matrix_shear(matrix, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY) + 1.0, 0.0);

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

transform_default_selection.cy += y - endY;

endY = y;

break;

case POSITION_TOP:

transform_matrix_copy(matrix, startMatrix);

transform_matrix_move(matrix, -lastEdgeX, -lastEdgeY);

if(x < lastEdgeX)

{

transform_matrix_shear(matrix, 0.0, - 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX) + 1.0);

}

else

{

transform_matrix_shear(matrix, 0.0, 1.0 * abs(x - lastEdgeX) / abs(startX - lastEdgeX) + 1.0);

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

transform_default_selection.cx += x - endX;

endX = x;

break;

case POSITION_LEFT:

transform_matrix_copy(matrix, startMatrix);

transform_matrix_move(matrix, -lastEdgeX, -lastEdgeY);

if(y > lastEdgeY)

{

transform_matrix_shear(matrix, - 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY) + 1.0, 0.0);

}

else

{

transform_matrix_shear(matrix, 1.0 * abs(y - lastEdgeY) / abs(startY - lastEdgeY) + 1.0, 0.0);

}

transform_matrix_move(matrix, lastEdgeX, lastEdgeY);

transform_default_selection.cy += y - endY;

endY = y;

break;

}

}

}

else

{

if(abs(x - cx) <= 4 && abs(y - cy) <= 4)

{

isMovingCenter = 1;

isMoving = 0;

isResizing = 0;

isRotating = 0;

isShearing = 0;

return;

}

if(abs(x - edgeL) <= 4 && abs(y - my) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_LEFT;

return;

}

if(abs(x - edgeR) <= 4 && abs(y - my) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_RIGHT;

return;

}

if(abs(x - mx) <= 4 && abs(y - edgeB) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_BOTTOM;

return;

}

if(abs(x - mx) <= 4 && abs(y - edgeT) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_TOP;

return;

}

if(abs(x - edgeL) <= 4 && abs(y - edgeT) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_TOPLEFT;

return;

}

if(abs(x - edgeL) <= 4 && abs(y - edgeB) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_BOTTOMLEFT;

return;

}

if(abs(x - edgeR) <= 4 && abs(y - edgeT) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_TOPRIGHT;

return;

}

if(abs(x - edgeR) <= 4 && abs(y - edgeB) <= 4)

{

isMovingCenter = 0;

isMoving = 0;

isRotating = 0;

isShearing = 0;

isResizing = POSITION_BOTTOMRIGHT;

return;

}

if(x > edgeL + 4 && x < edgeR - 4 && y > edgeB + 4 && y < edgeT - 4)

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 0;

isShearing = 0;

isMoving = 1;

return;

}

if((x > edgeR + 4 && x <= edgeR + 8 && y < edgeB - 4 && y >= edgeB - 8))

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 1;

isShearing = 0;

isMoving = 0;

return;

}

if(x >= edgeR - 4 && x < edgeR && y < edgeB - 4 && y >= edgeB - 8)

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 0;

isShearing = POSITION_BOTTOM;

isMoving = 0;

return;

}

if(x > edgeR + 4 && x <= edgeR + 8 && y <= edgeB + 4 && y > edgeB)

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 0;

isShearing = POSITION_RIGHT;

isMoving = 0;

return;

}

if(x > edgeL && x <= edgeL + 4 && y > edgeT + 4 && y <= edgeT + 8)

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 0;

isShearing = POSITION_TOP;

isMoving = 0;

return;

}

if(x > edgeL - 8 && x <= edgeL - 4 && y >= edgeT - 4 && y < edgeT)

{

isMovingCenter = 0;

isResizing = 0;

isRotating = 0;

isShearing = POSITION_LEFT;

isMoving = 0;

return;

}

isMovingCenter = 0;

isMoving = 0;

isResizing = 0;

isRotating = 0;

isShearing = 0;

}

}

else

{

transform_default_selection.x[2] = x;

transform_default_selection.y[2] = y;

}

}

break;

case MOUSE_DOWN_RIGHT:

if(isSelecting)

{

isSelecting = 0;

}

break;

}

}

void transform_selection_keyboardEvent(int32 key, int32 state)

{

switch(state)

{

case KEY_STATE_DOWN:

switch(key)

{

case KEY_VALUE_SHIFT:

isShiftDown = 1;

}

break;

case KEY_STATE_UP:

switch(key)

{

case KEY_VALUE_SHIFT:

isShiftDown = 0;

}

break;

}

}

c语言二维图形变换程序,【计算机图形学】3-2 二维几何变换根本代码相关推荐

  1. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

  2. c语言二维图形变换程序,C语言图形编程(五、二维图形变换-01)(国外英文资料).doc...

    C语言图形编程(五.二维图形变换-01)(国外英文资料) C语言图形编程(五.二维图形变换-01)(国外英文资料) The first user coordinates to the screen c ...

  3. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  4. 计算机图形学-二维图形变换 笔记总结与代码实战

    文章目录 1.向量基础知识 2.图形坐标系 3.二维图形变换原理 4.二维图形几何变换 5.窗口视区变换 基本二维几何变换代码 二维复合变换实战-五星红旗绘制 1.向量基础知识 为什么向量如此重要:在 ...

  5. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  6. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt

    计算机图形学 二维变换及二维 第三章 二维变换及二维观察 本章主要内容 3.1二维图形的基本变换 3.2窗口视图变换 3.3复合变换 3.4二维图形裁剪 3.5本章小结 3.1 二维图形的基本变换 3 ...

  7. CAD 实验4 二维图形变换

    实验4  二维图形变换   实验目的: (1)掌握二维几何图形变化的方法. (2)熟悉Windows窗口图形的生成方法. 实验环境与设备: 已安装Visual Studio 2010(或其以上版本)集 ...

  8. 计算机图形学实验一(二维图形绘制)

    计算机图形学实验一(二维图形绘制) 一.实验内容 二.实验环境 三.问题分析 四.算法设计 五.源代码 六.程序运行结果 一.实验内容 (1)绘制金刚石图案 金刚石图案的成图规则是:把一个圆周等分成n ...

  9. 计算机图形学二维图形基本变换实验原理,【实验课件】二维及三维图形基本变换的实现...

    实验二 二维及三维图形基本变换的实现 一.实验学时 4学时 二.实验类型 设计型实验 三.实验目的和要求 1. 掌握二维图形变换的原理,对一条直线实现二维基本变换(平移.错切.比例.旋转). 2. 掌 ...

最新文章

  1. 您能看出这个Double Check里的问题吗?(解答)
  2. 使用Cordova打包Vue项目为IOS并使用XCode提交到AppStore
  3. nginx中的location指令
  4. Artstudio Pro Mac(绘图与图片编辑软件)特别版
  5. 联想电脑无法正常开机常见现象和方案汇总(拯救者R7000)
  6. 设计模式之访问者模式(Vistor)
  7. Ext.Window
  8. AirTight C-65 系统启动日志
  9. 小红书都在研究的多模态学习 , 到底有多强?
  10. 手写小程序摇树优化工具(三)——遍历json文件
  11. css3书写cd播放器飘动音乐符号动画
  12. 大牛的《深度学习》笔记,Deep Learning速成教程
  13. 静态变量能被序列化吗?
  14. 百望云入选电子凭证会计数据标准深化试点服务保障单位 打通数字化“最后一公里”
  15. 内链接与外连接的区别
  16. 【原】简单的鼠标切换左右键(java版)
  17. Unity之动态加载播放外部mp3音频
  18. 河北计算机对口高考数学考试题,河北省对口招生考试数学模拟试题
  19. 韦东山嵌入式学习视频
  20. mysql 索引,以及sql优化总结

热门文章

  1. 如何判断一个类是否是线程安全(可重入)的?
  2. C语言中的标识符作用域
  3. c语言两种加法,两个超长正整数的加法
  4. 堆栈转化8进制_11张卡片学会进制转换
  5. 百度地图与所托瑞安达成深度合作 共同推进商用车安全智能驾驶领域创新
  6. 超详细!百度富媒体检索比对系统的关键技术
  7. mysql aa复制_MySQL主从复制实现
  8. Study 1 —— HTML5概述
  9. 利用WINDOWS活动目录提供LDAP的方案
  10. ES6——class