Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2012, 14:18   #1
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
Смущение Диметрическая проекция Pascal

Здравствуйте, необходима помощь в построении диметрической проекции фигуры вместо изометрической. Что исправить в коде (Pascal). Заранее благодарю всех откликнувшихся!
Код:
uses Graph,crt;
const                              {объявляю константы}
coord: array[0..6,0..2] of real =  {матрица координат вершин гексаэдра}
 ((60,0,60),
 (85.98,0,45),
 (85.98,0,15),
 (60,0,0),
 (34.02,0,15),
 (34.02,0,45),
 (60,150,30));

side: array[0..11,0..1] of integer = {матрица ребер гексаэдра}   
((0,1),(0,5),(1,2),(2,3),(3,4),(4,5),(0,6),(1,6),(2,6),(3,6),(4,6),(5,6));

pl:array[0..5,0..2] of integer =      {матрица граней гексаэдра}
((0,1,6),(1,2,6),(2,3,6),(3,4,6),(4,5,6),(0,5,6));

MatrOb: array[0..3,0..3] of real =     {обратная матрица видового преобразования}
 ((0.631,0.078,0.784,0),
 (0.452,0.772,-0.452,0),
 (-0.64,0.64,0.64,0),
 (0,0,0,1));

E:array[0..3] of integer = (0,0,-1,0); {вектор с координатами пробной точки}
f:real=45*Pi/180;                      {угол поворота вокруг оси OY}
q:real=35.26*Pi/180;                   {угол поворота вокруг оси OX}

Type st =set of 1..9;                  {объявляю тип множество целых чисел} 

{объявляю переменные}
var corner :real;                      {угол поворота вокруг оси OY} 
    s: real;                           {вспомогательные переменные}
    sx,sy,sx1,sy1,gd,gm,i,j,p: integer; {вспомогательные переменные}
    coordIz: array[0..6,0..2] of real; {матрица изометрических координат}
    V,V1: array[0..3,0..5] of real;    {матрицы коэффициентов уравнений плоскостей граней гексаэдра – матрица тела}
    N: array[0..1,0..2] of real;       {матрица вектора нормали к плоскости}
    o: array[0..3] of real;            {вектор координат точки, лежащей внутри гексаэдра}
    L: array[0..7] of integer;         {матрица координат вершин изометрических плоскостей гексаэдра – используется в функции Паскаля FillPoly} 
    Hidden : st;                       {множество для хранения номеров невидимых вершин гексаэдра}
    Zn:array[0..6] of integer;         {вектор хранения знаков плоскостей граней}
    tX,tZ:real;                        {вспомогательные переменные}
    flag: Boolean;                     {переменная логического типа, определяет как проходит гексаэдр – за или перед осью OY}

{процедура нахождения изометрических координат гексаэдра}
Procedure Izometr;
Begin
   tX:=coordIz[0,0];             {запоминаем координату нулевой точки предыдущего местоположения гексаэдра}
   for p:=0 to 6 do              {в цикле от 0 до 6 находим изометрические координаты}
   begin
        coordIz[p,0]:=coord[p,0]*cos(f)+coord[p,2]*sin(f);
        coordIz[p,2]:=0;
        coordIz[p,1]:=coord[p,0]*sin(f)*sin(q)+coord[p,1]*cos(q)-coord[p,2]*cos(f)*sin(q);
   end;
{если координаты нулевой точки предыдущего хода меньше, чем текущего, то 
переменной флаг присваиваем значение false, иначе - true}    if tX<coordIz[0,0] then flag:=false else flag:=true;
End;

{процедура рисования контура гексаэдра} procedure draw(color:byte);
begin
    for p:=0 to 11 do         {в цикле от 0 до 11 соединяем точки вершин гексаэдра по номерам ребер. Точки строим относительно середины экрана}
    begin
       {если вершина не принадлежит множеству Hidden, т.е. если она видимая}        if (not (side[p,0] in Hidden)) and (not (side[p,1] in Hidden)) then
       begin
          sx:=round(coordIz[side[p,0],0]+getmaxx div 2);
          sx1:=round(coordIz[side[p,1],0]+getmaxx div 2);
          sy:=round(getmaxy div 2-coordIz[side[p,0],1]);
          sy1:=round(getmaxy div 2-coordIz[side[p,1],1]);
          setcolor(color);               {задаем цвет рисования ребер}
          line(SX,SY,sx1,sy1);           {проводим линии ребер} 
     end;
end;
end;
........
{процедура поворота вокруг оси OY} procedure rotateOY;
begin
   for i:=0 to 6 do    {в цикле от 0 до 6 находим новые координаты гексаэдра}
   begin
     tX:= coord[i,0] * COS(corner) + coord[i,2] * SIN(corner);
     tZ:=-coord[i,0] * SIN(corner) + coord[i,2] * COS(corner);
     coord[i,0]:=tX;
     coord[i,2] :=tZ;
  end;
.......
процедура рисования изометрических осей}
Procedure Axis;
var l:integer;
Begin
   setColor(15);                      {задаем цвет}
   l:=GetMaxY div 2;
   {рисуем ось OY – вертикально вверх}
   line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2,0);
   {рисуем ось OX – под углом 1200 к оси OY}   line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2 + round(0.866*l),GetMaxY div 2 + round(0.5*l));
   {рисуем ось OX – под углом -1200 к оси OY}   line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2 - round(0.866*l),GetMaxY div 2 + round(0.5*l));
   setColor(0);                    
end;
............
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.
Viwwna вне форума Ответить с цитированием
Старый 19.05.2012, 17:38   #2
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
По умолчанию

Все еще нуждаюсь в помощи....
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.
Viwwna вне форума Ответить с цитированием
Старый 19.05.2012, 18:18   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Может, дадите определение диметрической проекции?
s-andriano вне форума Ответить с цитированием
Старый 19.05.2012, 18:26   #4
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Может, дадите определение диметрической проекции?
Ось Z' расположена вертикально, а оси X' и Y' образуют с горизонтальной линией углы 7°10' и 41°25'.

Коэффициент искажения по оси Y' равен 0,47, а по осям X' и Z' 0,94.
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.
Viwwna вне форума Ответить с цитированием
Старый 19.05.2012, 18:33   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я напряг свои телепатические способности и Голос подсказал мне, что изометрическая проекция является плоской.
Голос был прав?
s-andriano вне форума Ответить с цитированием
Старый 19.05.2012, 18:43   #6
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Я напряг свои телепатические способности и Голос подсказал мне, что изометрическая проекция является плоской.
Голос был прав?
Сама проекция конечно плоская, я говорю про построение диметрических осей!
Естественно, интересует, как записать при диметрии угол поворота вокруг оси:
Код:
f:real=45*Pi/180;                      {угол поворота вокруг оси OY}
q:real=35.26*Pi/180;                   {угол поворота вокруг оси OX}
и процедура нахождения диметрических координат фигуры:
Код:
Procedure Izometr;
Begin
   tX:=coordIz[0,0];             {запоминаем координату нулевой точки предыдущего местоположения гексаэдра}
   for p:=0 to 6 do              {в цикле от 0 до 6 находим изометрические координаты}
   begin
        coordIz[p,0]:=coord[p,0]*cos(f)+coord[p,2]*sin(f);
        coordIz[p,2]:=0;
        coordIz[p,1]:=coord[p,0]*sin(f)*sin(q)+coord[p,1]*cos(q)-coord[p,2]*cos(f)*sin(q);
   end;
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.

Последний раз редактировалось Viwwna; 19.05.2012 в 19:42.
Viwwna вне форума Ответить с цитированием
Старый 20.05.2012, 13:54   #7
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
По умолчанию

Подготовила код, который завтра понесу на проверку ontknow:, хотелось бы узнать Ваше мнение. в общем,задача была такая: многогранник должен вращаться вокруг OY (а не вокруг собственной оси). Все грани должны быть закрашенными, невидимые линии удалены. При этом проекция должна быть ДИМЕТРИЯ (здесь у меня особая просьба к Вам, посмотреть мои ошибки)

Код:
PROGRAM Task3_Geksaidr;
USES Crt, Graph;
VAR Gd, Gm: Integer;   {Переменные для работы в графическом режиме}
    hex: array[1..8, 1..3] of real; {Массив с координатами вершин}
    hex2: array[1..8, 1..2] of integer; {Массив с координатами вершин в проекции}
    grani: array[1..6, 1..4] of integer; {Массив граней гексаэдра}
    i, j: integer;     {Цикловые переменные}
    ch: char;          {Значение нажатой клавиши}
{=============================}
PROCEDURE Projectiya;           {Расчет координат проекции}
CONST UgolX=Pi/12;       {Угол вращения вокруг оси X}
      UgolY=pi/12;          {Угол вращения вокруг оси Y}
BEGIN
   For i:=1 To 8 Do Begin
       hex2[i,1]:=trunc(hex[i,1]*cos(UgolY)+ hex[1,3]*sin(UgolY)+320);
       hex2[i,2]:=290-trunc(hex[i,1]*sin(UgolY)*sin(UgolX)+hex[i,2]*cos(UgolX)-hex[i,3]*cos(UgolY)*sin(UgolX));
   End;
END;
{=============================}
FUNCTION VidimayaGran(i:integer): boolean; {Определение видимости i-й грани}
VAR V1,V2,N: array[1..3] of real;
    scalar: real;
BEGIN
  {Расчет значений 2-х векторов, лежащих в плоскости грани}
   For j:=1 To 3 Do Begin
       V1[j]:=hex[grani[i,2],j]-hex[grani[i,1],j];
       V2[j]:=hex[grani[i,3],j]-hex[grani[i,1],j];
   End;
   {Вычисление вектора нормали грани}
   N[1]:=V1[2]*V2[3]-V2[2]*V1[3];
   N[2]:=V1[3]*V2[1]-V2[3]*V1[1];
   N[3]:=V1[1]*V2[2]-V2[1]*V1[2];
   {Определение видимости грани}
   scalar:=N[1]-N[2]-N[3];
   If scalar>0 Then
      VidimayaGran:=true
   Else
      VidimayaGran:=false;
END;
{=============================}
PROCEDURE Draw;                 {Вывод на экран}
VAR gran: array[1..4] of PointType;
BEGIN
  Projectiya;
  For i:=1 To 6 Do Begin
      If VidimayaGran(i) Then Begin  {Если грань видима, то выводим ее на экран}
         For j:=1 To 4 Do Begin
             gran[j].x:=hex2[grani[i,j],1];
             gran[j].y:=hex2[grani[i,j],2];
         End;
         SetFillStyle(1,i+8);   {Устанавливаем цвет и стиль закраски}
         FillPoly(4,gran);
      End;
  End;
END;
{=============================}
PROCEDURE VrachOY(Ugol: real);  {Поворот вокруг оси OY}
VAR x,z: real;
BEGIN
   For i:=1 To 8 Do Begin
       x:=hex[i,1];
       z:=hex[i,3];
       hex[i,1]:=x*cos(Ugol)+z*sin(Ugol);
       hex[i,3]:=-x*sin(Ugol)+z*cos(Ugol);
   End;
END;
{=============================}
BEGIN
   {Описываем гексаэдр}
   hex[1,1]:=30;   hex[1,2]:=0;    hex[1,3]:=0;
   hex[2,1]:=30;   hex[2,2]:=150;  hex[2,3]:=0;
   hex[3,1]:=180;  hex[3,2]:=150;  hex[3,3]:=0;
   hex[4,1]:=180;  hex[4,2]:=0;    hex[4,3]:=0;
   hex[5,1]:=30;   hex[5,2]:=0;    hex[5,3]:=150;
   hex[6,1]:=30;   hex[6,2]:=150;  hex[6,3]:=150;
   hex[7,1]:=180;  hex[7,2]:=150;  hex[7,3]:=150;
   hex[8,1]:=180;  hex[8,2]:=0;    hex[8,3]:=150;
   {и грани}
   grani[1,1]:=1; grani[1,2]:=2; grani[1,3]:=3; grani[1,4]:=4;
   grani[2,1]:=5; grani[2,2]:=6; grani[2,3]:=2; grani[2,4]:=1;
   grani[3,1]:=2; grani[3,2]:=6; grani[3,3]:=7; grani[3,4]:=3;
   grani[4,1]:=4; grani[4,2]:=3; grani[4,3]:=7; grani[4,4]:=8;
   grani[5,1]:=1; grani[5,2]:=4; grani[5,3]:=8; grani[5,4]:=5;
   grani[6,1]:=5; grani[6,2]:=8; grani[6,3]:=7; grani[6,4]:=6;

   Gd := Detect;
   InitGraph(Gd, Gm, '');       {Инициализация графического режима}
   If GraphResult <> grOk Then
      Halt(1);

   SetBkColor(Blue);            {Устанавливаем цвет фона}
   ClearDevice;                 {Очищаем экран}
   Draw;                        {Выводим}
   While ch<>#27 Do Begin       {Пока не нажата клавиша "Esc", вращаем}
      If keypressed Then
         ch:=readkey;           {Считываем значение нажатой клавиши}
      VrachOY(pi/40);           {Делаем поворот вокруг оси OY}
      ClearDevice;              {Очищаем экран}
      Draw;                     {Выводим}
      OuttextXY(10,465,'Press <Esc> to Exit');
      Delay(8000);
   End;
   CloseGraph;                  {Завершение работы в графическом режиме}
END.
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.
Viwwna вне форума Ответить с цитированием
Старый 20.05.2012, 17:00   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Честно говоря:
1. Так и не понял, что такое диметрическая проекция.
2. Запутался в Вашем коде.

Во-первых, у меня такое ощущение, что Вы нумеруете координаты в посте №6 с 0 до 2, а в посте №7 - с 1 до 3.
Опять же, нигде не поясняеие, какой индекс к какой координате относится.
Чтобы не путаться с этим, я рекомендую определить тип вестора, например, так:
Код:
type
  Vertex3D = record
    x,y,z : single;
  end;
  Vertrx2D = record
    x,y : single;
  end;
и уже ими пользоваться.
Во-вторых, мне кажется лучше определить матричные преобразования и пользоваться ими. Вы один раз проверите, что они работают правильно и не нужно потом будет каждое действие расписываьт через тригонометрию и проверять, не ошиблись ли Вы где-то.
В третьих, не уверен, что правильно понял, как Вы вычисляете видимость. По идее она должна определяться по результатам ВСЕХ геометрических преобразований, мне же кажется, что преобразование проекции там не учитывется. Значит, Вы определяете видимость не из той точки. Я не уверен, но проверьте это.
И почему Вы так преобразуете вектор в скаляр, я тоже не понял. Обычно достаточно проверить знак одной координаты, Вы же вычисляете какую-то комбинацию всех.
В общем, после всех необходимых поворотов плоская проекция заключается дишь в том, чобы обнулить (отбросить) одну координату. Поэтому я бы рекомендовал вычислять hex2 с тремя координатами, по этим координатам определять видимость и уже при построении граней пользоваться только двумя из них.

PS. Борланд Паскаль у меня некстановлен, так что посмотреть, как работает Ваш код не могу.
s-andriano вне форума Ответить с цитированием
Старый 20.05.2012, 17:27   #9
Viwwna
Пользователь
 
Аватар для Viwwna
 
Регистрация: 18.11.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Во-первых, у меня такое ощущение, что Вы нумеруете координаты в посте №6 с 0 до 2, а в посте №7 - с 1 до 3.
Так оно и есть, это два разных кода в посте 6 приведен только в качестве примера.
немного изменила ( в частности неточности отображения видимости):

Код:
PROGRAM Task3_Geksaidr;
USES Crt, Graph;
CONST UgolX=Pi/12;       {Угол вращения вокруг оси X}
      UgolY=pi/12;          {Угол вращения вокруг оси Y}

VAR Gd, Gm: Integer;   {Переменные для работы в графическом режиме}
    hex: array[1..8, 1..3] of real; {Массив с координатами вершин}
    hex2: array[1..8, 1..3] of integer; {Массив с координатами вершин в проекции}
    grani: array[1..6, 1..4] of integer; {Массив граней гексаэдра}
    ch: char;          {Значение нажатой клавиши}
    i, j: integer;     {Цикловые переменные}
{=============================}
PROCEDURE Projectiya;           {Расчет координат проекции}
VAR
      i, j: integer;     {Цикловые переменные}
BEGIN
   For i:=1 To 8 Do Begin
       hex2[i,1]:=trunc(hex[i,1]*cos(UgolY)+ hex[1,3]*sin(UgolY)+320);
       hex2[i,2]:=290-trunc(hex[i,1]*sin(UgolY)*sin(UgolX)+hex[i,2]*cos(UgolX)-hex[i,3]*cos(UgolY)*sin(UgolX));
   End;
END;
{=============================}
FUNCTION VidimayaGran(i:integer): boolean; {Определение видимости i-й грани}
VAR V1,V2,N: array[1..3] of real;
    scalar: real;
BEGIN
  {Расчет значений 2-х векторов, лежащих в плоскости грани}
   For j:=1 To 2 Do Begin
       V1[j]:=hex2[grani[i,2],j]-hex2[grani[i,1],j];
       V2[j]:=hex2[grani[i,3],j]-hex2[grani[i,1],j];
   End;
   {Вычисление вектора нормали грани}

   N[3]:=V1[1]*V2[2]-V2[1]*V1[2];
   VidimayaGran:=(N[3]>0);
END;
{=============================}
PROCEDURE Draw;                 {Вывод на экран}
VAR gran: array[1..4] of PointType;
BEGIN
  Projectiya;
  For i:=1 To 6 Do Begin
      If VidimayaGran(i) Then Begin  {Если грань видима, то выводим ее на экран}
         For j:=1 To 4 Do Begin
             gran[j].x:=hex2[grani[i,j],1];
             gran[j].y:=hex2[grani[i,j],2];
         End;
         SetFillStyle(1,i+8);   {Устанавливаем цвет и стиль закраски}
         FillPoly(4,gran);
      End;
  End;
END;
{=============================}
PROCEDURE VrachOY(Ugol: real);  {Поворот вокруг оси OY}
VAR x,z: real;
BEGIN
   For i:=1 To 8 Do Begin
       x:=hex[i,1];
       z:=hex[i,3];
       hex[i,1]:=x*cos(Ugol)+z*sin(Ugol);
       hex[i,3]:=-x*sin(Ugol)+z*cos(Ugol);
   End;
END;
{=============================}
BEGIN
   {Описываем гексаэдр}
   hex[1,1]:=30;   hex[1,2]:=0;    hex[1,3]:=0;
   hex[2,1]:=30;   hex[2,2]:=150;  hex[2,3]:=0;
   hex[3,1]:=180;  hex[3,2]:=150;  hex[3,3]:=0;
   hex[4,1]:=180;  hex[4,2]:=0;    hex[4,3]:=0;
   hex[5,1]:=30;   hex[5,2]:=0;    hex[5,3]:=150;
   hex[6,1]:=30;   hex[6,2]:=150;  hex[6,3]:=150;
   hex[7,1]:=180;  hex[7,2]:=150;  hex[7,3]:=150;
   hex[8,1]:=180;  hex[8,2]:=0;    hex[8,3]:=150;
   {и грани}
   grani[1,1]:=1; grani[1,2]:=2; grani[1,3]:=3; grani[1,4]:=4;
   grani[2,1]:=5; grani[2,2]:=6; grani[2,3]:=2; grani[2,4]:=1;
   grani[3,1]:=2; grani[3,2]:=6; grani[3,3]:=7; grani[3,4]:=3;
   grani[4,1]:=4; grani[4,2]:=3; grani[4,3]:=7; grani[4,4]:=8;
   grani[5,1]:=1; grani[5,2]:=4; grani[5,3]:=8; grani[5,4]:=5;
   grani[6,1]:=5; grani[6,2]:=8; grani[6,3]:=7; grani[6,4]:=6;

   Gd := Detect;
   InitGraph(Gd, Gm, '');       {Инициализация графического режима}
   If GraphResult <> grOk Then
      Halt(1);

   SetBkColor(Blue);            {Устанавливаем цвет фона}
   ClearDevice;                 {Очищаем экран}
   Draw;                        {Выводим}
   While ch<>#27 Do Begin       {Пока не нажата клавиша "Esc", вращаем}
      If keypressed Then
         ch:=readkey;           {Считываем значение нажатой клавиши}
      VrachOY(pi/40);           {Делаем поворот вокруг оси OY}
      ClearDevice;              {Очищаем экран}
      Draw;                     {Выводим}
      OuttextXY(10,465,'Press <Esc> to Exit');
      Delay(8000);
   End;
   CloseGraph;                  {Завершение работы в графическом режиме}
END.
Теперь не получается построить оси ...
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает программистов, презирающих программистов, которые презирают тех, кто их презирает.
Viwwna вне форума Ответить с цитированием
Старый 20.05.2012, 18:25   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы описали третью координату hex2, но не стали ее вычислять.
Т.к. мне неизвестен принцип, по которому Вы заполняете grani, не могу сказать, правильно ли Вы делаете.

По поводу осей - изначально они (N, 0, 0), (0, N, 0) и (0, 0, N), где N - желаемая длина, а потом к ним применяются те же преобразования. Были бы они матричными - было бы намного проще.

Да, еще, т.к. я, повторюсь, не могу у себя запустить Ваш код, порекомендую один отладочный прием:
повартируйте углы, которые у Вас объявлены как константы, в частности, посмотрите, как программа будет вести себя, если 1 или 2 или 3 угла будут отрицательными.

Последний раз редактировалось s-andriano; 20.05.2012 в 19:33.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проекция точки на прямую AnDre_rus Общие вопросы C/C++ 4 25.08.2013 17:33
Проекция буквы T на ось X(Delphi) netiv Помощь студентам 6 15.05.2012 18:51
Проекция Кавалье newStudent Помощь студентам 0 28.11.2010 19:32
Проекция Rectangle _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 8 09.09.2010 11:13
Проекция файла и запись/чтение объектов класса в C++ sd13 Помощь студентам 26 25.05.2008 12:05