求C语言编程
△ABC其合各顶点坐标分别为A(50,50),B(100,50),C(50,70)。画出该三角形绕点X(20,30)逆时针旋转90°后的图形。谢谢各位大神...
△ABC其合各顶点坐标分别为A(50,50),B(100,50),C(50,70)。画出该三角形绕点X(20,30)逆时针旋转90°后的图形。谢谢各位大神
展开
展开全部
哦。难度不大,PS 本人数学还可以啦。哈哈,就是逆时针旋转后,3个坐标点已经超出了屏幕的显示范围:
我给楼主详细解释下吧:
大学线性代数里有坐标系统转换的。有了这个公式剩下的就是C绘图了。
知识点1:平面上一点X1,Y1,绕一点P(x0,y0)旋转任意角度A后,新坐标(X2,Y2)的计算公式入下:
x2=(y1-y0)*sina°+(x1-x0)*cosa°
y2=(y1-y0)*cosa°-(x1-x0)*sina°
知识点2:如果C语言绘图模式无法显示你的坐标。屏幕做左上角是0,0,那么你可以讲你的坐标系移动到一个相对位置,这个就是moverel(x,y)函数。
我的代码移动了200,200,这样你旋转后的新三角形式可以显示的。
知识点3:sin函数和cos函数的应用。里面的参数要把角度换成弧度制
角度*3.1415926/180
花了点时间给你写了一个,代码敲的辛苦啊。很多年不用C了。
代码如下:
#include<graphics.h>
#include<math.h>
#define PI 3.1415926
void changZuoBiao(double x1,double y1,double px,double py,double angle,double a[2])
{
a[0]=(y1-py)*sin((double)(angle*PI/180.0))+(x1-px)*cos((double)(angle*PI/180.0));
a[1]=(y1-py)*cos((double)(angle*PI/180.0))-(x1-px)*sin((double)(angle*PI/180.0));
}
void main()
{
double aNew[2],bNew[2],cNew[2];/*¡ä?¡¤?D?¦Ì?¡Áa??o¨®¦Ì?¡Á?¡À¨º*/
double angle=-90;
int DetaX=200;
int driver,mode;
int i;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
setcolor(2);
line(50+DetaX,50+DetaX,100+DetaX,50+DetaX);
line(50+DetaX,50+DetaX,50+DetaX,70+DetaX);
line(100+DetaX,50+DetaX,50+DetaX,70+DetaX);
changZuoBiao(50,50,20,30,angle,aNew);
changZuoBiao(50,70,20,30,angle,bNew);
changZuoBiao(100,50,20,30,angle,cNew);
line(aNew[0]+DetaX,aNew[1]+DetaX,bNew[0]+DetaX,bNew[1]+DetaX);
line(aNew[0]+DetaX,aNew[1]+DetaX,cNew[0]+DetaX,cNew[1]+DetaX);
line(bNew[0]+DetaX,bNew[1]+DetaX,cNew[0]+DetaX,cNew[1]+DetaX);
getch();
getch();
getch();
getch();
restorecrtmode();
}
代码的思路很清晰:
changZuoBiao(x1,y1,x2,y2,angle,a[2])
{
}
就是把x1,y1这一点绕x2,y2,旋转angle角度后的新坐标放在a[0]和a[1]中.
Dev-C++,TC2.0编译通过。
全屏模式不方便截图:图略
详细问题可以继续向我咨询。
代码敲的辛苦,楼主早日结题。祝福楼主好运!
我给楼主详细解释下吧:
大学线性代数里有坐标系统转换的。有了这个公式剩下的就是C绘图了。
知识点1:平面上一点X1,Y1,绕一点P(x0,y0)旋转任意角度A后,新坐标(X2,Y2)的计算公式入下:
x2=(y1-y0)*sina°+(x1-x0)*cosa°
y2=(y1-y0)*cosa°-(x1-x0)*sina°
知识点2:如果C语言绘图模式无法显示你的坐标。屏幕做左上角是0,0,那么你可以讲你的坐标系移动到一个相对位置,这个就是moverel(x,y)函数。
我的代码移动了200,200,这样你旋转后的新三角形式可以显示的。
知识点3:sin函数和cos函数的应用。里面的参数要把角度换成弧度制
角度*3.1415926/180
花了点时间给你写了一个,代码敲的辛苦啊。很多年不用C了。
代码如下:
#include<graphics.h>
#include<math.h>
#define PI 3.1415926
void changZuoBiao(double x1,double y1,double px,double py,double angle,double a[2])
{
a[0]=(y1-py)*sin((double)(angle*PI/180.0))+(x1-px)*cos((double)(angle*PI/180.0));
a[1]=(y1-py)*cos((double)(angle*PI/180.0))-(x1-px)*sin((double)(angle*PI/180.0));
}
void main()
{
double aNew[2],bNew[2],cNew[2];/*¡ä?¡¤?D?¦Ì?¡Áa??o¨®¦Ì?¡Á?¡À¨º*/
double angle=-90;
int DetaX=200;
int driver,mode;
int i;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
setcolor(2);
line(50+DetaX,50+DetaX,100+DetaX,50+DetaX);
line(50+DetaX,50+DetaX,50+DetaX,70+DetaX);
line(100+DetaX,50+DetaX,50+DetaX,70+DetaX);
changZuoBiao(50,50,20,30,angle,aNew);
changZuoBiao(50,70,20,30,angle,bNew);
changZuoBiao(100,50,20,30,angle,cNew);
line(aNew[0]+DetaX,aNew[1]+DetaX,bNew[0]+DetaX,bNew[1]+DetaX);
line(aNew[0]+DetaX,aNew[1]+DetaX,cNew[0]+DetaX,cNew[1]+DetaX);
line(bNew[0]+DetaX,bNew[1]+DetaX,cNew[0]+DetaX,cNew[1]+DetaX);
getch();
getch();
getch();
getch();
restorecrtmode();
}
代码的思路很清晰:
changZuoBiao(x1,y1,x2,y2,angle,a[2])
{
}
就是把x1,y1这一点绕x2,y2,旋转angle角度后的新坐标放在a[0]和a[1]中.
Dev-C++,TC2.0编译通过。
全屏模式不方便截图:图略
详细问题可以继续向我咨询。
代码敲的辛苦,楼主早日结题。祝福楼主好运!
追问
帅哥 你能把文件发到我的邮箱吗?
后两种java C#能一起给我吗?
我的邮箱是coke0427@163.com
展开全部
/*
编程的思想:
1、首先我们做的只是旋转,而且是90度的旋转,所以原始图形没有发生变形,只是各个定点位置发生变化
2、旋转为90度,所以可以先求的原始矢量与x轴的夹角,再运算a角度
3、是逆时针旋转,但是我们对一个点针对另外一点旋转90度,我们会发现如果被旋转点的x,y与旋转点x0,y0,x1, y1的关系如下
x1 = x0+len*cos(a);
y1 = y0+len*sin(a);
其中a是原始向量(旋转中心到被旋转点的矢量)与x轴的夹角A与旋转角度B的运算结果,其中如果做的是逆时针旋转则a=A+B,如果是顺时针则a=A-B。可以通过自己画图看出;len是旋转中心点到被旋转点的长度
根据编程实现之
*/
#include <stdio.h>
#include <math.h>
#define PI atan(1)*4
typedef struct _Point
{
double x; //点的x坐标值
double y; //点的y坐标值
}POINT, pPoint;
void XuanZhuan(POINT ptA[], POINT ptB[], POINT pt); //进行旋转,并将旋转结果存储在ptB中
float getLength(POINT pt1, POINT pt2); //得到pt1到pt2的直线距离
void getPt(POINT pt1, POINT * pt2, POINT pt);
int main(void)
{
int i=0;
//获取旋转中心点的坐标值
POINT pt;
printf("请输入旋转中心点的坐标:\n");
scanf("%lf %lf", &pt.x, &pt.y);
//获取旋转三角形的信息
POINT A[3], B[3]; //A存储原始的三角形顶角信息,B存储旋转三角形顶角信息
for(i=0; i<3; i++)
{
printf("请输入第 %d 个顶角的坐标值,中间以空格隔开, 比如50 50\n", i+1);
scanf("%lf %lf", &A[i].x, &A[i].y);
}
//显示三角形的信息
printf("原始三角形各顶点信息如下:\n");
for(i=0; i<3; i++)
{
printf("Tang %d info: x=%.3f, y=%.3f\n", i+1, A[i].x, A[i].y);
}
XuanZhuan(A, B, pt);
printf("旋转三角形各顶点信息如下:\n");
for(i=0; i<3; i++)
{
printf("Tang %d info: x=%.3f, y=%.3f\n", i+1, B[i].x, B[i].y);
}
return 0;
}
void XuanZhuan(POINT ptA[], POINT ptB[], POINT pt)
{
int i;
for(i=0; i<3; i++)
{
getPt(*(ptA+i), ptB+i, pt);
}
return;
}
float getLength(POINT pt1, POINT pt2)
{
double res;
res = sqrt( (pt1.x-pt2.x)*(pt1.x-pt2.x) + (pt1.y-pt2.y)*(pt1.y-pt2.y) );
return (float)res;
}
void getPt(POINT pt1, POINT * pt2, POINT pt)
{
float len;
double a; //a表示角度(pt->pt1)
len = getLength(pt1, pt);
if(pt.x ==pt1.x)
{
if(pt1.y>pt.y)
a=PI/2;
else
a=3*PI/2;
}
else
a = atan((pt1.y-pt.y)/(pt1.x-pt.x));
a += PI/2;
(*pt2).x = pt.x+len*cos(a);
(*pt2).y = pt.y+len*sin(a);
return ;
}
编程的思想:
1、首先我们做的只是旋转,而且是90度的旋转,所以原始图形没有发生变形,只是各个定点位置发生变化
2、旋转为90度,所以可以先求的原始矢量与x轴的夹角,再运算a角度
3、是逆时针旋转,但是我们对一个点针对另外一点旋转90度,我们会发现如果被旋转点的x,y与旋转点x0,y0,x1, y1的关系如下
x1 = x0+len*cos(a);
y1 = y0+len*sin(a);
其中a是原始向量(旋转中心到被旋转点的矢量)与x轴的夹角A与旋转角度B的运算结果,其中如果做的是逆时针旋转则a=A+B,如果是顺时针则a=A-B。可以通过自己画图看出;len是旋转中心点到被旋转点的长度
根据编程实现之
*/
#include <stdio.h>
#include <math.h>
#define PI atan(1)*4
typedef struct _Point
{
double x; //点的x坐标值
double y; //点的y坐标值
}POINT, pPoint;
void XuanZhuan(POINT ptA[], POINT ptB[], POINT pt); //进行旋转,并将旋转结果存储在ptB中
float getLength(POINT pt1, POINT pt2); //得到pt1到pt2的直线距离
void getPt(POINT pt1, POINT * pt2, POINT pt);
int main(void)
{
int i=0;
//获取旋转中心点的坐标值
POINT pt;
printf("请输入旋转中心点的坐标:\n");
scanf("%lf %lf", &pt.x, &pt.y);
//获取旋转三角形的信息
POINT A[3], B[3]; //A存储原始的三角形顶角信息,B存储旋转三角形顶角信息
for(i=0; i<3; i++)
{
printf("请输入第 %d 个顶角的坐标值,中间以空格隔开, 比如50 50\n", i+1);
scanf("%lf %lf", &A[i].x, &A[i].y);
}
//显示三角形的信息
printf("原始三角形各顶点信息如下:\n");
for(i=0; i<3; i++)
{
printf("Tang %d info: x=%.3f, y=%.3f\n", i+1, A[i].x, A[i].y);
}
XuanZhuan(A, B, pt);
printf("旋转三角形各顶点信息如下:\n");
for(i=0; i<3; i++)
{
printf("Tang %d info: x=%.3f, y=%.3f\n", i+1, B[i].x, B[i].y);
}
return 0;
}
void XuanZhuan(POINT ptA[], POINT ptB[], POINT pt)
{
int i;
for(i=0; i<3; i++)
{
getPt(*(ptA+i), ptB+i, pt);
}
return;
}
float getLength(POINT pt1, POINT pt2)
{
double res;
res = sqrt( (pt1.x-pt2.x)*(pt1.x-pt2.x) + (pt1.y-pt2.y)*(pt1.y-pt2.y) );
return (float)res;
}
void getPt(POINT pt1, POINT * pt2, POINT pt)
{
float len;
double a; //a表示角度(pt->pt1)
len = getLength(pt1, pt);
if(pt.x ==pt1.x)
{
if(pt1.y>pt.y)
a=PI/2;
else
a=3*PI/2;
}
else
a = atan((pt1.y-pt.y)/(pt1.x-pt.x));
a += PI/2;
(*pt2).x = pt.x+len*cos(a);
(*pt2).y = pt.y+len*sin(a);
return ;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
语言的真题笔试试卷及答案与分析和上机模拟试题和详尽的答案与分析等大量的学习资源。另外 “编程日记” 功能可以让你记录你的 C 语言学习历程, “资料管理,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把所求坐标投到数组里 然后输出
请问是控制台程序么
请问是控制台程序么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-03-24
展开全部
额,这个有难度
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询