IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Крутящийся тор
SlazeR
сообщение 21.02.2006 0:22
Сообщение #1


Гость






Прошу помощи. Мне задали сделать тор крутящийся вокруг осей X, Y, Z. Я прочитал статью по 3д графике Altair'а и сделал, но вот проблема - у меня не только тор крутится, но и оси. То есть после поворотов по оси Z и к примеру Y, начинаешь крутить по Х, то он уже крутит под каким-то углом... Объяснить, как то очень сложно. Я говорил с Altair'ом по ICQ, он понял но так ничего и не выслал и не подсказал. Ещё раз прошу помощи, реально закон жизни и смерти, без этого курсовика мне не закрыть сессию.

Сама прога:

Program RotateTor;

uses
  Crt, Graph, Obj;

var
  GraphicDriver, GraphicMode, ErrorCode: Integer;
  rotate_x, rotate_y, rotate_z: Integer;
  Xan, Yan, Zan: Real;
  key: Char;
  Tor: TTor;

begin
  GraphicDriver:=InstallUserDriver('EGAVGA', @GraphicDriver);
  GraphicMode:=1;
  InitGraph(GraphicDriver, GraphicMode, '');
  ErrorCode:=GraphResult;
  if ErrorCode <> grOk then
  begin
    Writeln('Graphics error:');
    Writeln(GraphErrorMsg(ErrorCode));
    Writeln('Program aborted...');
    Halt(1);
  end;
  rotate_x:=0;
  rotate_y:=0;
  rotate_z:=0;
  Xan:=0;
  Yan:=0;
  Zan:=0;
  Tor.Create(GetMaxX div 2, GetMaxY div 2, 0, 80, 20);
  Tor.Draw(0,0,0);
  Flip;
  repeat
    if keypressed then
    begin
      key:=readkey;
      if key='z' then
        begin
	  if rotate_z=0 then
            rotate_z:=-1;
	  if rotate_z=1 then
            rotate_z:=0;
        end;
      if key='a' then
        begin
	  if rotate_z=0 then
            rotate_z:=1;
	  if rotate_z=-1 then
            rotate_z:=0;
        end;
      if key=#0 then
      begin
        key:=ReadKey;
        if key=#75 then
        begin
	  if rotate_y=0 then
            rotate_y:=-1;
	  if rotate_y=1 then
            rotate_y:=0;
        end;
        if key=#77 then
        begin
	  if rotate_y=0 then
            rotate_y:=1;
	  if rotate_y=-1 then
            rotate_y:=0;
        end;
        if key=#72 then
        begin
	  if rotate_x=0 then
            rotate_x:=-1;
	  if rotate_x=1 then
            rotate_x:=0;
        end;
        if key=#80 then
        begin
	  if rotate_x=0 then
            rotate_x:=1;
	  if rotate_x=-1 then
            rotate_x:=0;
        end;
      end;
    end;
    if rotate_y=-1 then
      if (Yan > 0) and (Yan <= 360) then
        Yan:=Yan-10
      else
        Yan:=350;
    if rotate_y=1 then
        if (Yan >= 0) and (Yan < 350) then
          Yan:=Yan+10
        else
          Yan:=0;
    if rotate_x=-1 then
      if (Xan > 0) and (Xan <= 360) then
        Xan:=Xan-10
      else
        Xan:=350;
    if rotate_x=1 then
      if (Xan >= 0) and (Xan < 350) then
        Xan:=Xan+10
      else
        Xan:=0;
    if rotate_z=-1 then
      if (Zan > 0) and (Zan <= 360) then
        Zan:=Zan-10
      else
        Zan:=350;
    if rotate_z=1 then
      if (Zan >= 0) and (Zan < 350) then
        Zan:=Zan+10
      else
        Zan:=0;
    Tor.Draw(Xan, Yan, Zan);
    OutTextXY(5, 5, 'To rotate on x press up, down cursor key. X Angle: '+IntToStr(Xan));
    OutTextXY(5, 20, 'To rotate on y press left, right cursor key. Y Angle: '+IntToStr(Yan));
    OutTextXY(5, 35, 'To rotate on z press "a", "z" key button. Z Angle: '+IntToStr(Zan));
    Flip;
    delay(3000);
  until key=#13;
  closegraph;
end.



Модуль Obj:

unit Obj;

interface

uses
  Graph;

const
  Rad=Pi/180;
  Page: Word=0;

  function IntToStr(I: Real): String;
  procedure Flip;

type
  TPixel = object
  private
    x, y, z: Integer;
    screen_x, screen_y, screen_z: Real;
  public
    constructor Create(x_, y_, z_: Integer);
    destructor Destroy; virtual;

    procedure Calc(Xan, Yan, Zan: Real); virtual;
    procedure Draw(Xan, Yan, Zan: Real); virtual;
  end;

  TTor = object(TPixel)
  private
    r, r_center: Real;
  public
    constructor Create(x_, y_, z_: Integer; r_, r_center_: Real);
    destructor Destroy; virtual;

    procedure Calc(Xan, Yan, Zan: Real); virtual;
    procedure Draw(Xan, Yan, Zan: Real); virtual;

    function GetRadius: Real;
  end;

implementation

  function IntToStr;
  var
    S: string[11];
  begin
    Str(I:3:0, S);
    IntToStr := S
  end;

  procedure Flip;
  begin
    SetVisualPage(Page);
    Page:=1-Page;
    SetActivePage(Page);
  end;

  constructor TPixel.Create;
  begin
    x:=x_;
    y:=y_;
  end;

  destructor TPixel.Destroy;
  begin
    {no code}
  end;

  procedure TPixel.Calc;
  var
    x_temp, y_temp, z_temp: Real;
  begin
    y_temp:=screen_y*cos(Xan*Rad)-screen_z*sin(Xan*Rad);
    z_temp:=screen_y*sin(Xan*Rad)+screen_z*cos(Xan*Rad);
    screen_y:=y_temp;
    screen_z:=z_temp;
    x_temp:=screen_x*cos(Yan*Rad)-screen_z*sin(Yan*Rad);
    z_temp:=screen_x*sin(Yan*Rad)+screen_z*cos(Yan*Rad);
    screen_x:=x_temp;
    screen_z:=z_temp;
    x_temp:=screen_x*cos(Zan*Rad)-screen_y*sin(Zan*Rad);
    y_temp:=screen_x*sin(Zan*Rad)+screen_y*cos(Zan*Rad);
    screen_x:=x_temp;
    screen_y:=y_temp;
  end;

  procedure TPixel.Draw;
  begin
    ClearDevice;
    Calc(Xan, Yan, Zan);
    putpixel(x,y,5);
  end;

  constructor TTor.Create;
  var
    i: Integer;
  begin
    x:=x_;
    y:=y_;
    z:=z_;
    r:=r_;
    r_center:=r_center_;
  end;

  destructor TTor.Destroy;
  begin
    {no code}
  end;

  procedure TTor.Calc;
  var
    x_temp, y_temp, z_temp: Real;
  begin
    y_temp:=screen_y*cos(Xan*Rad)-screen_z*sin(Xan*Rad);
    z_temp:=screen_y*sin(Xan*Rad)+screen_z*cos(Xan*Rad);
    screen_y:=y_temp;
    screen_z:=z_temp;
    x_temp:=screen_x*cos(Yan*Rad)-screen_z*sin(Yan*Rad);
    z_temp:=screen_x*sin(Yan*Rad)+screen_z*cos(Yan*Rad);
    screen_x:=x_temp;
    screen_z:=z_temp;
    x_temp:=screen_x*cos(Zan*Rad)-screen_y*sin(Zan*Rad);
    y_temp:=screen_x*sin(Zan*Rad)+screen_y*cos(Zan*Rad);
    screen_x:=x_temp;
    screen_y:=y_temp;
  end;

  procedure TTor.Draw;
  var
    i, Angle: Integer;
    r_temp: Real;
  begin
    ClearDevice;
    r_temp:=(r-r_center);
    for Angle:=0 to 90 do
    begin
      screen_x:=r_temp*(cos(Angle*4*Rad)-sin(Angle*4*Rad));
      screen_y:=r_temp*(sin(Angle*4*Rad)+cos(Angle*4*Rad));
      screen_z:=z;
      Calc(Xan, Yan, Zan);
      SetColor(5);
      circle(x+round(screen_x), y+round(screen_y), round(r_temp/2));
    end;
  end;

  function TTor.GetRadius;
  begin
    GetRadius:=r;
  end;

end.

 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 25.07.2025 2:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"