1. 程式人生 > >[轉]C語言圖形程式設計(六) -圖形程式設計例項:零件圖形的繪製

[轉]C語言圖形程式設計(六) -圖形程式設計例項:零件圖形的繪製

第一框 輸入資料,用下面一個函式實現:
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()