图形旋转的C语言源程序

合集下载

俄罗斯方块 变形 c语言

俄罗斯方块 变形 c语言

俄罗斯方块变形c语言在C语言中实现俄罗斯方块游戏是一项复杂的任务,涉及到图形界面、游戏逻辑和事件处理等多个方面。

以下是一个简化版的俄罗斯方块游戏示例,使用字符在控制台中显示游戏界面。

c复制代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#define WIDTH 20#define HEIGHT 10typedef enum {BLOCK_EMPTY,BLOCK_I,BLOCK_J,BLOCK_L,BLOCK_O,BLOCK_S,BLOCK_Z} BlockType;typedef struct {BlockType type;int x;int y;} Block;Block board[WIDTH][HEIGHT];BlockType currentBlock = BLOCK_I;int rotation = 0;int x = WIDTH / 2;int y = HEIGHT - 1;void drawBoard() {for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < HEIGHT; j++) { char ch = ' ';switch (board[i][j].type) {case BLOCK_EMPTY:ch = '.';break;case BLOCK_I:ch = 'I';break;case BLOCK_J:ch = 'J';break;case BLOCK_L:ch = 'L';break;case BLOCK_O:ch = 'O';break;case BLOCK_S:ch = 'S';break;case BLOCK_Z:ch = 'Z';break;}printf("%c", ch);}printf("\n");}}void updateBoard() {for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {if (board[i][j].type != BLOCK_EMPTY) {board[i][j].y--; // Move block down one row.} else { // Place new block.switch (currentBlock) { // Place based on current block type.case BLOCK_I: // Place full I-block.board[i][j].type = BLOCK_I; // Column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column j Y n Row Y j Columns n - j 1 -- i 1 i - i j Row i Row i - 1 i Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i - - - - - - - - - - - - - - -。

用C++实现图像旋转变换

用C++实现图像旋转变换

这里主要讨论以图象的中心为圆心旋转。

旋转之后若要保持目标区域大小不变,则整幅图像变大;若要保持整幅图像的大小不变,则旋转出去的部分需要裁剪掉。

旋转前的图旋转后的图旋转后保持原图大小,转出的部分被裁掉以顺时针旋转为例来堆到旋转变换公式。

如下图所示。

旋转前:x0=rcosb;y0=rsinb旋转a角度后:x1=rcos(b-a)=rcosbcosa+rsinbsina=x0cosa+y0sinay 1=rsin(b-a)=rsinbcosa-rcosbsina=-xsina+ycosa矩阵形式为逆变换为上面的公式是以图像的左下角为原点旋转的。

现我们要以图像的中心为原点旋转。

因此需要先将坐标平移到图像中心,如下所示设图象的宽为w,高为h,容易得到:逆变换为现在可以分三步来完成旋转变换:1. 将坐标系x'o'y'平移到xoy ;2. 在xoy坐标系下作旋转变换;3.变换后将坐标系平移回原来位置。

用矩阵表示就是其中R表示旋转变换矩阵。

当旋转不改变图像大小时,T 与T' 互为逆矩阵;当旋转后图像变大时,T 与T'不是逆矩阵关系,因为图像变大了,第一次平移和第二次平移坐标系的距离不一样。

因此当图像变大时,公式应该如下:由于算法实现过程中我们需要的是逆变换的公式,因此我们只写出逆变换的表达式,如下:其中wn ,hn 表示新图像的宽和高,wo, ho 表示原图像的宽和高。

这样,对于新图中的每一点,我们就可以根据上面逆变换公式求出对应原图中的点,得到它的灰度。

如果超出原图范围,则设置为背景色。

要注意的是,由于有浮点运算,计算出来点的坐标可能不是整数,采用取整处理,即找最接近的点,这样会带来一些误差(图象可能会出现锯齿)。

更精确的方法是采用插值,这里暂不讨论。

C++代码如下:/** rotate.cpp* 图像旋转变换(顺时针)* Created on: 2011-10-10* Author: LiChanghai*/// 以图像中心为坐标原点,旋转后不改变图像大小// 函数返回值为指针,指向新申请的内存区域// 因为新图像大小改变了,需要返回新图像的尺寸// 因此形参的高度和宽度都采用指针变量#include<string.h>#include<stdlib.h>#include<cmath>#define pi 3.1415926535unsigned char* rotate(unsigned char*pImage, int*width, int*height, int biBitCount, float angle){//定义以图像中心为原点的坐标系下原图像和新图像的四个角点坐标float src_x1, src_y1, src_x2, src_y2, src_x3, src_y3, src_x4, src_y4;float dst_x1, dst_y1, dst_x2, dst_y2, dst_x3, dst_y3, dst_x4, dst_y4;//定义新图像的高度和宽度int wnew, hnew;//定义计算过程中需要的相关变量float sina, cosa, temp1, temp2, alpha;//角度转化为弧度alpha=pi*angle/180;cosa = float(cos(double(alpha)));sina = float(sin(double(alpha)));//原图像的四个角点的坐标src_x1 = float(-0.5*(*width)); src_y1 = float(0.5*(*height));src_x2 = float(0.5*(*width)); src_y2 = src_y1;src_x3 = src_x1; src_y3 = float(-0.5*(*height));src_x4 = src_x2; src_y4 = src_y3;//计算新图像的四个角点坐标dst_x1 = cosa*src_x1+sina*src_y1;dst_y1 = -sina*src_x1+cosa*src_y1;dst_x2 = cosa*src_x2+sina*src_y2;dst_y2 = -sina*src_x2+cosa*src_y2;dst_x3 = cosa*src_x3+sina*src_y3;dst_y3 = -sina*src_x3+cosa*src_y3;dst_x4 = cosa*src_x4+sina*src_y4;dst_y4 = -sina*src_x4+cosa*src_y4;//计算新图像的高度和宽度float t1 = fabs(dst_x4-dst_x1), t2 = fabs(dst_x3-dst_x2);wnew = int(t1>t2 ? t1:t2);t1 = fabs(dst_y4-dst_y1), t2 = fabs(dst_y3-dst_y2);hnew = int(t1>t2 ? t1:t2);// 计算旋转变换中的两个中间变量,便于以后计算temp1=float( -0.5*wnew*cosa+0.5*hnew*sina+0.5*(*width));temp2=float(-0.5*wnew*sina-0.5*hnew*cosa+0.5*(*height));//计算原图像和新图像每行像素所占的字节数(必须是4的倍数)int lineByte = ((*width) * biBitCount/8+3)/4*4;int lineByte2=(wnew * biBitCount/8+3)/4*4;//申请新的位图数据存储空间unsigned char*pImage2;pImage2=new unsigned char[lineByte2*hnew];//将新图像设置为背景色memset(pImage2, 0, lineByte2*hnew);//遍历新图像的每一个像素进行判断int x, y, x0, y0; // x0, y0为原图像中对应坐标for(y=0; y<hnew; y++)for(x=0; x<wnew; x++){x0= int(x*cosa-y*sina+temp1);y0= int(x*sina+y*cosa+temp2);//如果在原图像范围内则复制像素值if( (x0>=0) && (x0<(*width)) && (y0>=0) && (y0<(*height))){*(pImage2+lineByte2*y+x) = *(pImage+lineByte*y0+x0);}}//修改原图像的高度和宽度*width = wnew;*height = hnew;delete [ ] pImage; //释放原内存空间return pImage2;}该程序在Eclipse上调试通过,结果正确。

用C++实现图像旋转变换

用C++实现图像旋转变换

用C++实现图像旋转变换(代码较长,本人使用C++实现了一个类似GDI+ Matrix的C++几何变换类TransformMatrix。

略,参见我的BLOG文章《实现完整的图像平面几何变换》)。

我所说的“实现完整的图像平面几何变换”,是指可以通过TransformMatrix::Multiply函数或者更直接的变换矩阵成员设置去实现“完整的”图像几何变换,除非其不能使用平面几何变换矩阵进行描述(如梯形变换我就没想到怎么实现,也许其超出了平面几何变换矩阵范畴?),或者不能进行实际的几何变换(不可逆);“实现完整的图像几何变换”的另一层含义是下面的图像变换执行函数可实现TransformMatrix所能表示的任意图像几何变换,而不必去写一个个具体的,如缩放、旋转变换函数等。

C/C++ code// 获取子图数据BOOL GetSubBitmapData(CONST BitmapData *data, INT x, INT y, INT width, INT height, BitmapDa {if (x < 0){width += x;x = 0;}if (x + width > (INT)data->Width)width = (INT)data->Width - x;if (width <= 0) return FALSE;if (y < 0){height += y;y = 0;}if (y + height > (INT)data->Height)height = (INT)data->Height - y;if (height <= 0) return FALSE;sub->Width = width;sub->Height = height;sub->Stride = data->Stride;sub->Scan0 = (CHAR*)data->Scan0 + y * data->Stride + (x << 2);return TRUE;}// 执行图像数据几何变换VOID Transform(BitmapData *dest, INT x, INT y, CONST BitmapData *source, TransformMatrix *m {// 复制几何变换矩阵对象TransformMatrix m(matrix);// 几何变换矩阵绝对增加平移量x, ym.GetElements().dx += x;m.GetElements().dy += y;// 按几何变换矩阵计算并获取目标图像数据子数据float fx, fy, fwidth, fheight;m.GetTransformSize(source->Width, source->Height, fx, fy, fwidth, fheight);BitmapData dst;if (!GetSubBitmapData(dest, (INT)fx, (INT)fy,(INT)(fwidth + 0.999999f), (INT)(fheight + 0.999999f), &dst))return;// 获取几何变换逆矩阵if (!m.Invert()) return;// 如果子图数据与目标图像原点不一致,几何变换矩阵相对增加平移量fx, fyif (fx > 0.0f || fy > 0.0f){if (fx < 0.0f) fx = 0.0f;else if (fy < 0.0f) fy = 0.0f;m.Translate(fx, fy);}// 设置子图扫描线指针及行偏移宽度UINT *pix = (UINT*)dst.Scan0;INT dstOffset = (dst.Stride >> 2) - dst.Width;// 几何变换逆矩阵的平移量为与子图原点对应的源图起始坐标点MatrixElements e = m.GetElements();float xs = e.dx;float ys = e.dy;// 逐点计算并复制源图几何变换后的数据到目标子图for (y = 0; y < (INT)dst.Height; y ++, pix += dstOffset, xs += e.m21, ys += e.m22){float xs0 = xs;float ys0 = ys;for (x = 0; x < (INT)dst.Width; x ++, pix ++, xs0 += e.m11, ys0 += e.m12){INT x0 = xs0 < 0.0f? (INT)(xs0 - 0.5f) : (INT)(xs0 + 0.5f);INT y0 = ys0 < 0.0f? (INT)(ys0 - 0.5f) : (INT)(ys0 + 0.5f);if (y0 >= 0 && y0 < (INT)source->Height && x0 >= 0 && x0 < (INT)source->Width) *pix = *(UINT*)((CHAR*)source->Scan0 + y0 * source->Stride + (x0 << 2));}}}函数特点:1、可以实现任意的图像几何变换(只要TransformMatrix能正确表达的,即变换矩阵可逆);2、采用了GDI+ 的BitmapData结构(转换为32位ARGB像素格式),而并非任何具体的图像格式,保证了其通用性;3、函数使用浮点数运算,但在计算像素点位置时避免了通常的浮点数乘除运算,既提高了一定的运算速度,也为以后修改为定点数运算奠定了基础;4、函数采用临近像素插值,且没有边界像素处理代码,像素复制质量较差。

C++彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90°实现代码

C++彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90°实现代码

C++彩⾊图像(RGB)三通道直⽅图计算和绘制,图像逆时针旋转90°实现代码1 #include "iostream"2 #include "opencv2/opencv.hpp"3 #include "vector"45using namespace std;6using namespace cv;78/*计算真彩⾊图像的直⽅图*/9void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB);10void calImgHistPro(vector<Mat> imgrgb, vector<vector<int>>& histData);11void showImgHistPro(vector<vector<int>>& histD);12void rotateImgPro(Mat& img, float angle);13int main()14 {15 Mat imgSrc = imread("E:\\VideoPlateRecog\\ETC\\1008\\SRC\\144.bmp");16/*⾊彩空间分离*/17 vector<Mat> imgRGB;18 splitRgbImgPro(imgSrc, imgRGB);19/*计算三通道直⽅图*/20 vector<vector<int>> histData;21 calImgHistPro(imgRGB, histData);22/*绘制三通道直⽅图*/23 showImgHistPro(histData);2425 system("pause");26return0;27 }2829void calImgHistPro(vector<Mat> imgrgb,vector<vector<int>>& histData)30 {31 vector<Mat> imgrgbSrc = imgrgb;32int width = imgrgb[0].cols;33int height = imgrgb[0].rows;34for (int n = 0; n < imgrgb.size(); n++)35 {36 Mat imgSrc = imgrgbSrc[n].clone();37int img_sum = -1;38 vector<int> p(256);39for (int m = 0; m <p.size() ; m++)40 {41 p[m] = 0;42 }43for (int i = 0; i < height; i++)44 {45 uchar* ptr = imgSrc.ptr<uchar>(i);46for (int j = 0; j < width; j++)47 {48int k = ptr[j];49 p[k]++;50 }51 }52/*find max element of vector*/53for (auto it = p.begin(); it != p.end(); it++)54 {55if (*it > img_sum)56 {57 img_sum = *it;58 }59 }60for (int m = 0; m < 256; m++)61 {62 p[m] = p[m]*255 / img_sum;63 }64 histData.push_back(p);65 }66 }6768void showImgHistPro(vector<vector<int>>& histD)69 {70 vector<vector<int>> histSrc=histD;71int cols = histD[0].size();72int rows = -1;73 Mat histRGB(cols , cols * 3, CV_8UC1, Scalar(0));74for (int n = 0; n < histD.size(); n++)75 {76 vector<int> hist = histD[n];77 Mat histImg(cols, cols, CV_8UC1, Scalar(0));78for (int i = 0; i < cols; i++)79 {80 uchar* ptr = histImg.ptr(i);81for (int j = 0; j < hist[i]; j++)82 {83 ptr[j] = 255;84 }85 }86/*旋转90°*/87 Mat histImg1(cols, cols, CV_8UC1, Scalar(0));88for (int l = 0; l < cols; l++)89 {90for (int k = 0; k < cols; k++)91 {92 histImg1.at<uchar>(l, k) = histImg.at<uchar>(k, cols-l-1);93 }94 }95 histImg1.copyTo(histRGB(Rect(cols*n,0, cols, cols)));96 }97 imshow("Img_R_G_B", histRGB);98 waitKey(0);99 }100101void rotateImgPro(Mat& img,float angle)102 {103 Mat retMat(img.cols, img.rows, CV_8UC1, Scalar(0));104float anglePI = (float)(angle*CV_PI / 180);105int xSm, ySm;106for (int i = 0; i < retMat.rows; i++)107 {108for (int j = 0; j < retMat.cols; j++)109 {110 xSm = (int)((i - retMat.rows / 2)*cos(anglePI) -111 (j - retMat.cols / 2)*sin(anglePI) + 0.5);112 ySm = (int)((i - retMat.rows / 2)*sin(anglePI) +113 (j - retMat.cols / 2)*cos(anglePI) + 0.5);114 retMat.at<uchar>(i, j) = img.at<uchar>(xSm, ySm); 115116 }117 }118 }119120121122123void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB)124 {125 Mat imgSrc = img.clone();126int width = imgSrc.rows;127int height = imgSrc.cols;128 Mat imgR(width, height, CV_8UC1);129 Mat imgG(width, height, CV_8UC1);130 Mat imgB(width, height, CV_8UC1);131for (int i = 0; i < width; i++)132 {133 Vec3b* imgPtr = imgSrc.ptr<Vec3b>(i);134 uchar* imgSPtr = imgSrc.ptr<uchar>(i);135 uchar* imgRPtr = imgR.ptr<uchar>(i);136 uchar* imgGPtr = imgG.ptr<uchar>(i);137 uchar* imgBPtr = imgB.ptr<uchar>(i);138for (int j = 0; j < height; j++)139 {140 imgRPtr[j] = imgSPtr[0];141 imgGPtr[j] = imgSPtr[1];142 imgBPtr[j] = imgSPtr[2];143 imgSPtr += 3;144 }145 }146 imgRGB.push_back(imgR);147 imgRGB.push_back(imgG);148 imgRGB.push_back(imgB);149 }。

魔方程序C语言代码

魔方程序C语言代码

魔方程序C语言代码#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>//小方块的结构,包括小方块在x,y,z上的旋转角度,颜色数组下标,小方块的三维坐标。

struct rcube{int xr;int yr;int zr;int cl[6];GLfloat x;GLfloat y;GLfloat z;};struct rcube rc[3][3][3];struct rcube *temp[3][3];//颜色数组GLfloatcolor[6][3]={{1.0,0.0,0.0},{0.0,1.0,0.0}, {0.0,0.0,1.0},{1.0,1.0,0.0},{1.0,0.0,1.0},{0.0,1.0,1.0} };int tempc[3][3][6];//有关旋转的一些变量GLfloat xRot = 10.0f;GLfloat yRot = 10.0f;int rotateType=0;int rotateOK=0;int rotateRate=50;int rotate=0;///////////////////////////////////////// ////////////////////////////////////// //画小方块void drawcube(int cl[6]){glBegin(GL_QUADS);//右面glColor3fv(color[cl[0]]);glVertex3f(0.14f,-0.14f,-0.14f); glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);//左面glColor3fv(color[cl[1]]);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f); //前面glColor3fv(color[cl[2]]);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);//后面glColor3fv(color[cl[3]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f); //上面glColor3fv(color[cl[4]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,-0.14f);//下面glColor3fv(color[cl[5]]);glVertex3f(-0.14f,-0.14f,-0.14f); glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glEnd();glFlush();}//窗口刷新时被调用。

c语言,画矩形并使其旋转

c语言,画矩形并使其旋转

目录一、题目 (2)二、问题描述 (2)三、程序设计说明 (2)1、应用程序功能的详细说明 (2)2、应用程序的功能模块描述,各模块间的层次结构以及模块之间的信息交换说明 (3)3、算法设计 (3)4、参考文献 (3)四、程序流程图 (4)五、源程序代码 (5)六、运行结果 (7)七、结束语 (8)一、题目:在屏幕上画一个矩形要求:每按一次键盘,该矩形转动45度。

矩形的大小和转动的方向有键盘输入,并将输入的数据送文件保存,按回车键程序结束(功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制矩形)二、题目内容的描述:1、在屏幕上画一个矩形。

2、每按一次键盘,该矩形转动45度。

3、矩形的大小和转动的方向有键盘输入,并将输入的数据送文件保存,按回车键程序结束。

4、功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制矩形。

三、系统设计说明1、系统用到的功能分析:程序设计一般由两部分组成:算法设计和数据结构,合理地选择和实现一个程序结构和处理这些数据结构有同样的重要性,主要包括如下:#include<graphics.h> /*图形处理函数*/#include<math.h> /*插入数学头文件*/#include<stdio.h> /*标准库函数*/1、main主函数中调用scanf()函数,实现数据的输入,并通过调用save(),实现文件的保存,通过调用graphics.h画出正立的初始矩形。

2、save()文件写入函数前面讲到的数据输入和输出是以中端为对象的,当程序关闭后,数据也丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。

3、initgraph()画正立的初始矩形从主函数传入定义矩形的高与长,还有输入转向命令0或1,控制矩形左转或右转45度。

用initgraph(&GraphDriver,&GraphMode,“”)中的库文件来实现画矩形的算法。

c语言实现图像的旋转与平移

c语言实现图像的旋转与平移

实验二图象的几何变换参考资料1 平移平移(translation)变换是几何变换中最简单的一种。

初始坐标为(x0,y0)的点经过平移(t x,t y)(以向右,向下为正方向)后,坐标变为(x1,y1)。

这两点之间的关系是x1=x0+t x ,y1=y0+t y。

下面给出Translation的源代码。

算法的思想是先将所有区域填成白色,然后找平移后显示区域的左上角点(x0,y0) 和右下角点(x1,y1) ,分几种情况进行处理。

先看x方向(width指图象的宽度)(1)t x≤-width:很显然,图象完全移出了屏幕,不用做任何处理;(2)-width<tx≤0:图象区域的x范围从0到width-|tx|,对应原图的范围从|tx|到width;(3)0< t x <width:图象区域的x范围从t x到width,对应原图的范围从0到width - t x ;(4)t x≥width:图象完全移出了屏幕,不用做任何处理。

y方向是对应的(height表示图象的高度):(1)t y≤-height,图象完全移出了屏幕,不用做任何处理;(2)-height<t y≤0,图象区域的y范围从0到height-|t y|,对应原图的范围从|t y|到height;(3)0<t y<height ,图象区域的y范围从t y到height,对应原图的范围从0到height-t y;(4)t y≥height,图象完全移出了屏幕,不用做任何处理。

这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。

利用memcpy函数,从(x0,y0)点开始,一次可以拷贝一整行(宽度为x1-x0),然后将内存指针移到(x0,y0+1)处,拷贝下一行。

这样拷贝(y1-y0)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。

Translation的源代码如下:int xOffset=0,yOffset=0;BOOL Translation(HWND hWnd){DLGPROC dlgInputBox = NULL;DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData;LPSTR lpPtr;HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData;LPSTR lpTempPtr;int SrcX0,SrcY0,SrcX1,SrcY1;int DstX0,DstY0,DstX1,DstY1;int RectWidth,RectHeight;BOOL xVisible,yVisible;HDC hDc;HFILE hf;int i;//出现对话框,输入x偏移量xOffset,和y偏移量yOffsetdlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox,ghInst ); DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);FreeProcInstance ( (FARPROC) dlgInputBox );//OffBits为BITMAPINFOHEADER结构长度加调色板的大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHeight*LineBytes;//要开的缓冲区的大小//为新产生的位图分配缓冲区内存if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE; //失败,返回}//lpImgData为指向原来位图数据的指针lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//lpTempImgData为指向新产生位图数据的指针lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); lpPtr=(char *)lpImgData;lpTempPtr=(char *)lpTempImgData;//将新的缓冲区中的每个字节都填成255,这样以后未处理的象素就是白色memset(lpTempPtr,(BYTE)255,BufSize);//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板memcpy(lpTempPtr,lpPtr,OffBits);//xVisible为FALSE时,表示x方向已经移出了可显示的范围xVisible=TRUE;if( xOffset<= -bi.biWidth )xVisible=FALSE;else if( xOffset<=0){DstX0=0; //表示移动后,有图区域的左上角点的x坐标DstX1=bi.biWidth+xOffset; //表示移动后,有图区域的右下角点的x坐标}else if ( xOffset<bi.biWidth){DstX0=xOffset;DstX1=bi.biWidth;}elsexVisible=FALSE;SrcX0=DstX0-xOffset; //对应DstX0在原图中的x坐标SrcX1=DstX1-xOffset; //对应DstX1在原图中的x坐标RectWidth=DstX1-DstX0; //有图区域的宽度//yVisible为FALSE时,表示y方向已经移出了可显示的范围yVisible=TRUE;if( yOffset<= -bi.biHeight )yVisible=FALSE;else if( yOffset<=0){DstY0=0; //表示移动后,有图区域的左上角点的y坐标DstY1=bi.biHeight+yOffset; //表示移动后,有图区域的右下角点的y坐标}else if ( yOffset<bi.biHeight){DstY0=yOffset;DstY1=bi.biHeight;}elseyVisible=FALSE;SrcY0=DstY0-yOffset; //对应DstY0在原图中的y坐标SrcY1=DstY1-yOffset; //对应DstY1在原图中的y坐标RectHeight=DstY1-DstY0; //有图区域的高度if( xVisible && yVisible){ //x,y方向都没有完全移出可显示的范围for(i=0;i<RectHeight;i++){ //拷贝每一行//lpPtr指向要拷贝的那一行的最左边的象素对应在原图中的位//置。

计算机图形学 自行车 旋转平移 等代码

计算机图形学  自行车 旋转平移  等代码
glutAddMenuEntry("线框正四面体",1); //创建GLUT多面体绘制菜单
glutAddMenuEntry("实体正四面体",2);
glutAddMenuEntry("线框正八面体",3);
glutAddMenuEntry("实体正八面体",4);
int nGlutCurveMenu = glutCreateMenu(ProcessMenu); //创建GLUT曲面绘制菜单
setbkcolor(6);
/*画前轮*/
circle(x/2,y/2,30);
for(k=0;k<=360;k+=30){
line( x/2,y/2,x/2+30*cos((x/2+k)*0.01745),y/2+30*sin((x/2+k)*0.01745));}
/*画后轮*/
circle(x/2+100,y/2,30);
registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/
initgraph(&gd, &gm, "");
}
int main(void)
{ void *w1,*w2;
int i,k;
int x=500,y=300;
initgr(); /* BGI初始化*/
circle(x/2+20,y/2-90,4);
line(x/2+70,y/2-60,x/2+90,y/2-60);
w1=malloc(imagesize(x/2-130,y/2-90,x/2+130,y/2+30));

C语言图像旋转 放大 移动程序代码

C语言图像旋转 放大 移动程序代码
filename="D:\\d.jpg";//图像的地址
pImg = cvLoadImage(filename, 1);//载入图像
pImg_xz = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U,3); //创建图像
cvNamedWindow( "原图", 1 );//创建窗口
+q*((1.0-p)*data[(m+height_xz+1)*step+channels*(n+width_xz)]+p*data[(m+height_xz+1)*step+channels*(n+1+width_xz)]));
G=(int)((1.0-q)*((1.0-p)*data[(m+height_xz)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz)*step+channels*(n+1+width_xz)+1])
G=(int)((1.0-q)*((1.0-p)*data[(m+height_xz)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz)*step+channels*(n+1+width_xz)+1])
+q*((1.0-p)*data[(m+height_xz+1)*step+channels*(n+width_xz)+1]+p*data[(m+height_xz+1)*step+channels*(n+1+width_xz)+1]));

C语言使用OpenGL制作旋转地球

C语言使用OpenGL制作旋转地球

C语⾔使⽤OpenGL制作旋转地球前置步骤(安装依赖库):sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install libgl1-mesa-devsudo apt-get install libglu1-mesa-dev$sudo apt-get install freeglut3-devsudo apt-get install libfreeimage3 sudo apt-get install libfreeimage-dev1.测试OpenGL环境#include<GL/glut.h>void init(){glClearColor(0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glOrtho(-5, 5, -5, 5, 5, 15);gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);return ;}void display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0, 0);glutWireTeapot(3);glFlush();return;}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(0, 0);glutInitWindowSize(300, 300);glutCreateWindow("OpenGL #D View");init();glutDisplayFunc(display);glutMainLoop();return0;}编译:gcc test.c -o test -lGL -lGLU -lglut运⾏:如果能出现这个图⽚,证明环境配置成功。

C#图片动画效果(旋转360度)异步

C#图片动画效果(旋转360度)异步

C#图⽚动画效果(旋转360度)异步private void Button1_Click(object sender, EventArgs e){Graphics graphics = this.CreateGraphics();graphics.Clear(Color.White);//装⼊图⽚资源//Bitmap image = new Bitmap(WindowsFormsApplication1.Properties.Resources.image_101);Bitmap image = new Bitmap(HZH_Controls.Properties.Resources.alarm);//获取当前窗⼝的中⼼点Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);PointF center = new PointF(rect.Width / 2, rect.Height / 2);float offsetX = 0;float offsetY = 0;offsetX = center.X - image.Width / 2;offsetY = center.Y - image.Height / 2;//构造图⽚显⽰区域:让图⽚的中⼼点与窗⼝的中⼼点⼀致RectangleF picRect = new RectangleF(offsetX, offsetY, image.Width, image.Height);PointF Pcenter = new PointF(picRect.X + picRect.Width / 2,picRect.Y + picRect.Height / 2);Color c = Color.FromArgb(200, 200, 200);//让图⽚绕中⼼旋转⼀周for (int i = 360; i > 0; i -= 10){// 绘图平⾯以图⽚的中⼼点旋转graphics.TranslateTransform(Pcenter.X, Pcenter.Y);graphics.RotateTransform(i);//恢复绘图平⾯在⽔平和垂直⽅向的平移graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);//绘制图⽚并延时graphics.DrawImage(image, picRect);Thread.Sleep(100);graphics.Clear(c);//重置绘图平⾯的所有变换graphics.ResetTransform();}}以上代码是同步的,⽤户体验不好。

C++3D图形变换(含源码,下载后可复制黏贴使用)

C++3D图形变换(含源码,下载后可复制黏贴使用)

实验三 3D图形变换一.实验目的:掌握3D图像的变换,了解多数的3D变换,平移,旋转等几何变换,还有投影变换等知识。

二.实验原理:3D图像的移动,比例变化,旋转等几何变换算法原理及各种投影变换算法原理。

三.实验步骤:一.建立MFC单文档程序,用来编写3D变换。

二.建立Mainframe,并设计,添加相应的ID及映射函数。

三.实验的主要代码:1、设计3维图形平移变换算法的实现程序;void CMyView::OnTranslation(){m_Select=SEL_TS;m_str="平移";CBaseClass my1; //构造新的CBaseClass对象int i,j;for ( i=1;i<=4;++i){for ( j=1;j<=4;++j)my1.A[i][j]=0;}my1.A[1][1]=1;my1.A[2][2]=1;my1.A[4][4]=1;my1.A[3][3]=1;my1.A[4][1]=20; //x轴方向上平移my1.A[4][2]=28; //y轴方向上平移my1.A[4][3]=28; //z轴方向上平移my1.Draw();}2、设计3维图形缩放变换算法的实现程序;void CMyView::OnScalingS(){m_Select=SEL_MO;m_str="整体变比";CBaseClass my1; //构造新的CBaseClass对象int i,j;for ( i=1;i<=4;++i){for ( j=1;j<=4;++j)my1.A[i][j]=0;}my1.A[1][1]=1;my1.A[2][2]=1;my1.A[3][3]=1;my1.A[4][4]=0.5;my1.Draw();}void CMyView::OnScalingXyz(){m_Select=SEL_MO;m_str="XYZ变比";CBaseClass my1; //构造新的CBaseClass对象int i,j;for ( i=1;i<=4;++i){for ( j=1;j<=4;++j)my1.A[i][j]=0;}my1.A[1][1]=2; //x轴方向上比例my1.A[2][2]=1; //y轴方向上比例my1.A[3][3]=2; //z轴方向上比例my1.A[4][4]=1;my1.Draw();}3、设计3维图形旋转变换算法的实现程序。

C语言之图像旋转

C语言之图像旋转
*(pImgtemp + i*WidthIn + j) = *(pImgData*WidthIn + j); } } //memcpy(pImgtemp,pImgData,148*36); for (i = 0; i < HeightOut; i ++) { for (j = 0;j < WidthOut; j ++) {
int i, j; int WidthOut = HeightIn; int HeightOut = WidthIn; for (i = 0; i < HeightOut; i ++) {
for (j = 0;j < WidthOut; j ++) {
*(pImgOut + i*WidthOut + j) = *(pImgData + (HeightIn - j - 1)*WidthIn + i); } } }
int i, j, tempSize; int WidthOut = HeightIn; int HeightOut = WidthIn; unsigned char pImgtemp[148*36]; for (i = 0; i < HeightIn; i ++) {
for (j = 0;j < WidthIn; j ++) {
*(pImgData + i*WidthOut + j) = *(pImgtemp + (j+1)*WidthIn - 1 - i); } } }
2 向右旋转90°
//unsigned char *pImgData: 输入图像指针 //int WidthIn, int HeightIn:输入图像宽、高 //unsigned char *pImgOut: 旋转后图像指针 void RotateOfRight(unsigned char *pImgData, int WidthIn, int HeightIn, unsigned char *pImgOut) {

C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

C#图像处理(各种旋转、改变⼤⼩、柔化、锐化、雾化、底⽚、浮雕、⿊⽩、滤镜效果)⼀、各种旋转、改变⼤⼩注意:先要添加画图相关的using引⽤。

//向右旋转图像90°代码如下:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");//加载图像g.FillRectangle(Brushes.White, this.ClientRectangle);//填充窗体背景为⽩⾊Point[] destinationPoints = {new Point(100, 0), // destination for upper-left point of originalnew Point(100, 100),// destination for upper-right point of originalnew Point(0, 0)}; // destination for lower-left point of originalg.DrawImage(bmp, destinationPoints);}//旋转图像180°代码如下:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");g.FillRectangle(Brushes.White, this.ClientRectangle);Point[] destinationPoints = {new Point(0, 100), // destination for upper-left point of originalnew Point(100, 100),// destination for upper-right point of originalnew Point(0, 0)}; // destination for lower-left point of originalg.DrawImage(bmp, destinationPoints);}//图像切变代码:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");g.FillRectangle(Brushes.White, this.ClientRectangle);Point[] destinationPoints = {new Point(0, 0), // destination for upper-left point of originalnew Point(100, 0), // destination for upper-right point of originalnew Point(50, 100)};// destination for lower-left point of originalg.DrawImage(bmp, destinationPoints);}//图像截取:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");g.FillRectangle(Brushes.White, this.ClientRectangle);Rectangle sr = new Rectangle(80, 60, 400, 400);//要截取的矩形区域Rectangle dr = new Rectangle(0, 0, 200, 200);//要显⽰到Form的矩形区域g.DrawImage(bmp, dr, sr, GraphicsUnit.Pixel);}//改变图像⼤⼩:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");g.FillRectangle(Brushes.White, this.ClientRectangle);int width = bmp.Width;int height = bmp.Height;// 改变图像⼤⼩使⽤低质量的模式g.InterpolationMode = InterpolationMode.NearestNeighbor;g.DrawImage(bmp, new Rectangle(10, 10, 120, 120), // source rectanglenew Rectangle(0, 0, width, height), // destination rectangleGraphicsUnit.Pixel);// 使⽤⾼质量模式//positingQuality = CompositingQuality.HighSpeed;g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(bmp,new Rectangle(130, 10, 120, 120),new Rectangle(0, 0, width, height),GraphicsUnit.Pixel);}//设置图像的分辩率:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Bitmap bmp = new Bitmap("rama.jpg");g.FillRectangle(Brushes.White, this.ClientRectangle);bmp.SetResolution(300f, 300f);g.DrawImage(bmp, 0, 0);bmp.SetResolution(1200f, 1200f);g.DrawImage(bmp, 180, 0);}//⽤GDI+画图private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics gForm = e.Graphics;gForm.FillRectangle(Brushes.White, this.ClientRectangle);for (int i = 1; i <= 7; ++i){//在窗体上⾯画出橙⾊的矩形Rectangle r = new Rectangle(i*40-15, 0, 15,this.ClientRectangle.Height);gForm.FillRectangle(Brushes.Orange, r);}//在内存中创建⼀个Bitmap并设置CompositingModeBitmap bmp = new Bitmap(260, 260,System.Drawing.Imaging.PixelFormat.Format32bppArgb);Graphics gBmp = Graphics.FromImage(bmp);positingMode = positingMode.SourceCopy; // 创建⼀个带有Alpha的红⾊区域// 并将其画在内存的位图⾥⾯Color red = Color.FromArgb(0x60, 0xff, 0, 0);Brush redBrush = new SolidBrush(red);gBmp.FillEllipse(redBrush, 70, 70, 160, 160);// 创建⼀个带有Alpha的绿⾊区域Color green = Color.FromArgb(0x40, 0, 0xff, 0);Brush greenBrush = new SolidBrush(green);gBmp.FillRectangle(greenBrush, 10, 10, 140, 140);//在窗体上⾯画出位图 now draw the bitmap on our windowgForm.DrawImage(bmp, 20, 20, bmp.Width, bmp.Height);// 清理资源bmp.Dispose();gBmp.Dispose();redBrush.Dispose();greenBrush.Dispose();}//在窗体上⾯绘图并显⽰图像private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){Graphics g = e.Graphics;Pen blackPen = new Pen(Color.Black, 1);if (ClientRectangle.Height / 10 > 0){for (int y = 0; y < ClientRectangle.Height; y += ClientRectangle.Height / 10){g.DrawLine(blackPen, new Point(0, 0), new Point(ClientRectangle.Width, y));}}blackPen.Dispose();}C# 使⽤Bitmap类进⾏图⽚裁剪在Mapwin(⼿机游戏地图编辑器)⽣成的地图txt⽂件中添加⾃⼰需要处理的数据后转换成可在⼿机(Ophone)开发环境中使⽤的字节流地图⽂件的⼩⼯具,其中就涉及到图⽚的裁剪和⽣成了。

旋转矩阵转欧拉角 c语言 -回复

旋转矩阵转欧拉角 c语言 -回复

旋转矩阵转欧拉角c语言-回复如何使用C语言编写旋转矩阵转欧拉角的程序一、介绍旋转矩阵转欧拉角是计算机图形学中非常重要的一个概念。

通过将欧拉角转换为旋转矩阵,可以更方便地进行3D图形渲染、动画设计以及机器人运动控制等领域的开发工作。

本文将引导你一步一步地使用C语言编写一个旋转矩阵转欧拉角的程序。

二、概述旋转矩阵是一个3x3的矩阵,用于描述3D空间中的旋转操作。

欧拉角是一组表示物体在三个独立轴上旋转的角度值。

旋转矩阵转欧拉角的过程是一个数学计算过程,通过一系列的运算可以从旋转矩阵中提取出欧拉角的值。

下面是一个简单的流程图,表示旋转矩阵转欧拉角的计算过程:输入:3x3的旋转矩阵输出:三个轴上的欧拉角1. 计算矩阵的旋转角度2. 根据旋转角度,计算旋转轴3. 使用旋转角度和旋转轴,计算欧拉角4. 输出欧拉角接下来,我们将详细解释这一过程的每一步。

三、计算旋转角度在计算旋转角度之前,首先需要验证输入的矩阵是一个有效的旋转矩阵。

一个有效的旋转矩阵应满足以下条件:1. 矩阵是一个正交矩阵,即它的行向量和列向量都是单位向量,并且互相正交。

2. 矩阵的行列式为1。

如果输入的矩阵不满足上述条件,那么它可能是一个无效的矩阵,需要进行额外的处理。

计算旋转角度的方法有多种,其中一种常用的方法是通过计算旋转矩阵的迹(trace)来获取。

旋转矩阵的迹是其对角线上元素的和,具体计算公式如下:trace = R[0][0] + R[1][1] + R[2][2]通过迹的计算结果,我们可以进一步得到旋转角度的计算公式:angle = acos((trace - 1) / 2)四、计算旋转轴在获取旋转角度之后,下一步是计算旋转轴的方向。

旋转轴是一个单位向量,用于表示旋转发生的方向。

计算旋转轴的方法也有多种,其中一种常用的方法是通过计算旋转矩阵与其转置矩阵之差的叉积来获取。

具体计算公式如下:axis.x = R[2][1] - R[1][2]axis.y = R[0][2] - R[2][0]axis.z = R[1][0] - R[0][1]需要注意的是,在进行叉积计算之前,需要确保计算出的轴与旋转角度的符号是一致的。

ui c语言 旋转算法

ui c语言 旋转算法

ui c语言旋转算法Rotating an array is a common problem in programming, especiallyin the field of image processing and game development. The process involves shifting the elements of the array by a certain number of positions in either direction. This operation can be useful for various applications, such as rotating an image in a photo editing softwareor changing the orientation of objects in a game scene.数组旋转是编程中常见的问题,特别是在图像处理和游戏开发领域。

这个过程涉及将数组的元素向任何方向移动若干位置。

这种操作可以用于各种应用,例如在照片编辑软件中旋转图像或在游戏场景中更改对象的方向。

There are several ways to implement array rotation in C language, such as using a temporary array, reversing the array in parts, or using the reversal algorithm. Each approach has its advantages and disadvantages, depending on the size of the array, the number of rotations needed, and the efficiency requirements of the program. It is essential to choose the most suitable method based on these factors to ensure optimal performance and minimal overhead.在C语言中实现数组旋转有几种方式,比如使用临时数组、部分颠倒数组或使用颠倒算法。

C语言图形移动控制程序

C语言图形移动控制程序

初设计程序#include <stdio.h>// 输入输出函数#include<conio.h>#include <stdlib.h>// 动向储蓄分派函数void printMap(int map[][16]);void moveBox(int map[][16],int x,int y,int select); void printMap(int map[][16]){int i,j;for(i=0;i<14;i++){for(j=0;j<16;j++){switch(map[i][j]){case 0:// 墙printf(" ■");break;case 1:// 空地printf(" ");break;case 2:// 运动图形printf("☆");break;}}printf("\n");}printf("\n\n");printf(" 按方向键操作游戏,按Q 退出 !\n"); }void moveBox(int map[][16],int x,int y,int select) {int x1,y1;// 下个地点的坐标switch(select) {case 1: // 向上挪动x1 = x - 1;y1 = y;break;case 2: // 向左挪动x1 = x;y1 = y - 1;break;case 3: // 向右挪动x1 = x;y1 = y + 1;break;case 4: // 向下挪动x1 = x + 1;y1 = y;break;default:break;}switch(map[x1][y1]){case 0: // 碰到墙,不动break;case 1: // 内部空地,则互换map[x1][y1] = 2;map[x][y] = 1;break;default:break;}}int main(){int i,j;int x,y;// 人的地点char key;// 所按下的方向键int map[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0},{0,0,1,0,1,0,0,0,0,1,1,1,1,1,0,0},{0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0},{0,1,1,0,0,0,1,1,0,1,0,0,0,0,0,0},{0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0},{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},{0,0,0,1,1,1,1,2,1,1,1,1,1,1,0,0},{0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,0},{0,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };while(1){for(i=0;i<14;i++){for(j=0;j<16;j++)if(map[i][j] == 2)goto found;}found:x = i;y = j;system("cls");printMap(map);key=getch();if((key == 'Q') || (key =='q')){printf(" 退出 ...\n");return 2;}key = getch();switch(key){case 72: //上箭头 0x4800moveBox(map,x,y,1);break;case 75: //左箭头 0x4b00moveBox(map,x,y,2);break;case 77: //右箭头 0x4d00moveBox(map,x,y,3);break;case 80: //下箭头 0x5000moveBox(map,x,y,4);break;default:break;}}}优化后程序#include<windows.h>#include <stdio.h>// 输入输出函数#include<conio.h>#include <stdlib.h>// 动向储蓄分派函数void printMap(int map[][16]){int i,j;for(i=0;i<14;i++){for(j=0;j<16;j++){switch(map[i][j]){case 0:// 墙printf(" ■");break;case 1:// 空地printf(" ");break;case 2:// 运动图形printf("☆");break;}}printf("\n");}printf("\n\n");printf(" 按方向键操作游戏,按Q 退出 !\n");}void gotoxy(int x,int y){COORD c={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }void moveBox(int map[][16],int x,int y,int select){int x1,y1;// 下个地点的坐标switch(select) {case 1: // 向上挪动x1 = x - 1;y1 = y;break;case 2: // 向左挪动x1 = x;y1 = y - 1;break;case 3: // 向右挪动x1 = x;y1 = y + 1;break;case 4: // 向下挪动x1 = x + 1;y1 = y;break;default:break;}if(map[x1][y1]==1){map[x1][y1] = 2;map[x][y] = 1;gotoxy(2*y,x);printf(" ");gotoxy(2*y1,x1);printf(" ☆");}}int main(){int i,j;int x,y;// 人的地点char key;// 所按下的方向键int map[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0},{0,0,1,0,1,0,0,0,0,1,1,1,1,1,0,0},{0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0},{0,1,1,0,0,0,1,1,0,1,0,0,0,0,0,0},{0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0},{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},{0,0,0,1,1,1,1,2,1,1,1,1,1,1,0,0},{0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0},{0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,0},{0,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };printMap(map); // 输出初始界面while(1){for(i=0;i<14;i++){for(j=0;j<16;j++)if(map[i][j] == 2)goto found;}found:x = i;y = j;key=getch();if((key == 'Q') || (key =='q')){gotoxy(0,18);printf(" 退出 ...\n");return 2;}key = getch();switch(key){case 72: //上箭头 0x4800moveBox(map,x,y,1);break;case 75: //左箭头 0x4b00moveBox(map,x,y,2);break;case 77: //右箭头 0x4d00moveBox(map,x,y,3);break;case 80: //下箭头 0x5000moveBox(map,x,y,4);break;default:break;}}}#include <stdio.h>void main(){int map[10][10]={{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,1,1,1,1,1,0},{0,1,1,1,1,0,0,0,1,0},{0,1,0,0,1,0,1,0,1,0},{0,1,0,0,2,0,1,0,1,0},{0,1,0,0,0,1,1,1,1,0},{0,1,0,1,0,1,0,1,0,0},{0,1,0,1,0,1,0,1,0,0},{0,1,1,1,0,0,0,1,0,0},{0,0,0,0,0,0,0,0,0,0}};int x,y;for(x=0;x<10;x++){for(y=0;y<10;y++){if(map[x][y]==0)printf("■ ");else if(map[x][y]==1)printf("");else if(map[x][y]==2)printf(" ♀");}printf("\n");}}int main(){int key; // 所按下的方向键while(1){key = getch();if((key == 'Q') || (key =='q')){printf(" 退出 ...\n");return 2;}key = getch();switch(key){case 72: //上箭头 0x4800printf(" 向上方向键 \n");break;case 75: //左箭头 0x4b00printf(" 向左方向键 \n");break;case 77: //右箭头 0x4d00printf(" 向右方向键 \n");break;case 80: //下箭头 0x5000printf(" 向下方向键 \n");break;default:break;}}}。

C#图形编程

C#图形编程

C#图形编程摘要: 1 、旋转e.Graphics.RotateTransform(30.0F, MatrixOrder.Prepend);2、平移e.Graphics.TranslateTransform(100.0F, 0.0F);3、缩放e.Graphics.ScaleTransform(3.0F, 1.0F, MatrixOrder.Append);4、点坐标变换 e.Graphics.TranslateTr...posted @ 阿朵阅读(1319) |摘要: graphics.Isvisible(点、区域) :这些点,区域是否在绘图板的可见范围。

设置显⽰区域主要代码:graphics.SetClip(范围,显⽰模式)graphics.IntersetClip(⽤来相交的范围);//设置新范围为⽼范围和此输⼊范围的交集。

graphics.ResetClip();//重置[代码]范围可以为:1、指定区域graphics1.SetClip(new Recta...posted @ 阿朵阅读(970) |摘要: 绘制当前屏幕e.Graphics.CopyFromScreen(new Point(10,10)截屏起点, new Point(140, 140)绘制起点, new Size(100,100)截取⼤⼩, CopyPixelOperation.MergeCopy显⽰模式); 特殊的参数:当前窗⼝位置:this.Location全屏⼤⼩:Screen.GetWorkingArea(this).Size...posted @ 阿朵阅读(509) |摘要: 在实体建模软件中,经常有设置并保存各种参考坐标系的功能,⽅便建⽴模型。

C#绘图中也有这种类似功能。

不过没有建模软件那么强⼤。

实体建模软件中,可以独⽴的设置并保存各种坐标系,并随时调⽤。

⽽这⾥只能以嵌套的形式调⽤,当返回到上⼀级状态时,跳过的状态就不再保存了。

旋转矩阵转欧拉角 c语言

旋转矩阵转欧拉角 c语言

旋转矩阵转欧拉角c语言旋转矩阵转欧拉角(Euler angles)是计算机图形学中的一个常见问题。

然而,需要注意的是,欧拉角表示的旋转顺序和方向取决于你选择的轴(X,Y,Z)和旋转的顺序。

常见的顺序有XYZ,XYZ,ZYX,XYZ等。

此外,由于存在一些歧义,例如旋转角度的顺序和方向,所以在实际应用中,需要明确这些参数。

以下是一个简单的C语言函数,用于将旋转矩阵转换为欧拉角(以弧度为单位)。

这个函数假设输入的旋转矩阵是绕X-Y-Z轴按顺序旋转的,并且没有歧义。

```c#include<math.h>void rotationMatrixToEulerAngles(float m[3][3], float*roll,float*pitch,float*yaw){float cy=cosf(roll);float sy=sinf(roll);float cr=cosf(pitch);float sr=sinf(pitch);float cd=cosf(yaw);float sd=sinf(yaw);//the roll,pitch and yaw matrices are the unit matrices//except for the elements at the rotations' respective axesfloat m00=cy*cr;float m01=cy*sr;float m02=-sy;float m10=sy*cr;float m11=sy*sr;float m12=cy;float m20=-sr;float m21=cr;float m22=0;//compute the matrix product of the three rotation matricesfloatval00=m00*m11*m22+m01*m12*m20+m02*m 10*m21-m02*m11*m20-m00*m12*m21-m01 *m10*m22;floatval01=m00*m11*m20+m01*m12*m21+m02*m 10*m22-m02*m11*m22-m00*m12*m22-m01 *m10*m21;floatval02=m00*m12*m21+m01*m10*m22+m02*m 11*m20-m02*m12*m20-m00*m10*m22-m01 *m11*m20;floatval10=m00*m12*m22+m01*m10*m21+m02*m 11*m20-m02*m12*m20-m00*m10*m21-m01 *m11*m22;floatval11=cy*(cr*(cr*(cr+sr)-sr*(sr+cr))+sr*(sr*(sr+cr)-cr*(cr+sr)));floatval12=cy*(sr*(cr*(cr+sr)-sr*(sr+cr))-cr*(cr*(cr+sr)+ sr*(sr+cr)));floatval20=cy*(-sr*(sr*(sr+cr)+cr*(cr+sr))+cr*(-sr*(sr+c r)+cr*(cr+sr)));floatval21=cy*(-sr*(sr*(sr+cr)-cr*(cr+sr))-cr*(cr*(cr+sr) +sr*(sr+cr)));floatval22=cy*(-sr*(sr*(sr+cr)-cr*(cr+sr))+cr*(cr*(cr+sr) +sr*(sr+cr)));//solve for the Euler angles(using the ZXZ convention)if(val00>999999999){//if the matrix is close to the identity matrix(i.e.,no rotation)yaw=0;//any value is fine since there's no rotationpitch=atan(val21/val22);//arbitrary axis for no rotationroll=atan(-val20/val22);//arbitrary axis for no rotation}else{yaw=atan(val03/val33);//any non-。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图形旋转的C语言源程序/*****************************************************************/ /* CONVOLVE.C - Turbo C 2.0 implementation of image convolution *//* ---------- by Wesley G. Faler. All code is "as is". There *//* is NO copyright. Use this code as you will, and if you make *//* money at it, good for you. *//*****************************************************************/#include<stdlib.h>#include<stdio.h>#include<graphics.h>#include<alloc.h>#include<ctype.h>int load_cut(char *fname);int load_convolution_matrix(char *fname);int convolve_image(void);int swap_pictures(void);int minx,maxx,miny,maxy;int LOADPAGE=0;int ENHANCEPAGE=1;int *cmat, *pmat, *vmat;int cmx,cmy,cmnum;struct palettetype palette,newpal;int driver,mode;int cleancut=-1;int init_graphics(void){driver=DETECT; mode=0;detectgraph(&driver,&mode);if(driver==VGA) mode=VGAMED;initgraph(&driver,&mode,"");getpalette(&palette);getpalette(&newpal);}int cleanup_image(void){int i,j,num,x,y,k;if(cleancut<0) return;setactivepage(LOADPAGE);setvisualpage(ENHANCEPAGE);for(x=minx;x<maxx;x++) {for(y=miny;y<maxy;y++) {if(getpixel(x,y)!=0) num=-1;else num=0;for(j=-1;j<2;j++) {for(i=-1;i<2;i++) {if(getpixel(x+i,y+j)!=0) num++;}}if(num>cleancut) {k=getpixel(x,y);setactivepage(ENHANCEPAGE);putpixel(x,y,k);setactivepage(LOADPAGE);}}}k=ENHANCEPAGE; ENHANCEPAGE=LOADPAGE; LOADPAGE=k;}void show_test_image(void){int i;minx=cmx; miny=cmy;maxx=100+minx; maxy=100+miny;setcolor(1);moveto(minx,miny);randomize();for(i=0;i<20;i++)lineto(random(100)+minx,random(100)+miny);for(i=0;i<10;i++)fillellipse(random(50)+25+minx,random(50)+25+miny,random(25),random(25)); }main(){char fname[50];int flag=0;load_convolution_matrix("matrix.dat");printf(".CUT file (1) or test image (0)?");scanf("%d",&flag);flag= flag? 1:0;if(flag) {fflush(stdin);printf("filename to process:");gets(fname);}printf("Delete pixels with x or fewer neighbors. x="); scanf("%d",&cleancut);if(cleancut>8) cleancut=8;init_graphics();setactivepage(1); cleardevice();setactivepage(0); cleardevice();setactivepage(LOADPAGE); setvisualpage(LOADPAGE); if(flag) load_cut(fname);else show_test_image();cleanup_image();setvisualpage(ENHANCEPAGE);convolve_image();swap_pictures();restorecrtmode();}int toggle_colors(char c){c=tolower(c);c=c-'a';if(c<0 || c>=palette.size) return 0;newpal.colors[c]= palette.colors[c]-newpal.colors[c]; setpalette(c,newpal.colors[c]);return 1;}int swap_pictures(void){int mode=0;char a;setvisualpage(LOADPAGE);for(;;) {a=getch();if(a==27) return;if(toggle_colors(a)) continue;if(mode==0) setvisualpage(ENHANCEPAGE);if(mode==1) setvisualpage(LOADPAGE);mode=1-mode;}}int convolve_image(void){int i,j,k,nval;int *vx, *vy, *c;int colmax,offset,end,midy;char **lines=NULL;char *temp=NULL;offset=-minx+(cmx/2);end=cmy-1; midy=cmy/2;lines=(char **)malloc(cmy*sizeof(char *));for(i=0;i<cmy;i++) lines[i]=(char *)malloc(sizeof(char)*(maxx-minx+cmx+1)); setactivepage(LOADPAGE);for(j=-cmy/2;j<cmy/2;j++) {for(i=minx-cmx/2;i<(maxx+cmx/2+1);i++) {lines[j+midy][i+offset]=getpixel(i,j+miny);}}colmax=getmaxcolor();for(j=miny;j<maxy;j++) {setactivepage(LOADPAGE);for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;k<nval;k++)lines[end][k+offset]=getpixel(k,i);for(i=minx;i<maxx;i++) {/* Load & multiply neighbors into matrix */setactivepage(LOADPAGE);vx=vmat; vy=vmat+1; c=cmat; nval=0;for(k=0;k<cmnum;k++) {if(*c) nval+= lines[(*vy)+midy][i+(*vx)+offset]*(*c);/* if(*c) nval+= getpixel(i+(*vx),j+(*vy)) * (*c); */c++;vx+=2; vy+=2;/* Cut off values too high or too low */if(nval<0) nval=0;if(nval>colmax) nval=colmax;/* Place new pixel value */ setactivepage(ENHANCEPAGE);putpixel(i,j,nval);}if(kbhit()) { getch(); break; }/* rotate line pointers */temp=lines[0];for(i=1;i<cmy;i++) lines[i-1]=lines[i];lines[end]=temp;}for(i=0;i<cmy;i++) {if(lines[i]!=NULL) free(lines[i]);}if(lines!=NULL) {free(lines);}return;}int build_offset_vectors(void){int *t;int il,im,jl,jm,i,j;il=-cmx/2; im=cmx+il;jl=-cmy/2; jm=cmy+jl;t=vmat;for(j=jl;j<jm;j++) {for(i=il;i<im;i++) {*t++=i; *t++=j;}}}int load_convolution_matrix(char *fname) {/* Layout of matrix file:#x #yx0y0 x1y0 ... xny1.... .... ... ....x0ym x1ym ... xnym*/FILE *mf;int *t;int i,j,im,jm;if( (mf=fopen(fname,"rt"))==NULL ) {printf("Cannot load matrix file.\n");abort();}fscanf(mf,"%d%d",&im,&jm);if( (im&1)==0 || (jm&1)==0 ) {printf("Convolution matrix MUST have a center point.\n"); abort();}if( (cmat=(int *)calloc(im*jm,sizeof(int)))==NULL ) {printf("Unable to calloc convolution matrix.\n");abort();}if( (vmat=(int *)calloc(2*im*jm,sizeof(int)))==NULL ) { printf("Unable to calloc offset vector matrix.\n");abort();}cmx=im; cmy=jm; cmnum=im*jm;t=cmat;for(j=0;j<jm;j++) {for(i=0;i<im;i++) {if( fscanf(mf,"%d",t++)!=1 ) {printf("Unable to read matrix.\n");abort();}}}fclose(mf);build_offset_vectors();}int load_cut(char *fname){static unsigned char st[3000];char *sp=st,*spend;int stp=0;int width,height;FILE *fp;int x,y,xl,yl;int i,n,len,d,j;fp=fopen(fname,"rb");width=getw(fp); height=getw(fp);xl=cmx; yl=cmy;minx=xl; miny=yl;maxx=xl+width; maxy=yl+height;if(maxy>(getmaxy()-cmy)) {maxy=getmaxy()-cmy;height=maxy-yl;}getw(fp);y=yl-1;for(sp=st,n=0;n<height;n++) {stp=getw(fp);for(sp=st,spend=st+stp;sp<spend;) *sp++=getc(fp); sp=st; spend=sp+stp; x=xl; y++;while(sp<spend) {if(*((unsigned char *)sp)>0x80) {len=(*sp++) & 0x7f;if(!(*sp)) { x+=len; continue; }setcolor(*sp++);moveto(x,y);linerel(len,0);x+=len;continue;} else {len=*sp++;for(j=0;j<len;j++) putpixel(x++,y,*sp++); continue;}}}fclose(fp);}。

相关文档
最新文档