参考地址:http://blog.sina.com.cn/s/blog_915fafb10100zktb.html
问题:
一表盘刻度长均为表盘半径的
1/5
,时针长为表盘半径的
2/5
,分针长为表盘半径的
3/5,
刻度红色,指针绿色,要求用户输入表盘的时间,生成.dxf文件利用autocad读入并显示。
生成的.dxf文件只包含entities段。
代码如下:
#include<stdio.h>
#include<math.h>
const double PI=3.14159265358;
typedef struct
{
double x;
double y;
}POINT;
//红色
void LineDXF(FILE *fp, POINT start, POINT end)//刻度线
{
fprintf(fp,"0 \nLINE\n");
fprintf(fp,"8 \n0\n");
fprintf(fp,"62 \n1\n");
fprintf(fp,"10 \n%f\n20 \n%f\n11 \n%f\n21 \n%f\n",
start.x, start.y, end.x, end.y);
}
void CircleDXF(FILE *fp, POINT center, double radius)//圆盘
{
fprintf(fp,"0 \nCIRCLE\n");
fprintf(fp,"8 \n0\n");
fprintf(fp,"62 \n1\n");
fprintf(fp,"10 \n%f\n20 \n%f\n40 \n%f\n",
center.x, center.y, radius);//圆心和半径
}
//绿色
void LineDXFg(FILE *fp, POINT start, POINT end)//时针与分针
{
fprintf(fp,"0 \nLINE\n");
fprintf(fp,"8 \n0\n");
fprintf(fp,"62 \n3\n");
fprintf(fp,"10 \n%f\n20 \n%f\n11 \n%f\n21 \n%f\n",
start.x, start.y, end.x, end.y);//两点的横纵坐标
}
void main()
{
double h,m,r;//定义变量
int i;
POINT p1,p2;//定义点
FILE *fp;
printf("please input an number for the radius of the clock:");
scanf("%lf",&r);
printf("\nplease input an number for the method for hours:");
scanf("%lf",&h);
printf("\nplease input an number for the method for minutes:");
scanf("%lf",&m);
h=h+m/60;//对小时进行处理
fp = fopen("clock.dxf","w");
if(fp == NULL)
{
printf("Can not open this file !\n");
return;
}
fprintf(fp,"0\nSECTION\n");
fprintf(fp,"2\nENTITIES\n");
p1.x=0;p1.y=0;
CircleDXF(fp,p1,r);//表盘
for(i=0;i<12;i++)
{
p1.x=0.8*r*cos((90-30*double(i))*PI/180);
p2.x=r*cos((90-30*double(i))*PI/180);
p1.y=0.8*r*sin((90-30*double(i))*PI/180);
p2.y=r*sin((90-30*double(i))*PI/180);
LineDXF(fp,p1,p2);
}
//hour
p1.x=0;p1.y=0;
p2.x=0.4*r*cos((90-30*h)*PI/180);
p2.y=0.4*r*sin((90-30*h)*PI/180);
LineDXFg(fp,p1,p2);
//minute
p2.x=0.6*r*cos((90-6*m)*PI/180);
p2.y=0.6*r*sin((90-6*m)*PI/180);
LineDXFg(fp,p1,p2);
fprintf(fp,"0 \nENDSEC\n");
fprintf(fp,"0 \nEOF");
fclose(fp);
}
在黑框框里输入:radius=4, hour=3, minute=20,如下:
生成的.dxf文件,包含表盘的半径和时间,我输入的是半径4,3点20分。
AutoCAD读取后效果为: