Запись оставлена Гость 23.10.2026 в 15:55
запустить | скачать | новая запись
- 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.
Отправка исправлений и поправок. (cоздать новую запись)
После отправки поправок вы сможете посмотреть различия между старой и новой записью.