program Sechenie; { Turbo Pascal 7.0 (DOS). Готово к копированию и компиляции. } uses Graph; const { --- Двутавр No20 (ГОСТ 8239-89) --- } b2 = 10.0; h2 = 20.0; d2 = 0.52; t2 = 0.84; F2 = 26.8; Ix2 = 1840.0; Iy2 = 104.0; { --- Уголок 180x110x12 (ГОСТ 8510-86) --- } B1 = 18.0; b1 = 11.0; t1 = 1.2; F1 = 33.69; Ix1 = 1122.56; Iy1 = 324.09; Ix1y1 = 348.0; x0 = 2.52; y0 = 5.97; var gd, gm : integer; scale : double; cx0, cy0 : integer; xc1, yc1, xc2, yc2 : double; F, xc, yc : double; a1, b1_, a2, b2_ : double; Jx, Jy, Jxy : double; alpha0 : double; Javg, Jrad, Jmax, Jmin, iu, iv : double; { ---------- arctan2 (в TP7 нет) ---------- } function ArcTan2(y, x: double): double; begin if x > 0 then ArcTan2 := ArcTan(y/x) else if x < 0 then begin if y >= 0 then ArcTan2 := ArcTan(y/x) + Pi else ArcTan2 := ArcTan(y/x) - Pi; end else begin if y > 0 then ArcTan2 := Pi/2 else if y < 0 then ArcTan2 := -Pi/2 else ArcTan2 := 0; end; end; { ---------- форматирование числа в строку ---------- } function Fmt(v: double; dec: integer): string; var s : string; begin Str(v:0:dec, s); Fmt := s; end; { ---------- экранные координаты ---------- } function SX(x: double): integer; begin SX := Round(cx0 + x * scale); end; function SY(y: double): integer; begin SY := Round(cy0 - y * scale); end; procedure WLine(x1,y1,x2,y2: double); begin Line(SX(x1), SY(y1), SX(x2), SY(y2)); end; { ---------- заливка полигона (scanline) ---------- } procedure FillPolyWorld(var xs, ys: array of double; color: word); var i, j, k, n : integer; ymin, ymax, yy : double; xint : array[0..255] of double; cnt, xi, xj : integer; px1, px2 : integer; t : double; begin n := Length(xs); ymin := ys[0]; ymax := ys[0]; for i := 1 to n-1 do begin if ys[i] < ymin then ymin := ys[i]; if ys[i] > ymax then ymax := ys[i]; end; SetColor(color); yy := ymin; while yy <= ymax do begin cnt := 0; j := n - 1; for i := 0 to n-1 do begin xi := i; xj := j; if ((ys[xi] <= yy) and (ys[xj] > yy)) or ((ys[xj] <= yy) and (ys[xi] > yy)) then begin t := (yy - ys[xi]) / (ys[xj] - ys[xi]); xint[cnt] := xs[xi] + t * (xs[xj] - xs[xi]); Inc(cnt); end; j := i; end; for i := 0 to cnt-2 do for k := i+1 to cnt-1 do if xint[i] > xint[k] then begin t := xint[i]; xint[i] := xint[k]; xint[k] := t; end; i := 0; while i < cnt-1 do begin px1 := SX(xint[i]); px2 := SX(xint[i+1]); Line(px1, SY(yy), px2, SY(yy)); i := i + 2; end; yy := yy + 0.05; end; end; { ---------- повернутый эллипс ---------- } procedure DrawEllipse(cx, cy, a, b, ang: double); var t, x, y, xr, yr : double; n, i : integer; px, py, pxp, pyp : integer; begin n := 360; t := 0; x := a; y := 0; xr := x*cos(ang) - y*sin(ang) + cx; yr := x*sin(ang) + y*cos(ang) + cy; pxp := SX(xr); pyp := SY(yr); for i := 1 to n do begin t := 2*Pi*i/n; x := a*cos(t); y := b*sin(t); xr := x*cos(ang) - y*sin(ang) + cx; yr := x*sin(ang) + y*cos(ang) + cy; px := SX(xr); py := SY(yr); Line(pxp, pyp, px, py); pxp := px; pyp := py; end; end; var i : integer; xs, ys : array[0..20] of double; L, dx, dy : double; begin { --- Расчёт --- } xc1 := b2/2 + x0; yc1 := y0; xc2 := 0; yc2 := 0; F := F1 + F2; xc := (F1*xc1 + F2*xc2) / F; yc := (F1*yc1 + F2*yc2) / F; a1 := yc1 - yc; b1_ := xc1 - xc; a2 := yc2 - yc; b2_ := xc2 - xc; Jx := Ix1 + F1*a1*a1 + Ix2 + F2*a2*a2; Jy := Iy1 + F1*b1_*b1_ + Iy2 + F2*b2_*b2_; Jxy := Ix1y1 + F1*a1*b1_ + 0 + F2*a2*b2_; alpha0 := 0.5*ArcTan2(-2*Jxy, Jx-Jy); Javg := (Jx+Jy)/2; Jrad := 0.5*Sqrt(Sqr(Jx-Jy) + 4*Jxy*Jxy); Jmax := Javg + Jrad; Jmin := Javg - Jrad; iu := Sqrt(Jmax/F); iv := Sqrt(Jmin/F); { --- Графика --- } gd := Detect; InitGraph(gd, gm, ''); if GraphResult <> grOk then Halt(1); scale := 20.0; cx0 := 300; cy0 := 400; { --- Сетка 1 см --- } SetColor(LightGray); SetLineStyle(DottedLn, 0, NormWidth); for i := -10 to 20 do Line(SX(i), SY(-15), SX(i), SY(25)); for i := -15 to 25 do Line(SX(-10), SY(i), SX(20), SY(i)); SetLineStyle(SolidLn, 0, NormWidth); { --- Оси x2, y2 --- } SetColor(Blue); WLine(-10, 0, 20, 0); WLine(0, -15, 0, 25); OutTextXY(SX(19), SY(0.5), 'x2'); OutTextXY(SX(0.5), SY(24), 'y2'); { --- Двутавр --- } xs[0] := -b2/2; ys[0] := h2/2; xs[1] := b2/2; ys[1] := h2/2; xs[2] := b2/2; ys[2] := h2/2-t2; xs[3] := d2/2; ys[3] := h2/2-t2; xs[4] := d2/2; ys[4] := -h2/2+t2; xs[5] := b2/2; ys[5] := -h2/2+t2; xs[6] := b2/2; ys[6] := -h2/2; xs[7] := -b2/2; ys[7] := -h2/2; xs[8] := -b2/2; ys[8] := -h2/2+t2; xs[9] := -d2/2; ys[9] := -h2/2+t2; xs[10]:= -d2/2; ys[10]:= h2/2-t2; xs[11]:= -b2/2; ys[11]:= h2/2-t2; xs[12]:= -b2/2; ys[12]:= h2/2; FillPolyWorld(xs, ys, LightBlue); SetColor(Black); for i := 0 to 11 do WLine(xs[i], ys[i], xs[i+1], ys[i+1]); WLine(xs[12], ys[12], xs[0], ys[0]); { --- Уголок --- } xs[0] := b2/2; ys[0] := 0; xs[1] := b2/2; ys[1] := B1; xs[2] := b2/2 + t1; ys[2] := B1; xs[3] := b2/2 + t1; ys[3] := t1; xs[4] := b2/2 + b1; ys[4] := t1; xs[5] := b2/2 + b1; ys[5] := 0; xs[6] := b2/2; ys[6] := 0; FillPolyWorld(xs, ys, LightRed); SetColor(Black); for i := 0 to 5 do WLine(xs[i], ys[i], xs[i+1], ys[i+1]); WLine(xs[6], ys[6], xs[0], ys[0]); { --- Центральные оси --- } SetColor(Green); WLine(-10, yc, 20, yc); WLine(xc, -15, xc, 25); OutTextXY(SX(19), SY(yc+0.6), 'x'); OutTextXY(SX(xc+0.5), SY(24), 'y'); { --- Главные оси u, v --- } SetColor(Red); L := 20; dx := cos(alpha0)*L; dy := sin(alpha0)*L; WLine(xc-dx, yc-dy, xc+dx, yc+dy); OutTextXY(SX(xc+dx*0.9), SY(yc+dy*0.9), 'u'); SetColor(Magenta); dx := -sin(alpha0)*L; dy := cos(alpha0)*L; WLine(xc-dx, yc-dy, xc+dx, yc+dy); OutTextXY(SX(xc+dx*0.9), SY(yc+dy*0.9), 'v'); { --- Эллипс инерции --- } SetColor(DarkGray); DrawEllipse(xc, yc, iu, iv, alpha0); { --- Точки центров --- } SetColor(Green); SetFillStyle(SolidFill, Green); FillCircle(SX(xc), SY(yc), 5); OutTextXY(SX(xc)+8, SY(yc)-8, 'C'); SetColor(LightRed); SetFillStyle(SolidFill, LightRed); FillCircle(SX(xc1), SY(yc1), 5); OutTextXY(SX(xc1)+6, SY(yc1)-8, 'C1'); SetColor(Blue); SetFillStyle(SolidFill, Blue); FillCircle(SX(xc2), SY(yc2), 5); OutTextXY(SX(xc2)+6, SY(yc2)+2, 'C2'); { --- Текст результатов --- } SetColor(Black); OutTextXY(10, 10, 'Dvutavr No20 + Ugolok 180x110x12'); OutTextXY(10, 25, 'xc = ' + Fmt(xc,2) + ' sm, yc = ' + Fmt(yc,2) + ' sm'); OutTextXY(10, 40, 'Jx = ' + Fmt(Jx,1) + ', Jy = ' + Fmt(Jy,1) + ' sm4'); OutTextXY(10, 55, 'Jxy = ' + Fmt(Jxy,1) + ' sm4'); OutTextXY(10, 70, 'alpha0 = ' + Fmt(alpha0*180/Pi,2) + ' grad'); OutTextXY(10, 85, 'Ju = ' + Fmt(Jmax,1) + ', Jv = ' + Fmt(Jmin,1) + ' sm4'); OutTextXY(10, 100,'iu = ' + Fmt(iu,2) + ' sm, iv = ' + Fmt(iv,2) + ' sm'); SetColor(Blue); OutTextXY(10, 130, '--- osi x2,y2'); SetColor(Green); OutTextXY(10, 145, '--- centralnye x,y'); SetColor(Red); OutTextXY(10, 160, '--- glavnaya u'); SetColor(Magenta); OutTextXY(10, 175, '--- glavnaya v'); SetColor(DarkGray);OutTextXY(10, 190, '--- ellips inercii'); OutTextXY(10, 220, 'Nazhmite Enter dlya vyhoda...'); ReadLn; CloseGraph; end.