Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
program lab1_2;
uses    crt, graph;
const    nm = 80;
    cm = 60;
type    Point3D = record
        x, y, z, p: single;
    end;
    Matrix = array[0..nm,0..nm] of single;
var    m, t: Matrix;
    p: array[0..nm] of Point3D;
        grDriver, grMode, i, n, c, j: integer;
        tmp1, tmp2, tmp3: byte;
        lines: array[0..cm,0..10] of byte;
        f: text;
        scale: single;
 
procedure GetXY(var m: Matrix; var p: Point3D; var x, y: integer);
var    d: Point3D;
        k: extended;
begin
    d.x := (p.x*m[0,0]+p.y*m[0,1]+p.z*m[0,2]+p.p*m[0,3]);
    d.y := (p.x*m[1,0]+p.y*m[1,1]+p.z*m[1,2]+p.p*m[1,3]);
    d.z := (p.x*m[2,0]+p.y*m[2,1]+p.z*m[2,2]+p.p*m[2,3]);
    d.p := (p.x*m[3,0]+p.y*m[3,1]+p.z*m[3,2]+p.p*m[3,3]);
    d.x := d.x/d.p;
    d.y := d.y/d.p;
    d.z := d.z/d.p;
    k := 200/(p.z+200);
    x := round(GetMaxX div 2+d.x*k);
    y := round(GetMaxY div 2-d.y*k);
end;
 
procedure Line3D(var m:Matrix; p1,p2:Point3D); {процедура малювання 3-вимiрної лiнiї}
var    x1, y1, x2, y2:integer;
begin
    GetXY(m,p1,x1,y1);
    GetXY(m,p2,x2,y2);
    Line(x1,y1,x2,y2);
end;
 
procedure Transform(var m, m1, m2: Matrix); {процедура множення матриць}
var    x, y, i: integer;
begin
    for x := 0 to 3 do for y := 0 to 3 do begin
    m[x,y] := 0;
    for i := 0 to 3 do m[x,y] := m[x,y]+m1[i,y]*m2[x,i];
    end;
end;
 
procedure DrawFigure(n: integer);
var     s: boolean;
begin
        s := true;
        grDriver := Detect;
        InitGraph(grDriver,grMode,'');
    m[0,0] := 1; m[0,1] := 0; m[0,2] := 0; m[0,3] := 0;
    m[1,0] := 0; m[1,1] := 1; m[1,2] := 0; m[1,3] := 0;
    m[2,0] := 0; m[2,1] := 0; m[2,2] := 1; m[2,3] := 1;
    m[3,0] := 0; m[3,1] := 0; m[3,2] := 0; m[3,3] := 1;
    SetBkColor(1);
    for i := 1 to n do begin
                ClearDevice;
 
                SetColor(14);
 
                Line(15,GetMaxY div 2,GetMaxX-15,GetMaxY div 2);
        Line(GetMaxX-15,GetMaxY div 2,GetMaxX-25,(GetMaxY div 2)+5);
        Line(GetMaxX-15,GetMaxY div 2,GetMaxX-25,(GetMaxY div 2)-5);
                OutTextXY(GetMaxX - 10,GetMaxY div 2 - 3,'X');
 
                SetColor(10);
                Line(GetMaxX div 2,15,GetMaxX div 2,GetMaxY-15);
        Line(GetMaxX div 2,15,(GetMaxX div 2)-5,25);
        Line(GetMaxX div 2,15,(GetMaxX div 2)+5,25);
                OutTextXY(GetMaxX div 2 - 4,4,'Y');
 
                SetColor(15);
                Line(GetMaxX-18,18,18,GetMaxY-18);
                Line(18,GetMaxY-18,22,GetMaxY-28);
        Line(18,GetMaxY-18,30,GetMaxY-20);
                OutTextXY(5,GetMaxY-15,'Z');
 
                SetColor(12);
 
        for i:=0 to c-1 do begin
            for j:=1 to lines[i,0]-1 do Line3D(m,p[lines[i,j]],p[lines[i,j+1]]);
            Line3D(m,p[lines[i,lines[i,0]]],p[lines[i,1]]);
        end;
 
        Transform(m,t,m);
        if s then begin
                    SetColor(15);
                        OutTextXY(GetMaxX div 2 - 45,400,'Press any key...');
                    ReadKey;
                    s := false;
                end
                else Delay(1500);
    end;
        SetColor(15);
        OutTextXY(GetMaxX div 2 - 45,400,'Press any key...');
        ReadKey;
    CloseGraph;
        ClrScr;
end;
 
begin
 
    scale := 100;
    assign(f,'figure.txt');
    reset(f);
    read(f,n,c,tmp1);
    for i := 0 to n - 1 do begin
        read(f,p[i].x,p[i].y,p[i].z);
        p[i].p := 1;
        p[i].x := p[i].x*scale;
        p[i].y := p[i].y*scale;
        p[i].z := p[i].z*scale;
    end;
    for i := 0 to c - 1 do begin
        read(f,lines[i,0]);
        for j := 1 to lines[i,0] do read(f,lines[i,j]);
        read(f,tmp1,tmp2,tmp3);
    end;
    close(f);
 
    t[0,0] := Cos(Pi/100);  t[0,1] := 0;  t[0,2] := -Sin(Pi/100);  t[0,3] := 0;
    t[1,0] := 0;            t[1,1] := 1;  t[1,2] := 0;             t[1,3] := 0;
    t[2,0] := Sin(Pi/100);  t[2,1] := 0;  t[2,2] :=  Cos(Pi/100);  t[2,3] := 0;
    t[3,0] := 0;            t[3,1] := 0;  t[3,2] := 0;             t[3,3] := 1;
        DrawFigure(3);
 
end.

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 01:47 10-02-2012 | Исправлено: A1exSun, 01:47 10-02-2012
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru