[轉]C語言圖形程式設計(六) -圖形程式設計例項:零件圖形的繪製
阿新 • • 發佈:2019-02-04
第一框 輸入資料,用下面一個函式實現:
void Enterdata()
{
clrscr();
gotoxy(1,6);
printf("Enter the radius of the circles./n");
gotoxy(1,8);
printf(Enter in_circle radius(>=12.5):/n");
scanf("%f",&Ri);
printf("Enter out_circle radius(>=25.0):/n");
scanf(%f",&Ro);
printf("Enter convex_circle radius(=10.0):/n");
scanf("%f",&Rc);
}
第二框畫基準線與圓心線,可由下面的函式完成:
void Base_Center_Line()
{
flost dash_R;
desh_R=(4*Ro+Ri)/5; // 三個小圓圓心所在的點劃圓半徑
u1=((4*Ro+Ri)/5)*cos(-30*0.017453); // 確定三個小圓圓心座標
v1=((4*Ro+Ri)/5)*sin(-30*0.017453);
u2=0.0; // ((4*Ro+Ri)/5)*cos(90*0.017453)
v2=((4*Ro+Ri)/5); // ((4*Ro+Ri)/5)*sin(90*0.017453)
u3=((4*Ro+Ri)/5)*cos(210*0.017453);
v3=((4*Ro+Ri)/5)*sin(210*0.017453);
line(mmaxx-Ro-Rc,mmaxy,mmaxx-(Ro+Rc)/2,mmaxy; // 畫基準線
line(mmaxx-(Ro+Rc)/2+5,mmaxy,mmaxx-(Ro+Rc)/2+5,mmaxy);
line(mmaxx-(Ro+Rc)/2+10,mmaxy,mmaxx-(Ro+Rc)/2,mmaxy);
line(mmaxx+(Ro+Rc)/2+5,mmaxy,mmaxx-(Ro+Rc)/2+5,mmaxy);
line(mmaxx+(Ro+Rc)/2+10,mmaxy,mmaxx+Ro+Rc,mmaxy);
line(mmaxx,mmaxy+Ro+Rc,mmaxx,mmaxy+(Ro+Rc)/2+10);
line(mmaxx,mmaxy+(Ro+Rc)/2+5,mmaxx,mmaxy+(Ro+Rc)/2+5);
line(mmaxx,mmaxy+(Ro+Rc)/2,mmaxx,mmaxy-(Ro+Rc)/2+10);
line(mmaxx,mmaxy-(Ro+Rc)/2+5,mmaxx,mmaxy-(Ro+Rc)/2+5);
line(mmaxx,mmaxy-(Ro+Rc)/2,mmaxx,mmaxy-Ro-Rc);
arc(mmaxx,mmaxy,0,25,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,28,29,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,32,110,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,113,114,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,117,185,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,187,188,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,191,255,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,258,259,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,262,300,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,303,304,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,307,360,desh_R); // 畫點劃圓
}
第三個框 畫已知圓的程式
void Known_Circle()
{
circle(mmaxx,mmaxy,Ri);
circle(mmaxx+u1,mmaxy-v1,Rc/2);
circle(mmaxx+u2,mmaxy-v2,Rc/2);
circle(mmaxx+u3,mmaxy-v3,Rc/2);
}
第四個框計算連線圓弧圓心,其程式也可作為一個函式如下:
void Link_Arc_Center()
{
float A,B,D1,D2,D3,B2_4AC1,B2_4AC2,B2_4AC3;
float BD1,BD2,BD3,Root1,Root2,Root3,temp;
A=Ro*Ro+8*Ro*Rc/5+16*Rc*Rc/25;
B=Ro*Ro+8*Ro*Rc/5-13*Rc*Rc/5;
D1=u1*u1+v1*v1; // D1為計算連線圓弧1與2圓心座標需要的值,須先算出
D2=u2*u2+v2*v2; // D2為計算連線圓弧3與4圓心座標需要的值,須先算出
D3=u3*u3+v3*v3; // D3為計算連線圓弧5與6圓心座標需要的值,須先算出
// 下面幾行計算都是為計算連線圓弧圓心座標值做準備
BD1=B+D1
BD2=B+D2;
BD3=B+D3;
B2_4AC1=u1*u1*(4*A*D1)-BD1*BD1);
B2_4AC2=u2*u2*(4*A*D2)-BD2*BD2);
B2_4AC3=u3*u3*(4*A*D3)-BD3*BD3);
Root1=sqrt(B2_4AC1);
Root2=sqrt(B2_4AC2);
Root3=sqrt(B2_4AC3);
y1=(v1*BD1-Root1)/(2*D1); // 根據圓心座標所處象限位置,選取正負號
// 連線圓弧1圓心y座標值
temp=A-y1*y1;
x1=sqrt(temp); // 連線圓弧1圓心x座標值
y2=(v1*BD1+Root1)/(2*D1); // 連線圓弧2圓心y座標值
temp=A-y2*y2;
x2=sqrt(temp); // 連線圓弧2圓心x座標值
y3=(v2*BD2+Root2)/(2*D2); // ±Root2=0
// 連線圓弧3圓心y座標值
temp=A-y3*y3;
x3=sqrt(temp); // 連線圓弧3圓心x座標值
y4=(v2*BD2+Root2)/(2*D2); // ±Root2=0
// 連線圓弧4圓心y座標值
x4=-sqrt(A-y4*y4); // 連線圓弧4圓心x座標值
y5=(v3*BD3+Root3)/(2*D3); // 連線圓弧5圓心y座標值
x5=-sqrt(A-y5*y5); // 連線圓弧5圓心x座標值
y6=(v3*BD3-Root3)/(2*D3); // 連線圓弧6圓心y座標值
x6=-sqrt(A-y6*y6); // 連線圓弧6圓心x座標值
}
第五個框求連線圓弧切點,其程式作為一個函式:
void Tangent_Point()
void Enterdata()
{
clrscr();
gotoxy(1,6);
printf("Enter the radius of the circles./n");
gotoxy(1,8);
printf(Enter in_circle radius(>=12.5):/n");
scanf("%f",&Ri);
printf("Enter out_circle radius(>=25.0):/n");
scanf(%f",&Ro);
printf("Enter convex_circle radius(=10.0):/n");
scanf("%f",&Rc);
}
第二框畫基準線與圓心線,可由下面的函式完成:
void Base_Center_Line()
{
flost dash_R;
desh_R=(4*Ro+Ri)/5; // 三個小圓圓心所在的點劃圓半徑
u1=((4*Ro+Ri)/5)*cos(-30*0.017453); // 確定三個小圓圓心座標
v1=((4*Ro+Ri)/5)*sin(-30*0.017453);
u2=0.0; // ((4*Ro+Ri)/5)*cos(90*0.017453)
v2=((4*Ro+Ri)/5); // ((4*Ro+Ri)/5)*sin(90*0.017453)
u3=((4*Ro+Ri)/5)*cos(210*0.017453);
v3=((4*Ro+Ri)/5)*sin(210*0.017453);
line(mmaxx-Ro-Rc,mmaxy,mmaxx-(Ro+Rc)/2,mmaxy; // 畫基準線
line(mmaxx-(Ro+Rc)/2+5,mmaxy,mmaxx-(Ro+Rc)/2+5,mmaxy);
line(mmaxx-(Ro+Rc)/2+10,mmaxy,mmaxx-(Ro+Rc)/2,mmaxy);
line(mmaxx+(Ro+Rc)/2+5,mmaxy,mmaxx-(Ro+Rc)/2+5,mmaxy);
line(mmaxx+(Ro+Rc)/2+10,mmaxy,mmaxx+Ro+Rc,mmaxy);
line(mmaxx,mmaxy+Ro+Rc,mmaxx,mmaxy+(Ro+Rc)/2+10);
line(mmaxx,mmaxy+(Ro+Rc)/2+5,mmaxx,mmaxy+(Ro+Rc)/2+5);
line(mmaxx,mmaxy+(Ro+Rc)/2,mmaxx,mmaxy-(Ro+Rc)/2+10);
line(mmaxx,mmaxy-(Ro+Rc)/2+5,mmaxx,mmaxy-(Ro+Rc)/2+5);
line(mmaxx,mmaxy-(Ro+Rc)/2,mmaxx,mmaxy-Ro-Rc);
arc(mmaxx,mmaxy,0,25,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,28,29,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,32,110,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,113,114,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,117,185,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,187,188,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,191,255,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,258,259,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,262,300,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,303,304,desh_R); // 畫點劃圓
arc(mmaxx,mmaxy,307,360,desh_R); // 畫點劃圓
}
第三個框 畫已知圓的程式
void Known_Circle()
{
circle(mmaxx,mmaxy,Ri);
circle(mmaxx+u1,mmaxy-v1,Rc/2);
circle(mmaxx+u2,mmaxy-v2,Rc/2);
circle(mmaxx+u3,mmaxy-v3,Rc/2);
}
第四個框計算連線圓弧圓心,其程式也可作為一個函式如下:
void Link_Arc_Center()
{
float A,B,D1,D2,D3,B2_4AC1,B2_4AC2,B2_4AC3;
float BD1,BD2,BD3,Root1,Root2,Root3,temp;
A=Ro*Ro+8*Ro*Rc/5+16*Rc*Rc/25;
B=Ro*Ro+8*Ro*Rc/5-13*Rc*Rc/5;
D1=u1*u1+v1*v1; // D1為計算連線圓弧1與2圓心座標需要的值,須先算出
D2=u2*u2+v2*v2; // D2為計算連線圓弧3與4圓心座標需要的值,須先算出
D3=u3*u3+v3*v3; // D3為計算連線圓弧5與6圓心座標需要的值,須先算出
// 下面幾行計算都是為計算連線圓弧圓心座標值做準備
BD1=B+D1
BD2=B+D2;
BD3=B+D3;
B2_4AC1=u1*u1*(4*A*D1)-BD1*BD1);
B2_4AC2=u2*u2*(4*A*D2)-BD2*BD2);
B2_4AC3=u3*u3*(4*A*D3)-BD3*BD3);
Root1=sqrt(B2_4AC1);
Root2=sqrt(B2_4AC2);
Root3=sqrt(B2_4AC3);
y1=(v1*BD1-Root1)/(2*D1); // 根據圓心座標所處象限位置,選取正負號
// 連線圓弧1圓心y座標值
temp=A-y1*y1;
x1=sqrt(temp); // 連線圓弧1圓心x座標值
y2=(v1*BD1+Root1)/(2*D1); // 連線圓弧2圓心y座標值
temp=A-y2*y2;
x2=sqrt(temp); // 連線圓弧2圓心x座標值
y3=(v2*BD2+Root2)/(2*D2); // ±Root2=0
// 連線圓弧3圓心y座標值
temp=A-y3*y3;
x3=sqrt(temp); // 連線圓弧3圓心x座標值
y4=(v2*BD2+Root2)/(2*D2); // ±Root2=0
// 連線圓弧4圓心y座標值
x4=-sqrt(A-y4*y4); // 連線圓弧4圓心x座標值
y5=(v3*BD3+Root3)/(2*D3); // 連線圓弧5圓心y座標值
x5=-sqrt(A-y5*y5); // 連線圓弧5圓心x座標值
y6=(v3*BD3-Root3)/(2*D3); // 連線圓弧6圓心y座標值
x6=-sqrt(A-y6*y6); // 連線圓弧6圓心x座標值
}
第五個框求連線圓弧切點,其程式作為一個函式:
void Tangent_Point()